Showing posts with label javascript. Show all posts
Showing posts with label javascript. Show all posts

Saturday 10 June 2017

Cara Menggunakan Library Fullcalendar 1 -javascript

Pada posting kali ini hanya akan memaparkan bagaimana menampilkan Fullcalendar di localhost. Fullcalendar dapat berguna untuk menampilkan kalender kegiatan. Sehingga jadwal kegiatan dapat dimonitoring dengan visualisasi yang menarik. Fullcalendar saya gunakan untuk memenejemen pekerjaan kantor yang mana banyak pegawai dan pekerjaan. Sehingga tidak ada tumpang tindih dan pekerjaan dapat lebih dibagi dengan merata.

link fullcalendar:
https://fullcalendar.io/

1. fullcalendar dapat didownload:
https://github.com/fullcalendar/fullcalendar/releases

2. ektrak ke direktori (saya membuat new folder kalender pada localhost/htdocs)

3. kemudian akses demonya dengan link
http://localhost/kalender/demos/default.html


hasil:
Mempelajari fullcalendar dapat menggunakan dokumentasi  situs resminya dan dapat melihat source code demos nya

hasil implementasi sementara yang telah saya buat:



Nantikan tutorial selanjutnya
selamat bereksperimen dan terimakasih..



Sunday 30 April 2017

Menggunakan Library JavaScript SheetJS untuk Membaca File excel xls / xlsx



Gambar 1. Web Sheet JS


Siapa yang tak kenal Microsoft Excel ?  
Aplikasi pengolahan data yang berjalan diplatform windows dan android yang anak SD pun juga tahu. Karena disekolah diajarkan penggunaan excel maka tak heran jika hampir disetiap lini dunia pengolahan data kebanyakan menggunakan excel. Keberadaan Microsoft Excel juga didukung dengan ketersedian komputer windows yang mudah dijangkau oleh berbagai kalangan entah dari sisi UI/UX , harga, dan ketersediaan dipasar.  

Jika ada pertanyaan > bagaimana membuat tabel dengan komputer ? Microsoft Excel lah jawabannya


Oleh karena itu jika aplikasi yang kita buat ingin dapat membaca data berupa tabel dari user, tentu cara terbaik aplikasi tersebut dibuat untuk dapat membaca file excel.

SheetJS adalah contoh libary javascript yang mampu untuk mebaca file excel
link:


Berikut link demonya:
dan

Source codeny dapat dowload di github:
dan


setalah didownload extrak zipnya pada xampp lalu buka link /sesuaikan
atau


hasil run dari localhost (yang sebagian fungsiny sudah saya remove/delete jadi tampilan sedikit beda)

GIFF 1. Hasil run


Selamat bereksperimen
Sekian dan Terimakasih


Saturday 8 April 2017

Menggunakan Sampel Kode Database Firebase Berbasis Web

Gambar 1. Logo firebase


Untuk dapat menggunakan firebase dengan fasih tidak ada salahnya dengan mencoba menjalankan kode sampel dahulu, Kode sampel tersebut sudah disediakan oleh google kita hanya perlu copy dan paste. Ketika sudah berjalan kita dapat pelajari kode tersebut dan mensederhanakan / menyesuaikannya dengan program yang akan kita buat.

1. link kode sampel:
https://github.com/firebase/quickstart-js

download kode tersebut lalu ekstrak pada xampp localhost/htdocs (jngn lupa start apache dan mysql)
Gambar 2. Download Sampel Kode

2. buka dengan url: http://localhost/quickstart-js-master/database/

Gambar 3. Halaman depan sampel Kode

3. kita belum dapat sign, 
untuk menggunakan layanan firebase kita perlu mendaftar
cara mendaftar bisa lihat:

4. Setelah selesai mendaftarkan kita pilih Add Firebase to your web app
Gambar 4. Add firebase to your web app


5. Kemudian pilih copy seperti gambar 5

Gambar 5. Api key

6. buka dengan kode editor  C:\xampp\htdocs\quickstart-js-master\database\index.html 
kemudian copy api key yang telah di copy tadi ke index.html dibaris seperti gambar 6.

Gambar 6. Paste Api Key

7. Kemudian simpan

8. Aktifkan otentifikasi google caranya enable  google authentication seperti gambar 7



Gambar 7. Enable  google authentication


9. Atur rules database seperti gambar 8
 kemudian publish

Gambar 8. Atur rules database





Sampel Kode sudah bisa dijalankan
buka lagi
http://localhost/quickstart-js-master/database/

hasil menjalankan aplikasi:
Gambar 9. Hasil sampel kode



Silahkan pelajari kode tersebut dan sesuaikan dengan kebutuhan aplikasi web anda


Sekian dan terimakasih


Saturday 14 January 2017

Mengenal Game Main Tenis Kaskus

GIF 1. Main tenis kaskus

Game main tenis pada kaskus ditemui pada saat kaskus sedang sedang maintenance. Dulu saat masih kuliah salah seorang teman saya pernah meceletukkan game ini menggunakan teknologi ajax. Waktu itu saya masih belum mengerti apa itu ajax, jadi cman bisa mengangguk. Ternyata game tersebut tidak menggunakan teknologi ajax namun javascript biasa,

Jika kita buka source code nya ada maintenis.js disana disebutkan bahwa game berasal dari game pong yang telah dimodifikasi tampilannya

