วันศุกร์ที่ 16 ธันวาคม พ.ศ. 2559

วิธีเรียก Service จาก ArcGIS Server โดยใช้โปรแกรม QGIS แบบที่ 2

ก่อนหน้านี้ผมเคยเขียนวิธีการเรียก service จาก ArcGIS Server เข้ามาในโปรแกรม QGIS แต่ขั้นตอนมันจะซับซ้อนนิดหน่อย ดูวิธีที่ 1 และหลังจากนั้นผมก็เขียนปลั๊กอินเข้ามาใช้เองและคิดว่ามันน่าจะมีปุ่มเพิ่มให้ในโปรแกรมเองเลย ซึ่งเห็นใน mailing list เขาคุยกันพักนึง แล้วก็มีปุ่มนี้ขึ้นมาให้เราใช้แล้ว :)

ซึ่งตัวอย่างของผมนี้ ได้ลองเรียก service จาก ArcGIS Server ของกรมพัฒนาที่ดิน ซึ่งเป็นชั้นข้อมูลภาพถ่ายออร์โธสี ที่มีให้บริการผ่านเครือข่ายอินเตอร์เน็ต

http://eis.ldd.go.th/lddeis/PLM.aspx

1. ไปที่เมนู Layer > Add Layer > Add ArcGIS MapServer Layers...

2. คลิกปุ่ม New และระบุดังนี้ แล้วคลิก OK
2.1 Name: ldd ortho (ตั้งชื่อ อะไรก็ได้)
2.2 URL: http://eis.ldd.go.th/ArcGIS/rest/services/LDD_RASTER_WM_CACHE/MapServer



 3. คลิก Connect และเลือก Layer และคลิกปุ่ม Add

 4. จะได้ดังภาพด้านล่าง

*** ขอขอบคุณ service จากกรมพัฒนาที่ดิน มา ณ ที่นี้ด้วยครับ

วันพุธที่ 19 ตุลาคม พ.ศ. 2559

Geoserver with Image mosaicking plugin

_______สำหรับผู้ที่สนใจในงานด้าน Internet GIS หลายคนคงเคยคิดว่าจะทำอย่างไรดี จะให้ข้อมูลที่เป็น basemap อย่างเช่น ข้อมูลภาพดาวเทียม ภาพถ่ายทางอากาศ ทั่วทั้งพื้นที่ที่เราต้องการ เพราะว่าไฟล์ขนาดใหญ่มากจึงทำให้มีปัญหาในการต่อภาพ (mosaic) ดังนั้นผมจึงแนะนำอีกวิธีหนึ่งที่ง่ายในการทำโดยใช้ "Image mosaicking plugin" ของ GeoServer โดยการทำดังต่อไปนี้

1. เตรียมข้อมูลภาพที่ต้องการจะแสดงผล และจะเปิดข้อมูลนั้นด้วย QGIS :)

2. Copy Data ไปยัง dir ของ Geoserver

3. ทำการสร้าง Layers >> โดยใช้ ImageMosaic

4. ทำการ Publish

5. Click Layer Preview


Download Data Example : Click
Reference:http://docs.geoserver.org/latest/en/user/tutorials/image_mosaic_plugin/imagemosaic.html

วันอังคารที่ 18 ตุลาคม พ.ศ. 2559

วิธีเรียก Service จาก ArcGIS Server โดยใช้โปรแกรม QGIS

_______หลายๆ คนเคยอยากที่จะต้องการเรียก service จาก arcgis server หรือ arcgis onine บนโปรแกรม QGIS ซึ่งเราก็สามารถทำได้ 2 วิธีโดยใช้ Python Console และอีกแบบก็จะใช้ GDAL/OGR ครับ
วิธีที่ 1 Python Console
1. In the QGIS Python console ไปที่ Plugins >> Python console
2. จากนั้นก็พิมพ์ qgis.utils.iface.addRasterLayer("http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer?f=json&pretty=true","esriLayer")