source code aslinnya bisa lihat disini


Sekian dan terimakasih



Friday 13 January 2017

Membuat Virtual Reality / VR Visualisasi Data - Three.js



Pada postingan kali ini merupakan source code tambahan dari yang ada diblog :

http://www.storybench.org/how-to-make-a-simple-virtual-reality-data-visualization
https://github.com/rogerkenny/3D-chart-tutorial/archive/master.zip


Download  dan jalankan sourcode zip diatas sebelum  jalankan source code yang ada di postingan ini..

Source code yang sudah ada tambahan kode:

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>3D chart!</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
    <style>
      body {
        margin: 0px;
        overflow: hidden;
      }
      #container {
        position: absolute;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
      }
    </style>
  </head>
  <body>
    <div id="container"></div>

  <script src="js/third-party/threejs/three.js"></script>
<!--<script src="js/third-party/threejs/StereoEffect.js"></script>
  <script src="js/third-party/threejs/DeviceOrientationControls.js"></script>-->
  <script src="js/third-party/threejs/OrbitControls.js"></script>
  <script src="js/optimer_bold.typeface.js"></script>
  <script src="js/optimer_regular.typeface.js"></script>
  <script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>

  <script>
    var camera, scene, renderer;
    var effect, controls;
    var element, container;
    var marginbottom = 4, chartwidth = 50, chartheight = 30; //3D units
    var xscale = d3.scale.linear().range([-chartwidth/2, chartwidth/2]),
        yscale = d3.scale.linear().range([0, chartheight]);


    var clock = new THREE.Clock();

    init();
    animate();

    function init() {
      renderer = new THREE.WebGLRenderer();
      element = renderer.domElement;
      container = document.getElementById('container');
      container.appendChild(element);

      // effect = new THREE.StereoEffect(renderer);

      scene = new THREE.Scene();

      camera = new THREE.PerspectiveCamera(90, 1, 0.001, 700);
      camera.position.set(0, 15, 30);
      scene.add(camera);

      controls = new THREE.OrbitControls(camera, element);
      controls.rotateUp(Math.PI / 4);
      controls.target.set(
        camera.position.x,
        camera.position.y + 0.1,
        camera.position.z - 0.1
      );
      controls.noZoom = true;
      controls.noPan = true;

      function setOrientationControls(e) {
        if (!e.alpha) {
          return;
        }

        controls = new THREE.DeviceOrientationControls(camera, true);
        controls.connect();
        controls.update();

        element.addEventListener('click', fullscreen, false);

        window.removeEventListener('deviceorientation', setOrientationControls, true);
      }
      window.addEventListener('deviceorientation', setOrientationControls, true);


      var light = new THREE.HemisphereLight(0x777777, 0x000000, 0.6);
      scene.add(light);

      var objlight = new THREE.PointLight(0xffffff, 0.7);
      objlight.position.set(0, 50, 70);
      scene.add(objlight);


 var light = new THREE.HemisphereLight(0x777777, 0x000000, 0.6);
      scene.add(light);

      var objlight = new THREE.PointLight(0xffffff, 0.7);
      objlight.position.set(70, 50, 0);
      scene.add(objlight);



      var texture = THREE.ImageUtils.loadTexture(
        'textures/patterns/yellowchecker.png'
      );
      texture.wrapS = THREE.RepeatWrapping;
      texture.wrapT = THREE.RepeatWrapping;
      texture.repeat = new THREE.Vector2(50, 50);
      texture.anisotropy = renderer.getMaxAnisotropy();

      spectexture = THREE.ImageUtils.loadTexture(
        'textures/patterns/blacklinegrid.png'
      );
      spectexture.wrapS = THREE.RepeatWrapping;
      spectexture.wrapT = THREE.RepeatWrapping;
      spectexture.repeat = new THREE.Vector2(50, 50);
      spectexture.anisotropy = renderer.getMaxAnisotropy();

      var material = new THREE.MeshPhongMaterial({
        color: 0xffffff,
        specular: 0xffffff,
        shininess: 5,
        shading: THREE.FlatShading,
        map: texture,
        specularMap: spectexture
      });

      var geometry = new THREE.PlaneGeometry(1000, 1000);

      var mesh = new THREE.Mesh(geometry, material);
      mesh.rotation.x = -Math.PI / 2;
      scene.add(mesh);

      window.addEventListener('resize', resize, false);
      setTimeout(resize, 1);

      /////// START CONTENT HERE ////////

      d3.csv('data3.csv', population, function(data){
        xscale.domain([0, data.length - 1]);
        yscale.domain([0, d3.max(data, function(d){ return d.all; })]);

        var columnwidth = (chartwidth / data.length);
        columnwidth -= columnwidth * 0.1;

        var columnmaterial = new THREE.MeshPhongMaterial({
          color: "#0000ff",
          emissive: "#000000"
        });


        data.forEach(function(d, i, a){
          var colheight = yscale(d.all);
          var columngeo = new THREE.BoxGeometry(1, colheight, 1);
          var columnmesh = new THREE.Mesh(columngeo, columnmaterial);
           columnmesh.rotation.y = Math.PI / 2;
          columnmesh.position.set(xscale(i), colheight/2 + marginbottom,0 ); //Box geometry is positioned at its’ center, so we need to move it up by half the height

          scene.add(columnmesh);
        });

        yscale.ticks(5).forEach(function(t, i, a){
          //Draw label
          var label = createType({text: "" + (t/1000000), size: 1.5});
          var xOffset = ( label.geometry.boundingBox.max.x - label.geometry.boundingBox.min.x );
          label.position.set(-50/2 - xOffset - 2.5, yscale(t) + marginbottom - 0.5, 0);
          scene.add(label);

          //Draw lin
                    var lineGeometry = new THREE.Geometry();
          var vertArray = lineGeometry.vertices;
          vertArray.push( new THREE.Vector3(-chartwidth/2 - 1.5, yscale(t) + marginbottom, 0),
                          new THREE.Vector3(chartwidth/2, yscale(t) + marginbottom, 0) );
          lineGeometry.computeLineDistances();
          var lineMaterial = new THREE.LineBasicMaterial( { color: 0xaaaaaa } );
          var line = new THREE.Line( lineGeometry, lineMaterial );
          scene.add(line);

        });

      });

      function population(d) {
        d.all = +d.all;
        d.male = +d.male;
        d.female = +d.female;
        return d;
      }

      var title = createType({text: "Judul 1 2 3 4",size: 2});
      title.position.set(-chartwidth/2-5, chartheight + 10, -5);
      scene.add(title);

      var xzerolabel = createType({text: "0 years old", size: 1.5});
      xzerolabel.position.set(-chartwidth/2 - 1, 2, 0);
      scene.add(xzerolabel);

      var x100label = createType({text: "100+ years old", size: 1.5});
      var xOffset = ( x100label.geometry.boundingBox.max.x - x100label.geometry.boundingBox.min.x );
      x100label.position.set(chartwidth/2 - xOffset, 2, 0);
      scene.add(x100label);

      var srctext = createType({text: "Sauce: U.S. Census", size: 1});
      var xOffset = 0.5 * ( x100label.geometry.boundingBox.max.x - x100label.geometry.boundingBox.min.x );
      srctext.position.set(0 - xOffset, 1, 0);
      scene.add(srctext);
///
  d3.csv('data3.csv', population, function(data){
        xscale.domain([0, data.length - 1]);
        yscale.domain([0, d3.max(data, function(d){ return d.all; })]);

        var columnwidth = (chartwidth / data.length);
        columnwidth -= columnwidth * 0.1;

        var columnmaterial = new THREE.MeshPhongMaterial({
          color: "#0000ff",
          emissive: "#000000"
        });


        data.forEach(function(d, i, a){
          var colheight = yscale(d.all);
          var columngeo = new THREE.BoxGeometry(1, colheight, 1);
          var columnmesh = new THREE.Mesh(columngeo, columnmaterial);
           columnmesh.rotation.y = Math.PI / 2;
          columnmesh.position.set(xscale(25), colheight/2 + marginbottom,5+i*2 ); //Box geometry is positioned at its’ center, so we need to move it up by half the height

          scene.add(columnmesh);
        });
    yscale.ticks(5).forEach(function(t, i, a){
          //Draw label
          var label = createType({text: "" + (t/1000000), size: 1.5});
          var xOffset = ( label.geometry.boundingBox.max.x - label.geometry.boundingBox.min.x );
          label.position.set(-50/2 - xOffset - 2.5, yscale(t) + marginbottom - 0.5, 0);
          scene.add(label);

          //Draw lin
                    var lineGeometry = new THREE.Geometry();

          var vertArray = lineGeometry.vertices;
          vertArray.push( new THREE.Vector3(32, yscale(t) + marginbottom, -chartwidth/2 - 1.5+30),
                          new THREE.Vector3(32, yscale(t) + marginbottom, chartwidth/2+25) );
          lineGeometry.computeLineDistances();
          var lineMaterial = new THREE.LineBasicMaterial( { color: 0xaaaaaa } );
          var line = new THREE.Line( lineGeometry, lineMaterial );
        //  line.rotation.y = Math.PI / 3.14;
          scene.add(line);

        });

    });

    d3.csv('data3.csv', population, function(data){
        xscale.domain([0, data.length - 1]);
        yscale.domain([0, d3.max(data, function(d){ return d.all; })]);

        var columnwidth = (chartwidth / data.length);
        columnwidth -= columnwidth * 0.1;

        var columnmaterial = new THREE.MeshPhongMaterial({
          color: "#0000ff",
          emissive: "#000000"
        });


        data.forEach(function(d, i, a){
          var colheight = yscale(d.all);
          var columngeo = new THREE.BoxGeometry(1, colheight, 1);
          var columnmesh = new THREE.Mesh(columngeo, columnmaterial);
           columnmesh.rotation.y = Math.PI / 2;
          columnmesh.position.set(xscale(22-i), colheight/2 + marginbottom,60); //Box geometry is positioned at its’ center, so we need to move it up by half the height

          scene.add(columnmesh);
        });
    yscale.ticks(5).forEach(function(t, i, a){
          //Draw label
          var label = createType({text: "" + (t/1000000), size: 1.5});
          var xOffset = ( label.geometry.boundingBox.max.x - label.geometry.boundingBox.min.x );
          label.position.set(-50/2 - xOffset - 2.5, yscale(t) + marginbottom - 0.5, 0);
          scene.add(label);

          //Draw lin
                    var lineGeometry = new THREE.Geometry();
          var vertArray = lineGeometry.vertices;
          vertArray.push( new THREE.Vector3(-chartwidth/2 - 1.5, yscale(t) + marginbottom, 60),
                          new THREE.Vector3(chartwidth/2-0, yscale(t) + marginbottom, 60) );
          lineGeometry.computeLineDistances();
          var lineMaterial = new THREE.LineBasicMaterial( { color: 0xaaaaaa } );
          var line = new THREE.Line( lineGeometry, lineMaterial );
          scene.add(line);

        });

    });
 d3.csv('data3.csv', population, function(data){
        xscale.domain([0, data.length - 1]);
        yscale.domain([0, d3.max(data, function(d){ return d.all; })]);

        var columnwidth = (chartwidth / data.length);
        columnwidth -= columnwidth * 0.1;

        var columnmaterial = new THREE.MeshPhongMaterial({
          color: "#0000ff",
          emissive: "#000000"
        });


        data.forEach(function(d, i, a){
          var colheight = yscale(d.all);
          var columngeo = new THREE.BoxGeometry(1, colheight, 1);
          var columnmesh = new THREE.Mesh(columngeo, columnmaterial);
           columnmesh.rotation.y = Math.PI / 2;
          columnmesh.position.set(xscale(0), colheight/2 + marginbottom,50-i*2 ); //Box geometry is positioned at its’ center, so we need to move it up by half the height

          scene.add(columnmesh);
        });
    yscale.ticks(5).forEach(function(t, i, a){
          //Draw label
          var label = createType({text: "" + (t/1000000), size: 1.5});
          var xOffset = ( label.geometry.boundingBox.max.x - label.geometry.boundingBox.min.x );
          label.position.set(-50/2 - xOffset - 2.5, yscale(t) + marginbottom - 0.5, 0);
          scene.add(label);

          //Draw lin
                    var lineGeometry = new THREE.Geometry();

          var vertArray = lineGeometry.vertices;
          vertArray.push( new THREE.Vector3(-25, yscale(t) + marginbottom, -chartwidth/2 - 1.5+33),
                          new THREE.Vector3(-25, yscale(t) + marginbottom, chartwidth/2+27) );
          lineGeometry.computeLineDistances();
          var lineMaterial = new THREE.LineBasicMaterial( { color: 0xaaaaaa } );
          var line = new THREE.Line( lineGeometry, lineMaterial );
        //  line.rotation.y = Math.PI / 3.14;
          scene.add(line);

        });

    });
}

    function resize() {
      var width = container.offsetWidth;
      var height = container.offsetHeight;

      camera.aspect = width / height;
      camera.updateProjectionMatrix();

      renderer.setSize(width, height);
      // effect.setSize(width, height);
    }

    function update(dt) {
      resize();

      camera.updateProjectionMatrix();

      controls.update(dt);
    }

    function render(dt) {
      renderer.render(scene, camera);
      // effect.render(scene, camera);
    }

    function animate(t) {
      requestAnimationFrame(animate);

      update(clock.getDelta());
      render(clock.getDelta());
    }

    function fullscreen() {
      if (container.requestFullscreen) {
        container.requestFullscreen();
      } else if (container.msRequestFullscreen) {
        container.msRequestFullscreen();
      } else if (container.mozRequestFullScreen) {
        container.mozRequestFullScreen();
      } else if (container.webkitRequestFullscreen) {
        container.webkitRequestFullscreen();
      }
    }

    function createType(options) {
        var height = options.height || 0,
            size = options.size || 3,
            material = new THREE.MeshFaceMaterial( [
              new THREE.MeshPhongMaterial( { color: 0xffffff, shading: THREE.FlatShading } ), // front
              new THREE.MeshPhongMaterial( { color: 0xffffff, shading: THREE.SmoothShading } ) // side
            ] ),
            text = options.text || "Test";

      var textGeo = new THREE.TextGeometry( text, {

          size: size,
          height: height,
          curveSegments: 4,

          font: "optimer",
          weight: "normal",
          style: "normal",

          bevelEnabled: false,

          material: 0,
          extrudeMaterial: 1

        });

        textGeo.computeBoundingBox();

        var textMesh1 = new THREE.Mesh( textGeo, material );

        return textMesh1;
    }
  </script>
  </body>
</html>


Bila source code tersebut dapat dipelajari  agar mengerti tentang  fungsi-fungsi pada three js misal position, rotate, dan menambah object.

Kurangi data dalam data.csv menjadi:

date,age,all,male,female
"January 1, 2000","0",3803453,1947719,1855734
"January 1, 2000","1",3816646,1951304,1865342
"January 1, 2000","2",3773178,1929817,1843361
"January 1, 2000","3",3840163,1963473,1876690
"January 1, 2000","4",3924534,2009608,1914926
"January 1, 2000","5",3984021,2040493,1943528
"January 1, 2000","6",4024543,2061740,1962803
"January 1, 2000","7",4134443,2117611,2016832
"January 1, 2000","8",4171709,2133163,2038546
"January 1, 2000","9",4264360,2185397,2078963
"January 1, 2000","10",4230386,2168849,2061537
"January 1, 2000","11",4093175,2096683,1996492
"January 1, 2000","12",4049448,2074088,1975360
"January 1, 2000","13",3991142,2043684,1947458
"January 1, 2000","14",4062456,2085078,1977378
"January 1, 2000","15",3993157,2051531,1941626
"January 1, 2000","16",3981264,2052133,1929131
"January 1, 2000","17",4075591,2105486,1970105
"January 1, 2000","18",3892332,1985635,1906697
"January 1, 2000","19",4146489,2093531,2052958
"January 1, 2000","20",3915141,1976777,1938364
"January 1, 2000","21",3712547,1872273,1840274
"January 1, 2000","22",3681044,1856205,1824839