วิธีที่ 2 GDAL/OGR (gdal_translate)
1.ก็พิมพ์ลงใน terminal => gdal_translate "http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer?f=json&pretty=true" esriStreetLayer.xml -of WMS
2.จากนั้นจะได้ xml มาก็ให้ลากใส่ใน QGIS ได้เลยครับ



Reference : http://hub.qgis.org/wiki/quantum-gis/Arcgis_rest

วันศุกร์ที่ 14 ตุลาคม พ.ศ. 2559

การแสดงข้อมูลแผนที่จาก PostGIS เป็น GeoJSON บน Leaflet

_______การแสดงข้อมูลแผนที่บน Leaflet นั้น ข้อมูลส่วนใหญ่จะอยู่ในรูปแบบ GeoJSON แต่ทีนี้ข้อมูลของผมเองนี้ดันอยู่ในรูปแบบของ Database ที่เป็นแบบ PostGIS ซึ่งข้อมูลจะเป็นลักษณะของตารางและเก็บค่า Geometry ไว้ อ้าวแล้วยังงี้จะต้องทำอย่างไรถึงจะแสดงบน Leaflet ได้หล่ะ ไม่ยากเลยครับเราเพียงแค่ใช้ PHP แปลงข้อมูลของเราให้อยู่ในรูปแบบ GeoJSON เท่านั้นเอง สามารถเข้าไปดูได้ที่ GitHub ของผมเองได้ครับ ไปดูกันเลยว่าทำอย่างไร

ตัวอย่างจาก GitHub ดัง URL ด้านล่าง
https://gist.github.com/sanchangon/24058c407ab051dc5f72fa5fdbadc0ac

1. ไฟล์ healthcenter.html ที่ใช้แสดงแผนที่
<html>
<!--
 * Name: Leafletjs connect php-geojson through postgis spatial database   
 * Purpose: GIST@NU (www.cgistln.nu.ac.th)
 * Date: 2016/10/13
 * Author: Chingchai Humhong (chingchaih@nu.ac.th)
 * Acknowledgement: 
 !-->
<head>
<link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.css"/>
<script src="http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.js"></script>
<script src="http://code.jquery.com/jquery-1.11.3.min.js"></script>
</head>
<body>
<div id="map" style="width: 100%; height: 800px;"></div>
<script type="text/javascript">
var map = L.map('map');
var OpenStreetMap_BlackAndWhite = L.tileLayer('http://{s}.tiles.wmflabs.org/bw-mapnik/{z}/{x}/{y}.png', {
maxZoom: 18,
attribution: '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
});
    
OpenStreetMap_BlackAndWhite.addTo(map);
map.setView([17.05, 100.25], 9);
function addDataToMap(data, map) {
    var dataLayer = L.geoJson(data, {
        onEachFeature: function(feature, layer) {
            var popupText = "hospital name: " + feature.properties.name
                + "<br>hospital code: " + feature.properties.maincode;
                //+ "<br><a href='" + feature.properties.url + "'>More info</a>";
            layer.bindPopup(popupText); }
        });
    dataLayer.addTo(map);
}
$.getJSON("healthcenter.php", function(data) { addDataToMap(data,map); });
</script>
</body>
</html>