Sekian dan terima kasih



Wednesday 30 November 2016

Menambahkan Highlight Pada Peta Menggunakan Leafletjs - Leaflet

Pada tutorial sebelumnya kita telah membuat peta tematik / choropleth https://komputasistat.blogspot.co.id/2016/11/membuat-peta-tematik-choropleth.html.
Bagaimana jika anda ingin menambahkan highlight pada saat event mouse mouseover atau mouse click ?

Langkah - langkah / cara membuat highlight polygon / daerah tertentu pada peta pada saat mouseover / mouse melintas


Gif 1. Mouseover / highlight



1. MIsal kita menggunakan peta yang bersumber dari tutorial sebelumnya
https://komputasistat.blogspot.co.id/2016/11/membuat-peta-tematik-choropleth.html

2. kemudian tambahkan kode:

Kode pengaturan pewarnaan saat hightlight. (anda dapat mengganti2 sesuai kebutuhan ) :

function highlightFeature(e) {
        var layer = e.target;

        layer.setStyle({
            weight: 5,   //ketebalan garis
            color: '#666', //warna garis
            dashArray: '', 
            fillOpacity: 0.7, //tingkat transparansi
            fillColor: "#2262CC" // warna polygon saat hightlight
        });

        if (!L.Browser.ie && !L.Browser.opera && !L.Browser.edge) {
            layer.bringToFront();
        }

        info.update(layer.feature.properties);
    }

Kode untuk me-reset style saat mouseut / cursor mouse sudah keluar polygon:

      function resetHighlight(e) {
        geojson.resetStyle(e.target);
        info.update();
    }

Mendefinisikan event apa saja yang ditambahkan (mouseover / mouseout): 
 function onEachFeature(feature, layer) {
        layer.on({
            mouseover: highlightFeature,
                mouseout: resetHighlight
            //click: zoomToFeature
        });
    }

agar libary menjalankan event yang sudah ditambahkan ( onEachFeature: onEachFeature)

geojson = L.geoJson(statesData, {
        style: getStyle,
        onEachFeature: onEachFeature
    }).addTo(m);

full code:

geojson = L.geoJson(statesData, {
        style: getStyle,
        onEachFeature: onEachFeature
    }).addTo(m);
 function onEachFeature(feature, layer) {
        layer.on({
            mouseover: highlightFeature,
                mouseout: resetHighlight
            //click: zoomToFeature
        });
    }
        function resetHighlight(e) {
        geojson.resetStyle(e.target);
        info.update();
    }
function highlightFeature(e) {
        var layer = e.target;

        layer.setStyle({
            weight: 5,
            color: '#666',
            dashArray: '',
            fillOpacity: 0.7,
            fillColor: "#2262CC"
        });

        if (!L.Browser.ie && !L.Browser.opera && !L.Browser.edge) {
            layer.bringToFront();
        }

        info.update(layer.feature.properties);
    }To(m);

Sekian dan terimakasih


tutorial ini diambil dari:
http://leafletjs.com/examples/choropleth/



Sunday 13 November 2016

Membuat Peta Tematik / Choropleth Menggunakan Leaflet JS -Leaflet