2. ไฟล์ healthcenter.php ที่ใช้ในการแปลงเป็น GeoJSON
<?php
//-------------------------------------------------------------
// * Name: PHP-PostGIS2GeoJSON  
// * Purpose: GIST@NU (www.cgistln.nu.ac.th)
// * Date: 2016/10/13
// * Author: Chingchai Humhong (chingchaih@nu.ac.th)
// * Acknowledgement: 
//-------------------------------------------------------------
   // Database connection settings
  define("PG_DB"  , "database");
  define("PG_HOST", "localhost"); 
  define("PG_USER", "postgres");
  define("PG_PORT", "port"); 
  define("PG_PASS", "password"); 
  define("TABLE",   "table");
  
    // Retrieve start point
    // Connect to database
    $con = pg_connect("dbname=".PG_DB." host=".PG_HOST." port=".PG_PORT." password=".PG_PASS." user=".PG_USER);
    $sql = "select  gid, provcode, maincode, bed, name, lat, lon, typecode, ST_AsGeoJSON(geom) AS geojson from ".TABLE." WHERE provcode = 65; ";
    
   // Perform database query
   $query = pg_query($con,$sql);   
   //echo $sql;
    // Return route as GeoJSON
   $geojson = array(
      'type'      => 'FeatureCollection',
      'features'  => array()
   ); 
  
   // Add geom to GeoJSON array
   while($edge=pg_fetch_assoc($query)) {  
      $feature = array(
         'type' => 'Feature',
         'geometry' => json_decode($edge['geojson'], true),
         'crs' => array(
            'type' => 'EPSG',
            'properties' => array('code' => '4326')
         ),
            'properties' => array(
'gid' => $edge['gid'],
            'provcode' => $edge['provcode'],
            'maincode' => $edge['maincode'],
            'bed' => $edge['bed'],
            'name' => $edge['name'],
            'lat' => $edge['lat'],
            'lon' => $edge['lon'],
            'typecode' => $edge['typecode']
         )
      );
      
      // Add feature array to feature collection array
      array_push($geojson['features'], $feature);
   }
   // Close database connection
   pg_close($con);
   // Return routing result
   // header('Content-type: application/json',true);
  echo json_encode($geojson);
?>

เขียนโดย: ชิงชัย หุมห้อง (14 ตุลาคม 2559)
Reference: https://github.com/sanchangon/leaflet-phpgeojson

ซอฟต์แวร์รหัสเปิด (Open Source Software)

       ซอฟต์แวร์รหัสเปิด (Open Source Software) เป็นซอฟต์แวร์ที่มีการเปิดเผยวิธีการทำงานให้ผู้อื่น (นอกเหนือจากผู้พัฒนาซอฟต์แวร์) ได้รับทราบ ทำให้ผู้ใช้งานสามารถเรียนรู้วิธีการทำงานของซอฟต์แวร์ และปรับปรุงแก้ไขได้ด้วยต้นเอง รวมถึงการเผยแพร่ซอร์ซโค้ดได้อย่างสะดวก ภายใต้ข้อตกลงกฎหมายหรือสัญญา ซอฟต์แวร์รหัสเปิดมีการพัฒนาตั้งแต่โปรแกรมอำนวยความสะดวกขนาดเล็กไปจนถึงระบบปฏิบัติการที่มีประสิทธิภาพสูง หลายโปรแกรมได้รับการพัฒนาจนมีคุณภาพสูงทั้งในด้านของประสิทธิภาพ และความน่าเชื่อถือจนได้รับความนิยมอย่างสูง และมีการนำไปประยุกต์ใช้งาน อย่างข้อดีที่สำคัญของซอฟต์แวร์รหัสเปิด คือ ความสามารถที่จะนำซอฟต์แวร์ไปใช้งาน การศึกษา แก้ไข และเผยแพร่ได้อย่างเสรี ทำให้คำว่า ซอฟต์แวร์รหัสเปิด ซอฟต์แวร์โอเพนซอร์ซ (การเขียนแบบทับศัพท์เป็นคำไทย) และซอฟต์แวร์เสรี นั้นมีความหมายในทางเดียวกันหรือสามารถใช้แทนกันได้ จากภาพที่ 6 ซึ่งผู้วิจัยได้ให้คำจำกัดความของซอฟต์แวร์เสรี (Freedom of Software) อยู่ 4 คำดังนี้

1. มีความเสรีในการใช้งาน (Freedom of use)

2. มีความเสรีในการแจกจ่าย (Freedom of redistribute)

3. มีความเสรีในการคัดลอก (Freedom of copy)

  4. มีความเสรีในการดัดแปลง (Freedom of modify)

คำจำกัดความของซอฟต์แวร์เสรี (OSS)
(ดัดแปลงจาก Sanghee Shin, 2015)

เขียนโดย: ชิงชัย หุมห้อง (14 ตุลาคม 2559)

วันอังคารที่ 11 ตุลาคม พ.ศ. 2559