Latar Belakang:
Sebelumnya saya telah membuat halaman yang memaparkan bagaimana membuat peta tematik / choropleth menggunakan highmap /highcart (https://komputasistat.blogspot.co.id/2016/09/cara-menggunakan-highmap-highchart-dari.html). Library highmap dirancang untuk membuat chart menggunakan peta, mungkin hal ini yang membuat customization penampilan peta yang ditawarkan tidak selengkap pada leafletjs, openlayers dan googlemaps js api. Pada highmap js kita tidak dapat menggunakan marker, overlay peta, menghitung jarak dan masih banyak lagi.


NB: jika anda  bisa menggunakan highmap js untuk overlay peta, marker atau menghitung jarak, 
anda bisa berbagai melalui komen dibawah 



Pengertian:
Peta Tematik adalah peta yang menyajikan tema tertentu dan untuk kepentingan tertentu (land status, penduduk, transportasi dll.) dengan menggunakan peta rupabumi yang telah disederhanakan sebagai dasar untuk meletakkan informasi tematiknya. sumber: www.bakosurtanal.go.id/peta-tematik/

peta choropleth menurut oxforddictionaries:
A map which uses differences in shading, colouring, or the placing of symbols within predefined areas to indicate the average values of a particular quantity in those areas

Output pembuatan simple peta tematik / choropleth menggunakan leaflet JS:



Berikut cara / langkah-langkah pembuatan:

1. Sediakan peta format geojson (andai yang dimiliki shapefile, anda bisa di-convert menggunakan tutorial: https://komputasistat.blogspot.co.id/2016/09/menyederhanakan-shapefile-mengurangi.html kemudian https://komputasistat.blogspot.co.id/2016/09/mengubah-file-shapefile-shp-menjadi.html )

2. download library leaflet yang stable version : http://leafletjs.com/download.html

3.  tambahkan var statesData =  pada file geojson kemudian ubah ekstensi .geojson menjadi .js

contoh:

var statesData = {
"type": "FeatureCollection",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:EPSG::32752" } },
                                                                                                                                  
"features": [
{ "type": "Feature", "properties": { "PROV_NO": "91", "KABKOTA_NO": "04", "KEC_NO": "082", "PROVINSI": "PAPUA BARAT", "KABUPATEN": "TELUK BINTUNI", "name": "MOSKONA BARAT" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 920854.4638, 9808573.4569 ], [ 920844.7188, 9803744.8114 ], [ 916610.87150000036, 9795153.296599999 ], [ 886969.56340000033, 9795351.434699999 ], [ 888083.90670000017, 9800105.4276 ], [ 895102.50779999979, 9817186.651 ], [ 897339.73369999975, 9824566.3836 ], [ 918866.98230000027, 9824700.9452 ], [ 920862.4715, 9812634.3669 ], [ 920854.4638, 9808573.4569 ] ] ] ] } },
{ "type": "Feature", "properties": { "PROV_NO": "91", "KABKOTA_NO": "04", "KEC_NO": "040", "PROVINSI": "PAPUA BARAT", "KABUPATEN": "TELUK BINTUNI", "name": "WAMESA" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 1062393.7576, 9750061.2426 ], [ 1052194.9853, 9750487.1191 ], [ 1052709.9768, 9751706.9327 ], [ 1051484.575, 9753953.0294 ], [ 1051263.7623, 9759256.7755 ], 

4. Memaggil library dan sumber data peta dasar (bintuni4.js)

<link rel="stylesheet" href="leaflet.css" />
<script src="bintuni4.js"></script>
<script src="leaflet-src.js"></script>

5. membuat div map yang akan digunakan untuk menampilkan peta

<div id="map"></div>

6.  Menampilkan peta dasar dari mapbox

 var m = L.map('map').setView([-2.104146,133.522358], 8);

    L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpandmbXliNDBjZWd2M2x6bDk3c2ZtOTkifQ._QA7i5Mpkd_m30IGElHziw', {
        maxZoom: 18,
        attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, ' +
            '<a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' +
            'Imagery © <a href="http://mapbox.com">Mapbox</a>',
        id: 'mapbox.light'
    }).addTo(m);

7. Menampilkan peta dari Geojson dan memberian style

geojson = L.geoJson(statesData, {
        style: getStyle
    }).addTo(m);

8. Mendefinisikan getstyle. Fungsi getstyle berisi  tentang pewarnaan dan style peta
function getStyle(feature) {
  return {
    weight: 1,
    opacity: 1,
    color: '#fff',
    fillOpacity: 0.7,
    // fillColor: getColor(feature.properties.density)
    // TopoJSON used in this example doesn't have any data attributes
    // so throwing in some random colors
    fillColor:getColor(Math.random()*1000) 
  };
}

9.  Fungsi pembuatan legenda dan menentukan posisi legenda diletakan

var legend = L.control({position: 'bottomright'});

    legend.onAdd = function (map) {

        var div = L.DomUtil.create('div', 'info legend'),
            grades = [0, 10, 20, 50, 100, 200, 500, 1000],
            labels = [],
            from, to;

        for (var i = 0; i < grades.length; i++) {
            from = grades[i];
            to = grades[i + 1];

            labels.push(
                '<i style="background:' + getColor(from + 1) + '"></i> ' +
                from + (to ? '&ndash;' + to : '+'));
        }

        div.innerHTML = labels.join('<br>');
        return div;
    };

10. Fungsi menentukan warna apa yang digunakan

    function getColor(d) {
        return d > 1000 ? '#800026' :
                d > 500  ? '#BD0026' :
                d > 200  ? '#E31A1C' :
                d > 100  ? '#FC4E2A' :
                d > 50   ? '#FD8D3C' :
                d > 20   ? '#FEB24C' :
                d > 10   ? '#FED976' :
                            '#FFEDA0';
    }

11. definisi style:

    <style>
      html { height: 100% }
      body { height: 100%; margin: 0; padding: 0;}
      #map { width: 800px; height: 500px; }

      .info { padding: 6px 8px; font: 14px/16px Arial, Helvetica, sans-serif; background: white; background: rgba(255,255,255,0.8); box-shadow: 0 0 15px rgba(0,0,0,0.2); border-radius: 5px; } .info h4 { margin: 0 0 5px; color: #777; }
.legend { text-align: left; line-height: 18px; color: #555; } .legend i { width: 18px; height: 18px; float: left; margin-right: 8px; opacity: 0.7; }
    </style>


Full source code:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=1024, user-scalable=no">
    <style>
      html { height: 100% }
      body { height: 100%; margin: 0; padding: 0;}
      #map { width: 800px; height: 500px; }

      .info { padding: 6px 8px; font: 14px/16px Arial, Helvetica, sans-serif; background: white; background: rgba(255,255,255,0.8); box-shadow: 0 0 15px rgba(0,0,0,0.2); border-radius: 5px; } .info h4 { margin: 0 0 5px; color: #777; }
.legend { text-align: left; line-height: 18px; color: #555; } .legend i { width: 18px; height: 18px; float: left; margin-right: 8px; opacity: 0.7; }
    </style>
<link rel="stylesheet" href="leaflet.css" />
<script src="bintuni4.js"></script>
<script src="leaflet-src.js"></script>





    <title>Leaflet AJAX</title>
    </head>
    <body>
    <div id="map"></div>
      <script type="text/javascript">
    var m = L.map('map').setView([-2.104146,133.522358], 8);

    L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpandmbXliNDBjZWd2M2x6bDk3c2ZtOTkifQ._QA7i5Mpkd_m30IGElHziw', {
        maxZoom: 18,
        attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, ' +
            '<a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' +
            'Imagery © <a href="http://mapbox.com">Mapbox</a>',
        id: 'mapbox.light'
    }).addTo(m);





geojson = L.geoJson(statesData, {
        style: getStyle
    }).addTo(m);
 
function getStyle(feature) {
  return {
    weight: 1,
    opacity: 1,
    color: '#fff',
    fillOpacity: 0.7,
    // fillColor: getColor(feature.properties.density)
    // TopoJSON used in this example doesn't have any data attributes
    // so throwing in some random colors
    fillColor:getColor(Math.random()*1000) 
  };
}


m.attributionControl.addAttribution('Population data &copy; <a href="http://census.gov/">Ngasal doang</a>');


    var legend = L.control({position: 'bottomright'});

    legend.onAdd = function (map) {

        var div = L.DomUtil.create('div', 'info legend'),
            grades = [0, 10, 20, 50, 100, 200, 500, 1000],
            labels = [],
            from, to;

        for (var i = 0; i < grades.length; i++) {
            from = grades[i];
            to = grades[i + 1];

            labels.push(
                '<i style="background:' + getColor(from + 1) + '"></i> ' +
                from + (to ? '&ndash;' + to : '+'));
        }

        div.innerHTML = labels.join('<br>');
        return div;
    };


    function getColor(d) {
        return d > 1000 ? '#800026' :
                d > 500  ? '#BD0026' :
                d > 200  ? '#E31A1C' :
                d > 100  ? '#FC4E2A' :
                d > 50   ? '#FD8D3C' :
                d > 20   ? '#FEB24C' :
                d > 10   ? '#FED976' :
                            '#FFEDA0';
    }

    legend.addTo(m);


</script>


    </body>
</html>

NB: data diatas dmenggunakan data random


Sumber tutorial ini diambil dari http://leafletjs.com/examples/choropleth/ dengan sedikit pengubahan dan penambahan

Sekian dan Terima kasih
semoga bermanfaat


Monday 7 November 2016

Mengenal AngularJS


Ketika menulis tentang AngularJS pada tahun 2016, mungkin merupakan sesuatu kegiatan yang sudah terlambat. Namun saya tetap menulis karena sebelum tanggal 7 November 2016, saya hanya pernah mendengar namanya saja. Tulisan ini akan sedikit memaparkan angularjs.

AngularJS dikerjakan pertama kali oleh Miško Hevery (Pegawai Google) tahun 2009. AngularaJS 1.0 released tahun 2012. Google mendukung perkembangan Angular JS hingga sekarang.

AngularJS merupakan framework javascript. Saya baru mengetahui ternayata ada framework javascript karena biasanya framework yaa PHP atau JAVA.  AngularJS menerapkan MVC model, yaitu memisah antara penampilan, data dan logic. AngularJS hanya berjalan disisi klien tidak seperti Node js, sehingga fungsi utama AngularJS memanipulasi agar tampilan web menjadi interaktif. Banyak developer yang menggunakan AngularJS untuk mengembangkan single-page applications. Selain itu, AngularJS juga digunakan sebagai pelengkap Apache Cordova (Framework yang digunakan pembuatan aplikasi cross-platform seperti aplikasi Android).

Produk telah yang menggunakan AngularJS diantaranya YouTube Video Manager, situs The Weather Channel , beberapa produk Google, dan Tinder.

Keuntungan menggunakan AngularJS yaitu AgularJS merupakan framework yang opensource. Menurut  official web nya, framework ini dapat gabung/dikembangkan dengan library lain.

Ilmu basic AngularJS yang perlu dipelajari yaitu: directives, expressions, filters, modules, dan controllers. Sebelum belum belajar angularJS, tentu kamu harus memiliki pengetahuan basic HTML CSS dan JavaScript.

Salah satu sumber belajar AgularJS: AngularJS


sumber:
http://www.w3schools.com/angular/
https://en.wikipedia.org/wiki/AngularJS
https://www.codecademy.com/learn/learn-angularjs
https://www.tutorialspoint.com/angularjs/
https://angularjs.org/


Sekian dan Trimakasih...

Thursday 3 November 2016

Menggunakan ReactJS 1



Salah  satu fungsi ReactJS yaitu dapat memanipulasi tampilan. Fungsi ini akan terlihat saat kita ingin  mengubah nilai suatu element html. Mengubah element html dapat dilakukan menggunakan fungsi DOM yang ada pada javascript. Namun DOM pada javascript akan ribet (dari segi pengaturan alurnya) jika digunakan pada aplikasi yang besar atau sangat interaktif. Selain itu penggunaan DOM berlebihan akan mengurangi performa aplikasi. Contoh aplikasi yang ribet jika dibangun menggunakan DOM javascript yaitu sosial media (aplikasi yang dapat berintraksi banyak hal dengan user).

1, Virtual DOM
 Dari beberapa sumber yang dibaca ReactJS menggunakan Virtual DOM yang denger2 performanya lebih bak daripada DOM Javascript biasa
Jelasnya bisa dibaca:

2. JSX
Dengan menggunakan JSX, kita dapat menuliskan element html pada javascript. Penulisan element html pada javascipt membantu memperindah dari segi visualisasi kode daripada harus menggunakan string. 
asd
Bahanny dan contohnya bisa diambil dari:
https://github.com/facebook/react



contoh kode:

Penulisan dengan JSX harus mamanggil type="text/babel" pada script dan

Hasil:
Gambar 1. Hasil




Sekian dan Trimakasih





Tuesday 13 September 2016

Cara Menggunakan Highmap ( Highchart ) Dari Shapefile

Gambar 1. Gambar judul
Menampilkan chart peta menggunakan Higmap dari Highchart js ada dua cara. Cara pertama menggunakan geojson dan yang kedua file SVG. Pada kali ini kita akan mencoba menampilkan chart peta yang data peta nya bersumber dari geojson. Jika kita ingin menggunakan peta level provinsi kita akan dengan mudah menggunakan highchart tersebut, karena geojson telah disedikan high chart js. Namun bagaimana jika ingin menampilkan peta level kecamatan. Untuk menampilkan peta yang tidak disediakan dari highchart, kita dapat membuat atau miminta peta yang biasanya berformatkan shapefile 

Gambar 2. Proses dari dshapefile sampai peta ditampilkan menggunakan highmap
Sebelum diubah sebaiknya shapefile disederhanakan agar performance penampilan peta baik, karena terlalu banyak titik/point akan lebih membutuhkan waktu bagi browser untuk mengubah titik-titik tersebut menjadi peta/polygon:

Pada halaman sebelumnya kita pernah  mengubah Shapefile menjadi File Geojson:

Lalu sekarang ini bagaimana cara menampilkan file GeoJson menggunakan Highmap / Highchart

1. Perlu sedikit pengubahan nama variabel yang ada didalam geojson, yaitu dengan buka geojson dengan notepad/sublime find and replace nama variabel wilayah atau yang akan dijadikan. misal pada gambar 3 yang ingin ditampilkan nama kecamatan maka Kecamatan diubah menjadi name
Gambar 3. Find and replace menjadi name
2. Kopi kode dibawah dan sesuaikan dengan data yang dimiliki


<!DOCTYPE HTML>
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <title>Highmaps Example</title>

  <script type="text/javascript" src="jquery.min.js"></script>
  <style type="text/css">
#container {
    height: 500px; 
    min-width: 310px; 
    max-width: 800px; 
    margin: 0 auto; 
}
.loading {
    margin-top: 10em;
    text-align: center;
    color: gray;
}
  </style>
  <script type="text/javascript">
$(function () {

    // Prepare random data
    var data = [
        {
            "code": "082",
            "value": 710
        },
        {
            "code": "040",
            "value": 963
        },
        {
            "code": "021",
            "value": 541
        },
        {
            "code": "010",
            "value": 622
        },
        {
            "code": "053",
            "value": 866
        },
        {
            "code": "080",
            "value": 398
        },
        {
            "code": "023",
            "value": 785
        },
        {
            "code": "070",
            "value": 223
        },
        {
            "code": "091",
            "value": 362
        },
        {
            "code": "090",
            "value": 361
        },
        {
            "code": "100",
            "value": 237
        },
        {
            "code": "060",
            "value": 157
        },
        {
            "code": "020",
            "value": 134
        },
        {
            "code": "101",
            "value": 136
        },
        {
            "code": "052",
            "value": 704
        },
        {
            "code": "073",
            "value": 361
        },
        {
            "code": "081",
            "value": 237
        },
        {
            "code": "022",
            "value": 157
        },
        {
            "code": "071",
            "value": 134
        },
        {
            "code": "030",
            "value": 136
        },
        {
            "code": "072",
            "value": 704
        },
        {
            "code": "050",
            "value": 134
        },
        {
            "code": "051",
            "value": 136
        },
        {
            "code": "092",
            "value": 704
        }
    ];

    $.getJSON('Bintuni.geojson', function (geojson) {

        // Initiate the chart
        $('#container').highcharts('Map', {

            title : {
                text : 'GeoJSON in Highmaps'
            },

            mapNavigation: {
                enabled: true,
                buttonOptions: {
                    verticalAlign: 'bottom'
                }
            },

            colorAxis: {
            },

          
            series : [{
                data : data,
                mapData: geojson,
                joinBy: ['KEC_NO', 'code'],
                name: 'Random data',
                states: {
                    hover: {
                        color: '#BADA55'
                    }
                }
            }]
        });
    });
});
  </script>
 </head>
 <body>
<script src="highmaps.src.js"></script>
<script src="data.js"></script>
<script src="exporting.js"></script>



<div id="container" style="min-width: 310px; max-width: 400px"></div>

 </body>
</html>
ket:  
        a) "code": "050",           Nilai dari variabel yang menjadi kode unik suatu wilayah pada geojson misal  kode kecamatan. Dalam contoh Kec_No    
       b)  joinBy: ['KEC_NO', 'code'],     KEC_NO mendeklarasikan kode unik seperti yang disebutkan pada poin a)        
        c) "value": 704              Nilai dari wilayah tersebut sehinga menghasilkan warna2/ choropleth 


3. Highmap,js dan kawan-kawannya dapat didownload disini:
http://www.highcharts.com/download


Sekian dan Trimakasih