GRASS GIS: โปรแกรมที่รู้จักกันมากที่สุดของฟรีแวร์ทางด้านระบบสารสนเทศภูมิศาสตร์ (GIS)

     

      GRASS GIS  มี ชื่ อ เต็ ม ว่ า “ Geographic Resources Analysis Support System” เป็นหนึ่งในโปรแกรมที่รู้จักกันมากที่สุดของฟรีแวร์ทางด้านระบบสารสนเทศภูมิศาสตร์ (GIS) ซึ่งเป็นโครงการภายใต้อนุญาติสัญญา GNU General Public License (GPL) เป็นเครื่องมือที่มี ประสิทธิภาพที่สามารถจัดการได้ทั งข้อมูลราสเตอร์ ข้อมูลเวกเตอร์ และเครื่องมือประมวลผลเชิงพื้นที่ ซึ่งรวบรวมชุดคำสั่งการวิเคราะห์ไว้อยู่ในชุดเดียวกันโดยครอบคลุมชุดคำสั่งด้านการวิเคราะห์เชิงพื้นที่ แบบจำลองเชิงพื้นที่ การประมวลผลข้อมูลภาพ และการแสดงผลข้อมูลเชิงพื้นที่ GRASS ได้รับการพัฒนาขึ้นในปี ค.ศ. 1982 – 1995 โดยกองทัพสหรัฐอเมริกา (USACE) ใน หน่วยของ U.S. Army Construction Engineering Research Laboratory (CERL) เพื่อใช้ในการ จัดการที่ดินสำหรับตั้งฐานทัพ และต่อมา CERL ได้ปล่อยให้ใช้งานดาวน์โหลด Source Code ทางอินเตอร์เน็ต ทำให้มีกลุ่มผู้ใช้งานขยายออกไปทั่วโลก และในปี ค.ศ. 1995 CERL ก็ได้ถอนตัวออกจาก การพัฒนา ในปี ค.ศ. 1997 หลังจากนั้น GRASS 4.2 ได้ถูกเผยแพร่โดย Baylor University และ GRASS เวอร์ชั่น 4.2.1 ก็ถูกเผยแพร่ในปี ค.ศ. 1998 เช่นกัน การพัฒนาของ GRASS เวอร์ชั่น 5.0 เริ่มเปิดตัวในปี ค.ศ. 1999 และตั้งแต่ปีค.ศ. 2001 ที่ GRASS Development Team มีสำนักงานใหญ่อยู่ที่ ITC-irst (Centro per la Ricerca Scientificae Tecnologica) ตั้งอยู่เมืองเตรนโต ประเทศอิตาลี GRASS 5.0.0 ได้รับการเปิดตัวอย่างเป็นทางการในปีค.ศ. 2002 ซึ่งมีการปรับปรุงข้อผิดพลาดต่างๆ ของโปรแกรมมาตลอดตั้งแต่เวอร์ชั่น GRASS 4.x รวมทั้งสนับสนุนเครื่องมือใหม่ๆ เช่นการแสดงผลข้อมูลในรูปแบบ 3 มิติ และโมดูลการวิเคราะห์ทางด้านสิ่งแวดล้อมเชิงพื้นที่ เป็นต้น โดยปัจจุบัน GRASS อยู่ในเวอร์ชั่น 7.0.5
ภาพตัวอย่าง



เขียนโดย: ชิงชัย หุมห้อง (11 ตุลาคม 2559)
Reference: https://grass.osgeo.org

วันจันทร์ที่ 10 ตุลาคม พ.ศ. 2559

ZOO-Project: Open WPS platform

     

       ZOO-Project  คือแพลตฟอร์มการบริการประมวลผลบนเว็บแบบรหัสเปิด (open source) ที่ริเริ่มโดย GeoLab และดูแลโดยเครือข่ายชุมชนผู้ใช้งานและนักพัฒนาทางด้านภูมิสารสนเทศทั่วโลก โดยมีประธานของโครงการคือ Gérald FENOY โปรแกรมเมอร์ชาวฝรั่งเศส และยังมีคณะกรรมในการพัฒนาโครงการนี้อยู่ทั่วโลก อาทิเช่น Nicolas BOZON (ฝรั่งเศส), Maria BROVELLI (อิตาลี), Massimilano CANNATA (สวิสเซอร์แลนด์), Hirofumi HAYASHI (ญี่ปุ่น), Daniel KASTL (เยอรมัน), Jeff McKENNA (แคนาดา), Markus NETELER (เยอรมัน), Venkatesh RAGHAVAN (ญี่ปุ่น) และ Angelos TZOTSOS (กรีซ) ซึ่ง ZOO-Project จะประกอบด้วย 4 ส่วนหลัก ๆ นับตั้งแต่การสร้างซึ่งจะได้แก่ ZOO-Kernel, ZOO-Services, ZOO-API และ ZOO-Client
ZOO-Kernel คือ WPS เซิร์ฟเวอร์ และเป็นหัวใจของ ZOO-Project ซึ่งดำเนินงานตามข้อกำหนดของ OGC WPS 1.0.0 ที่เขียนด้วยภาษา C สามารถทำงานบน Linux, Mac OSX และวินโดว์ ซึ่งมีลักษณะเหมือนกับโปรแกรม CGI ซึ่งทำงานร่วมกับเว็บเซิร์ฟเวอร์ เช่น Apache หรือ IIS โดย ZOO-Kernel จะทำหน้าในการประมวลผลข้อมูลเชิงพื้นที่ สามารถจัดการและ WPS ห่วงโซ่บริการโดยการโหลด libraries และ code ที่เขียนในภาษาการเขียนโปรแกรมที่แตกต่างกันแบบไดนามิกได้ จึงทำให้ ZOO-Kernel สามารถดำเนินการ WPS Services ที่เขียนได้หลากหลายภาษา เช่น C/C++, Fortran 77/90, Ruby, Perl, Java, PHP, Python หรือ JavaScript. ZOO Service จะทำงานร่วมกันกับ ZOO-Kernel บนพื้นฐานของ Library เช่น GDAL, GRASS GIS, OrfeoToolbox (OTB), SAGA GIS และ CGAL โดยนำเอาโมดูลของแต่ละ Library มาพัฒนาให้อยู่ในมาตรฐาน WPS
ZOO-Services เป็นเครื่องมือที่สามารถนำมาพัฒนาและเรียนใช้สำหรับพัฒนาเป็นเซอร์วิสที่สามารถพร้อมใช้งานบริการการประมวลผลเว็บที่สร้างขึ้นโดยการเรียกใช้ไลบรารี่แบบรหัสเปิดซึ่งแหล่งที่มาที่สามารถเชื่อถือได้ เช่น GDAL, GRASS GIS, OrfeoToolbox (OTB), CGAL และ SAGA GIS
ZOO-API เป็น JavaScript API ที่รันบนฝั่งเซิร์ฟเวอร์สำหรับการสร้างหรือผูกมัด (chaining) และกำกับการผูกมัด (orchestrating) ของการให้บริการ WPS ได้ และสามารถสร้าง web application ที่ง่ายแต่มีประสิทธิภาพ และปริมาณ code ที่น้อยเพื่อลดความซับซ้อนของ code ให้น้อยที่สุด
ZOO-Client เป็นฝั่งผู้ใช้งานโดยเรียกใช้ JavaScript API สำหรับการโต้ตอบกับ WPS เซิร์ฟเวอร์ และการดำเนินการร้องขอบริการตามมาตรฐาน OGC จาก web application

เขียนโดย: ชิงชัย หุมห้อง (10 ตุลาคม 2559)
Reference: http://zoo-project.org

วันจันทร์ที่ 13 มิถุนายน พ.ศ. 2559

Web Processing Service (WPS) บน GeoServer

______วันนี้ได้มีโอกาสทดสอบ WPS ที่อยู่ใน GeoServer การการที่จะใช้ WPS ได้นั้นจะต้องทำการติดตั้งปลั๊กอินก่อน ตามเว็บนี้ WPS Plugin เรามาดูกันเลยครับ

1. Buffer




2. Extract Contour from DEM