GIS Books

มิถุนายน 30, 2008

         ปีนี้มีหนังสือ GIS ดีๆออกมาค่อนข้างเยอะ มีหลายเล่มที่ผมอยากแนะนำให้สถานศึกษาหรือห้องสมุดน่าจะซื้อเก็บไว้ หลายคนอาจจะบอกว่าสิ่งที่เป็น Fundamental มันก็เหมือนเดิมไม่น่าจะมีอะไรเปลี่ยนแปลงมีเล่มเดียวก็พอ อันนี้ก็จริงผมเห็นด้วยแต่สิ่งหนึ่งที่ทำให้หนังสือต่างกัน คงเป็นเรื่องของเทคโนโลยีที่พัฒนาไปตามยุคตามสมัย และปัจจัยที่สำคัญที่สุดคือตัวผู้เขียน ที่น่าจะถ่ายทอดมุมมองใหม่ๆออกมาให้ผู้อ่านอย่างเราๆได้เรียนรู้ ผมมักจะเชื่อเหลือเกินว่าระหว่าง อาจารย์ นักวิชาการและ ผู้เชียวชาญเฉพาะ เขียนหัวข้อเดียวกันมุมมองและวิธีคิดก็น่าจะแตกต่างกัน

        วันนี้หยิบเอาหนังสือ 2 เล่มที่ผมหาเจอในอินเตอร์เน็ตมาฝากครับ เล่มแรกชื่อ “GIS For Dummies” ของ คุณ Michael N. DeMers อย่างเพิ่งตกใจนะครับ คนอ่านไม่จำเป็นต้องโง่หรอก เพียงแต่ว่าเค้าตั้งชื่อตามประเภทหนังสือเท่านั้น จริงๆแล้วเล่มนี้ดีครับเพราะสรุปเอาแก่น สาระประเด็นหลักสำคัญๆไว้เยอะ เหมาะสำหรับผู้บริหารหรือผู้ที่เป็นมือใหม่ ประเภทพวกที่ไม่เข้าใจว่าทำไมมันต้องใช้เงินทำโครงการเยอะจัง ทำไมมันช้าจังงานแค่นี้ ควรอ่านอย่างยิ่งครับ นอกจากนี้ยังมี concept เรื่องต่างเกี่ยวกับ gis และ mapping สำคัญๆอีกเพียบ ที่ผมชอบคือเป็นภาษาอังกฤษที่อ่านง่าย และที่สำคัญคุณ Michael N. DeMers ก็เป็น CEO ที่ค่อนข้างเชี่ยวชาญและมีประสบการณ์ทางด้าน GIS เป็นอย่างดี ท่านที่สนใจอ่านรายละเอียดได้ที่ http://as.wiley.com/WileyCDA/WileyTitle/productCd-0470236825.html (น่าจะวางแผงเร็วๆนี้ครับ)

        เล่มที่สองคือ “The Business Benefits of GIS: An ROI Approach ” เล่มนี้ก็น่าสนใจออกแนวธุรกิจ การใช้ GIS ในการช่วยตัดสินใจในการลงทุนทางธุรกิจ เขียนโดยคุณ David Maguire และคณะ เป็นหนังสือจาก ESRI PRESS ชื่อชั้นสามารถการันตีความเข้มข้นของหนังสือได้เป็นอย่างดี สิ่งที่ผมชอบคือหนังสือของสำนักพิมพ์นี้มักมีตัวอย่าง case study ดีๆให้ศึกษาเสมอ ท่านที่สนใจเข้าไปอ่านรายละเอียดได้ที่

http://gis.esri.com/esripress/display/index.cfm?fuseaction=display&websiteID=142&moduleID=0  (น่าจะวางแผงเร็วๆนี้ครับ)

 


OKMAP:Free GPS Mapping

มิถุนายน 30, 2008

         วันนี้ผมมีซอฟท์แวร์ GPS Mapping น้องใหม่อีกหนึ่งตัวมาแนะนำครับ โดยตัวนี้มีชื่อว่า OKMAP สำหรับซอฟท์แวร์ตัวนี้เป็นซอฟท์แวร์ฟรีที่น่าสนใจ ฟีเจอร์การทำงานคล้ายกับพวก  OziExplorer และ GPS TrackMaker แต่ดีดว่าตรงที่ฟรี สามารถรองรับการทำงานกับ GPS ได้หลายรุ่นโดยผ่านทางไลบารี GPS Bible ฟังก์ชั่นการทำงานหลักของ OKMAP ก็มีดังต่อไปนี้ครับ

         – เปิดข้อมูล vector data ได้หลายฟอร์แมท รวมถึงการใช้เป็น Tools ในการ upload ข้อมูลแผนที่เข้าสู่ GPS ได้

         – นำเข้าข้อมูลราสเตอร์ ทั้งแบบ geotiff และ ecw ได้และรองรับระบบพิกัดภูมิศาสตร์ที่หลากหลาย

        – มี editing tool สำหรับสร้างและแก้ไข ข้อมูล waypoint และ route track

        – ฟังก์ชั่น Realtime GPS Tacking

        – ส่งออกข้อมูล GPS ไปสู่ KML ฟอร์แมทได้

       ท่านที่สนใจสามารถไปดาวน์โหลดมาใช้งานฟรีได้ที่ http://www.okmap.it


แปลงพิกัดด้วยง่ายๆ spread sheet

มิถุนายน 27, 2008

        กำลังมองหา tools ง่ายในการแปลงค่าพิกัด แล้วก็ไปเจอ Cartisan Map Coordinate Converter เข้าน่าสนใจดีเป็น tools เล็กที่ทำงานบน spread sheet เช่น excel หรือ openoffice ได้ โดยรองรับการประมวลผลได้ 5000 พิกัดในหนึ่งครั้ง

        Cartisan Total Map Coordinate Converter รองรับรูปแบบพิกัด Geographic coordinate ทั้งแบบ Dd, DMS, DMd โดยสามารถแปลงไปสู้ระบบพิกัดแบบ UTM and MGRS โดยรองรับ 14 datums ที่นิยมใช้งานมาก ท่านที่สนใจสามารถไปดาวน์โหลดมาใช้งานได้ฟรีที่ http://www.cartisan.com/map_resources/utilities/total_coordinate_converter.html

 


Popular in GIS Programming Languages?

มิถุนายน 27, 2008

       ช่วงนี้ความถี่ในการเขียน blog ลดลงจนหลายคนเริ่มทัก ว่าหายไปไหนจริงๆแล้วก็ไม่ได้ไปไหนครับ ยังคงอยู่ที่เดิมไม่ได้ออกเดินสายต่างจังหวัด แต่ติดตรงที่ว่าช่วงนี้เป็นเทศกาลฟุตบอลยูโร เลยต้องเชียร์ทีมรักทีมโปรด ปีนี้โชคดีทีมที่เชียร์เล่นดีเข้ารอบลึกก็เลยต้องลุ้นต่อไป การดูบอลก็เป็นกิจกรรมที่เพลิดเพลินจำเริญใจดีโดยเฉพาะทัวร์นาเมนต์ใหญ่ที่หลายปีมีหนอย่างนี้

       วันนี้อยากเขียนเรื่องประเด็นการเขียนโปรแกรมกับงาน GIS จริงๆแล้วเดี่ยวนี้หลายท่านที่ใช้งาน GIS หรือรวมไปถึงมหาวิทยาลัยที่มีการเรียนการสอนทางด้าน GIS ก็มีการสอนการเขียนโปรแกรมเข้าไปด้วย เรียกโก้ๆว่า GIS Programming เคยสงสัยไหมครับว่าโดยทั่วไปแล้ว โปรแกรมเมอร์ด้าน GIS นิยมใช้ภาษาอะไรในหารพัฒนาระบบ?

       ผมไปเจอการสำรวจเรื่องนี้ทาง mailgroup ภายใต้หัวข้อ “Popular in GIS Programming Languages?” โดยคุณ Dave Bouwman ผลออกมาค่อนข้างชัดเจนครับว่า GIS โปรแกรมเมอร์ นิยมใช้ภาษา VB6/VBA มากที่สุดประมาณ 60% และใช้ภาษา Python ประมาณ 11.6% , C# อยู่ที่ 35.4% ที่เหลือก็คือภาษาอื่นๆ ผลการสำรวจก็เป็นการออกแบบสอบถามเบื้องต้น ซึ่งไม่ได้แสดงรายละเอียดของจำนวนประชากรหรือค่าทางสถิติต่างๆ จริงๆแล้วถ้าเมืองไทยจะมีการสำรวจกันบ้างก็จะดีนะครับ :D

 


Open Layers : ajax gis client

มิถุนายน 25, 2008

       Open Layers เป็น Opensource Mapping Client อีกตัวที่น่าสนใจและก็มีคนนำไปใช้งานมาก เนื่องจากตัว client มีการพัฒนาอย่างต่อเนื่อง ประกอบกับการออกแบบที่ดีและยืดหยุ่นทำให้สามารถนำไปใช้พัฒนาระบบของตัวเองได้ง่าย ข้อเด่นของ openlayers คือเป็น ajax base(Prototype , Rico library) และมีส่วนเชื่อมต่อกับ API ต่างๆ เช่น GoogleMap, VE, Mutimap นอกจากนี้ตัว client ยังเป็น Tile caching เหมาะกับระบบบริการแผนที่ขนาดใหญ่ ที่มีการออกแบบช่องทางการบริการข้อมูลในลักษณะ Tile-Caching นอกจากนี้ยังรองรับ WMS และ WFS อีกด้วยครับ รายละเอียดคงจะได้กล่าวถึงในโอกาสต่อไป ตัวผมเองเล่น openlayers เกือบปี แล้วจึงรู้สึกว่าเหมาะแก่การแนะนำ ท่านที่สนใจลองเข้าไปอ่านรายละเอียดที่   http://openlayers.org/ 

        ที่ไม่อยากบรรยายสรรพคุณไปมาเพราะกลัวจะมีเนื้อที่เขียนไม่พอ แต่เดี่ยวมาลองพิสูจน์กันดูดีกว่าว่าใช้งานง่ายจริงหรือไม่ การพิสูจน์ก็คือการลงมือทำ ท่านสามารถเขียน code เพียงไม่กี่บรรทัดก็สามารถนำแผนที่แบบ mapservice ไปวางบนหน้า webpage ได้แล้ว โดยผมจะเขียน Mapservice Application โดยไปเรียกข้อมูล WMS จาก Metacara

เขียน code ดังนี้นะครับ

<html xmlns=”http://www.w3.org/1999/xhtml“>
  <head>
    <link rel=”stylesheet” href=”http://openlayers.org/dev/theme/default/style.css” type=”text/css” />
    <style type=”text/css”>
        #map {
            width: 512px;
            height: 512px;
            border: 1px solid black;
        }
    </style>
    <script src=”http://www.openlayers.org/api/OpenLayers.js”></script>
    <script type=”text/javascript”>
        var lon = 100.652;
        var lat = 13.737;
        var zoom = 5;
        var map, layer;

        function init(){
            map = new OpenLayers.Map( ‘map’ );
            layer = new OpenLayers.Layer.WMS( “OpenLayers WMS”,
                    “http://labs.metacarta.com/wms/vmap0“, {layers: ‘basic’} );
            map.addLayer(layer);
            map.setCenter(new OpenLayers.LonLat(lon,lat), 5);
            map.addControl( new OpenLayers.Control.LayerSwitcher() );
        }
    </script>
  </head>
  <body onload=”init()”>
    <h1 id=”title”>Open layers Demo</h1>
 <div id=”map”></div>
  </body>
</html>

 


ST_Difference

มิถุนายน 24, 2008

           เคยติดค้างผู้เข้าอบรม Spatial database ท่านหนึ่งในเรื่องของฟังก์ชั่น clip  โมดูล Geoprocessing ใน postgis โดยพี่ท่านนี้ถามว่าถ้าต้องการ clip polygon โดยใช้ฟังก์ชั่นใน postgis ทำได้ไหมทำได้อย่างไร? ยอมรับจริงๆครับเมื่อตอนที่ท่านถามผมก็ตอบไม่ได้เพราะไม่เคยลองวันนี้หาเจอแล้วครับ ใน spatial database ผ่าน interface ST_ ของ OGC เรียกฟังก์ชั่นนี้ว่า diffence คือการจำแนกความต่างของ Geometry Object ทั้งสอง มาลองดูคำสั่งนะครับ

          ST_Difference(geom1,geom2) โดยข้อมูล Geometry data ได้ก็จะเป็นส่วนที่ อยู่ใน geom1 แต่ไม่อยู่ใน geom2 ซึ่ง ผลลัพธ์ของ  ST_Difference(geom1,geom2) จะไม่เท่ากับ ST_Difference(geom2,geom1) ทดลองเขียน SQL เพื่อประมวลผลข้อมูล โดยผมจะสร้างโพลีกอนวงกลม A และ วงกลม B เพื่อใช้ในการประมวลผล

SELECT 1 As gid, g.geom1, g.geom2, ST_Difference(g.geom1, g.geom2) As diff_geom12,
ST_Difference(g.geom2, g.geom1) As diff_geom21
FROM (SELECT ST_Buffer(ST_MakePoint(9,3),2) As geom1,ST_Buffer(ST_MakePoint(10,2),1) As geom2) As g;

         ผลลัพธ์ที่ได้ก็จะเป็นข้อมูล WKB จากการประมวลผลครับในรูปของตาราง ถ้าอยากเห็น Geometry Feature ในรูปแบบเวกเตอร์ก็ลองใช้ QGIS เรียกเพื่อเรียกดูได้ครับ

ภาพข้อมูล Geometry Object ทั้งสอง(A,B)

ข้อมูล Geometry ผลลัพธ์จาก ST_Difference(geom_A, geom_B)

ข้อมูล Geometry ผลลัพธ์จาก ST_Difference(geom_B, geom_A)

 

 

 


Gameboy Advance GPS

มิถุนายน 23, 2008

      GameBoy เป็นของเล่นชิ้นหนึ่งที่เราไม่สามารถปฏิเสธได้ว่าไม่รู้จัก ในวัยละอ่อนผมก็ได้เจ้าเกมส์บอยเป็นเพื่อนแก้เซ็งเวลารอรถไปโรงเรียน วันนี้โตขึ้นเกมส์เครื่องเก่าก็กลายเป็นมรดกตกทอดให้น้องชายและเลยไปถึงหลานต่อไป จริงๆผมเคยได้ยินเรื่อง Gameboy ที่เป็น GPS จากพี่ภาณุมานานแล้ว แต่วันนี้เพิ่งมาประจักษ์กับตาตัวเอง

      ผมไปพบโปรเจคนี้โดยบังเอิญจาก Google ตอนที่กำลัง search เรื่องเกี่ยวกับ GPS โดยตัวนี้เป็นโปรเจคชื่อ GBA GPS สอนวิธีการแปลงร่างเกมส์บอยเครื่องเก่าให้กลายมาเป็น GPS Navigator สุด HIp โดยมีคู่มือการสอนที่ละเอียดออกแนว DIY น่าสนุกดีกับการรื้อๆแคะ ยังถึงการเขียนโปรแกรมเพื่อแปลงร่าง Gameboy รวมไปถึงการเขียนโปรแกรมเพื่อเชื่อมการทำงานกับ GPS Reciver ผมเจอโปรเจคนี้ครั้งแรกรู้สึกชอบนะ อยากลองทำแต่จนแล้วจนรอดผมก็ยังหา Gameboy มาลองไม่ได้สักกะที ท่านที่สนใจเข้าไปดาวน์โหลดโปรแกรมและทดลองเล่นได้ที่ http://www.msh-tools.com/GBA/gbagps.html

ภาพตัวอย่าง Gameboy กับ GPS Receiver

 


ArcGIS Server 9.3

มิถุนายน 21, 2008

       ผมเป็นอีกคนหนึ่งครับที่รอคอยการเปิดตัวของ ArcGIS Server 9.3 สำหรับเวอร์ชั่นใหม่ที่มีข่าวออกมาตลอดในเรื่องการปรับปรุงและการเพิ่มฟีเจอร์ต่างๆของซอฟท์แวร์ รวมไปถึงการร่วมมือทางเทคนิคกับ google เพื่อที่จะเชื่อมโยงการทำงานของโปรแกรม รวมไปถึงอะไรๆที่ทันสมัยอย่างเช่น Restful API (ที่น่าจะเพิ่มความสามารถจาก 9.2)

       วันนี้ไปพบ podcast ของคุณ Ismael Chivite ตำแหน่ง ArcGIS Server Product Manager ที่พูดถึง ArcGIS Server 9.3  แบบ overview เอาไว้เลยนำมาฝาก หัวข้อคราๆก็ประมาณ “Learn about the new ArcGIS API for JavaScript” , “what’s happening with ArcGIS Image Server”, “role-based security” และ ”faster Web services via improved map caching options” ท่านที่สนใจดาวน์โหลดได้ที่ http://www.esri.com/news/podcasts/audio/directionsmag/staff_chivite_dm.mp3

       สุดท้ายนี้เอาตัวอย่างแจ๋มๆของ ARCGIS Server + Google Map มาฝากน่าสนใจมากทีเดียว ผมว่าแนวโน้ม MapService รุ่นใหม่น่าจะเป็น Tile-cache กันเกือบหมดแล้ว ตัวอย่างนี้เป็น ArcGIS Server Cache Adapter ที่ใช้ Google Map API เป้น client ดึงข้อมูลจาก ArcGIS Server map cache

http://ags.gmaps.googlepages.com/adapter.htm

     ปล.ใครตอบผมได้ไหมครับ ระหว่าง ArcGIS Image Server กับ  RedSpider® Image Archive ผมควรเลือกใช้อันไหนดี

อ้างอิงจาก

http://apb.directionsmag.com/archives/4413-ESRI-Podcast-Series-An-Overview-of-ArcGIS-Server-9.3.html

 


Actionscript mapping APIs

มิถุนายน 20, 2008

           ปัจจุบันแนวคิดของ Mushup Map API กลายเป็นที่ยอมรับและเป็นที่นิยมใช้งานอย่างแพร่หลาย เนื่องจากความสะดวกในการใช้งานและการเชื่อมต่อระบบ(MIS+Mushup Map) ในตอนแรก Mushup Map API ก็จะเป็น javascript AJAX แต่ในตอนนี้กระแสของ Flash มาแรง ทำให้เกิดยุคที่สองของ Mushup Map ในรูปแบบของ Flash-based Mapping Application

           โดยปัจจุบันมีผู้ให้บริการข้อมูลแผนที่ออนไลน์หลายเจ้า เปิดช่องทางการให้บริการแผนที่ในรูปแบบ Mushup Map API ที่ใช้ Flash ในการแสดงผล ข้อดีแน่นอนว่าสวยงาม และก็สามารถใช้ในการแสดงผลข้อมูลหลายช่วงเวลาได้เป็นอย่างดี ท่านนักพัฒนาที่สนใจจะลองนำ Flash Actionscript Mapping มาใช้ก็ลองเข้าไปดูรายละเอียดได้ที่นี้นะครับ

Yahoo! Maps for ActionScript 3.0 – Link
Google Maps Flash Interface – Link
MapQuest AS3 API – Link
UMap: Google Maps Flash Overlay (flash above above AJAX map) – Link

 

 


Mirone: GDAL ,GMT GUI Interface

มิถุนายน 17, 2008

         ถ้าเอ่ยถึงชื่อ MatLab คิดว่าหลายๆท่านที่เรียนมาทางด้านวิทยาศาสตร์และวิศวกรรมศาสตร์น่าจะรู้จักซอฟท์แวร์ตัวนี้เป็นอย่างดี MatLab เป็นซอฟท์แวร์ที่มีฟังก์ชั่นการคำนวณต่างๆมากมาย ครอบคลุมไปถึงเรื่องทางสถิติ และการแก้สมการขั้นสูง ในงาน Geoinfomatic ก็มีการใช้ในด้านงานวิจัยเป็นหลัก ผมเองเคยใช้ MatLab ในงาน Postprocessing สำหรับข้อมูล GPS ,Geostat,ใช้ในการคำนวณโมเดลการไหลของน้ำจากข้อมูลความสูงภูมิประเทศเป็นต้น รวมไปถึงงานด้าน Digital Image Processing แต่สำหรับตัวโปรแกรม MathLab ออกแบบมาเพื่อการคำนวณแต่ไม่ได้มีโมดูลหรือฟังก์ชั่นการคำนวณเชิงพื้นที่ โดยเฉพาะการเข้าถึงข้อมูล ผู้ใช้ต้องแบบข้อมูลให้อยู่ในรูปแบบข้อมูลเชิงเลขที่เป็น textfile ทำให้ค่อนข้างยุ่งยากในกรณีที่ข้อมูลมีจำนวนมาก

        ดังนั้นจึงมีผู้พัฒนาโปรแกรมในรูปแบบของ MATLAB-based framework โดยเอาไลบารีการคำนวณและ GUI ของ MathLab มาใช้ผนวกกับโมดูลการคำนวณและประมวลผลเชิงพื้นที่จากซอฟท์แวร์ Opensource ชื่อดังคือ GDAL(สำหรับประมวลผลและจัดการข้อมูลราสเตอร์)+ GMT(General Map Tool) ผลลัพธ์ที่ได้คือ software ที่ใช้ในการคำนวณเชิงพื้นที่ในรูปแบบ Grid รวมไปถึงฟังก์ชั่น Geostat, Spatial analysis และอื่นๆ โดย  MATLAB สามารถทำงานกับข้อมูลดิจิตอลที่เป็น Raster ได้โดยตรงและมีประสิทธิภาพดีกว่าเดิม Mirone มี 2 เวอร์ชั่นคือ sourcecode base on MATLAB(ต้องติดตั้ง MathLab ก่อน) หรืออีกแบบเป็น binary deploy (ไม่ต้องติดตั้ง MathLab) ฟังก์ชั่นต่างมีมากพอสมควรครับ แต่การคำนวณมีประสิทธิภาพดีมาก รวมถึงความเร็วในการคำนวณและการจัดการ memory ในเครื่อง ท่านที่สนใจไปดาวน์โหลดโปรแกรมได้ที่ http://w3.ualg.pt/~jluis/mirone/downloads.htm

ตัวอย่าง tile map

ตัวอย่าง SRTM mosaic tool

 


SirfTech

มิถุนายน 17, 2008

    SirfTech เป็นโปรแกรมที่ใช้ในการจัดการ SiRF GPS ที่อยู่ในอุปกรณ์มือถือ ซึ่งถือได้ว่า SiRF เป็นตัวยอดนิยมเลยทีเดียว สำหรับท่านที่ต้องการ modify ค่าต่างและการปรับแต่งการทำงานของ SiRF GPS ก็สามารถใช้โปรแกรมนี้ได้ ปัจจุบันออกมาถึงเวอร์ชั่นที่ 2.6 แล้ว  SirfTech มีจุดเด่นที่หลายด้าน และที่สำคัญมันสามารถแสดงรายละเอียดของข้อมูลที่ได้จาก GPS รวมทั้งมีฟีเจอร์เพิ่มเช่น sky plot, Graph และ LUT โดยรองรับการทำงานกับรูปแบบข้อมูลชนิด NMEA (โอกาสหน้าจะมาสอนเขียนโปรแกรมเชื่อมต่อกับ GPS และการพาสข้อมูลจาก NMEA Protocol) ท่านที่สนใจสามารถไปดาวน์โหลดมาใช้งานได้ฟรีที่ http://w5.nuinternet.com/s660100031/SirfTech.htm 

 

 

 


SatNav Teddy Bear

มิถุนายน 16, 2008

          วันนี้ผมมีอุปกรณ์นำทางแบบแจ๋มๆมาแนะนำครับ อุปกรณ์นี้ถูกเรียกขานว่า SatNav Teddy Bear จริงๆแล้วมันก็คือตุ๊กตาหมีนำทาง ที่ผลิตโดย iXs Research Corporation  เจ้า robotic teddy bear จะถูกติดตั้งไว้บนรถ มีฟีเจอร์ของ GPS และระบบนำร่อง โดยสามารถบอกเส้นทางที่ต้องการได้เหมือนกับอุปกรณ์ GPS Navigation ทั่วไป แต่ที่เพิ่มเข้ามาคือระบบรักษาความปลอดภัยขณะขับรถ เช่น ตัวตรวจจับแอลกอฮอล(alcohol detection sensor) ซึ่งจะติดอยู่ที่คอขอตุ๊กตาหมี ซึ่งหมีจะสามารถส่งสัณญาณเตือนคนขับรถได้ในกรณีที่ตรวจวัดค่าแอลกอฮอลได้มากกว่ามาตรฐาน และนอกจากนี้ยังมีการร้องเตือนในกรณีที่ผูขับขี่ขับรถด้วยความเร็วสูงหรือมีการเบรคแบบกระทันหัน ไม่แน่ใจว่าจะออกว่าจำหน่ายเมื่อไหร่หรือว่าจะมีเวอร์ชั่นมีภาษาไทยหรือไม่ แต่ที่แน่ๆไอเดียนี้ได้ใจผมจริงๆครับ

 

อ่านรายละเอียดเพิ่มเติมได้ที่ http://www.pinktentacle.com/2008/06/robot-teddy-bear-car-navigation-system/

 


GDAL With .Net

มิถุนายน 13, 2008

          มี email มาถามถึงการใช้งานไลบารีในการประมวลผลภาพ (Digital image processing) รวมไปถึงการทำงานด้าน Remote sensing โดยต้องการสร้าง Application จากภาษา .Net จริงๆแล้วถ้าเป็นไลบารี่ opensource คงหนีไม่พ้น GDAL โปรเจคชื่อดังคุณภาพดี วันนี้เลยจะขอมาสาธิตวิธีการใช้งาน GDAL ไลบารีเบื้องต้นนะครับ

         1 วิธีการ Build GDAL

             – เปิด DOS

             – Run VCVARS32.bat อยู่ใน Microsoft Visual Studio 8/VC/bin

             – ดาวน์โหลด sourcecode ของ GDAL จาก http://www.gdal.org/ 

             – เข้าไปที่ Root directory แล้ว Run คำสั่ง nmake /f makefile.vc

             – install ด้วยคำสั่ง nmake /f makefile.vc install

              กรณีติดปัญหาลองเข้าไปอ่านเพิ่มเติมได้ที่ http://www.gdal.org/gdal_building.html หรือ http://www.vterrain.org/Distrib/gdal.html

           *** หรือไม่ก็ใช้ FWtools ก็ได้นะครับ

        2 . เตรียมตัวเขียนโปรแกรมกัน โดยผมใช้ภาษา C#.net ในการเขียน

            - copy ไลบารี่ต่างๆที่เกี่ยวข้อง ซึ่ง build ไว้มาเก็บไว้ในที่ต้องการ จากนั้นก็ add เข้ามาใน .net นะครับ

            – ลองเริ่ม basic step กับ gdal โดยจะเขียนโปรแกรม gdal เพื่อเรียกดู infomation และ header ของภาพถ่ายดาวเทียมหรือภาพถ่ายทางอากาศ โดยจะใช้ฟังกชั่น Gdal.Open() เพื่อเข้าถึงภาพ Raster แล้วจึงเข้าถึงรายละเอียดของคุณสมบัติต่างๆของภาพ Raster เช่น Map Projection, pixel value , Meatadata header เป็นต้น

public static void Main(string[] args)
    {

        if (args.Length != 1) usage();

        Console.WriteLine(”");

        try
        {
            /* ——————————————————————– */
            /*      Register driver ทั้งหมด                                            */
            /* ——————————————————————– */
            Gdal.AllRegister();

            /* ——————————————————————– */
            /*      เปิดไฟล์ Raster                                                   */
            /* ——————————————————————– */
            Dataset ds = Gdal.Open( args[0], Access.GA_ReadOnly );
  
            if (ds == null)
            {
                Console.WriteLine(”Can’t open ” + args[0]);
                System.Environment.Exit(-1);
            }

            Console.WriteLine(”Raster dataset parameters:”);
            Console.WriteLine(”  Projection: ” + ds.GetProjectionRef());
            Console.WriteLine(”  RasterCount: ” + ds.RasterCount);
            Console.WriteLine(”  RasterSize (” + ds.RasterXSize + “,” + ds.RasterYSize + “)”);
           
            /* ——————————————————————– */
            /*      Get driver สำหรับ Raster                                                      */
            /* ——————————————————————– */ 
            Driver drv = ds.GetDriver();

            if (drv == null)
            {
                Console.WriteLine(”Can’t get driver.”);
                System.Environment.Exit(-1);
            }
           
            Console.WriteLine(”Using driver ” + drv.LongName);

            /* ——————————————————————– */
            /*      Get metadata หรือ Header ของภาพ Raster                                                   */
            /* ——————————————————————– */
            string[] metadata = ds.GetMetadata(”");
            if (metadata.Length > 0)
            {
                Console.WriteLine(”  Metadata:”);
                for (int iMeta = 0; iMeta < metadata.Length; iMeta++)
                {
                    Console.WriteLine(”    ” + iMeta + “:  ” + metadata[iMeta]);
                }
                Console.WriteLine(”");
            }

            /* ——————————————————————– */
            /*      แสดง “IMAGE_STRUCTURE”                           */
            /* ——————————————————————– */
            metadata = ds.GetMetadata(”IMAGE_STRUCTURE”);
            if (metadata.Length > 0)
            {
                Console.WriteLine(”  Image Structure Metadata:”);
                for (int iMeta = 0; iMeta < metadata.Length; iMeta++)
                {
                    Console.WriteLine(”    ” + iMeta + “:  ” + metadata[iMeta]);
                }
                Console.WriteLine(”");
            }

            /* ——————————————————————– */
            /*     แสดงส่วนของ subdatasets.                                             */
            /* ——————————————————————– */
            metadata = ds.GetMetadata(”SUBDATASETS”);
            if (metadata.Length > 0)
            {
                Console.WriteLine(”  Subdatasets:”);
                for (int iMeta = 0; iMeta < metadata.Length; iMeta++)
                {
                    Console.WriteLine(”    ” + iMeta + “:  ” + metadata[iMeta]);
                }
                Console.WriteLine(”");
            }

            /* ——————————————————————– */
            /*      แสดงรายละเอียด geolocation.                                             */
            /* ——————————————————————– */
            metadata = ds.GetMetadata(”GEOLOCATION”);
            if (metadata.Length > 0)
            {
                Console.WriteLine(”  Geolocation:”);
                for (int iMeta = 0; iMeta < metadata.Length; iMeta++)
                {
                    Console.WriteLine(”    ” + iMeta + “:  ” + metadata[iMeta]);
                }
                Console.WriteLine(”");
            }

            /* ——————————————————————– */
            /*      แสดง image boundary                                                 */
            /* ——————————————————————– */
            Console.WriteLine( “Corner Coordinates:” );
            Console.WriteLine(”  Upper Left (” + GDALInfoGetPosition( ds, 0.0, 0.0) + “)”);
            Console.WriteLine(”  Lower Left (” + GDALInfoGetPosition( ds, 0.0, ds.RasterYSize) + “)”);
            Console.WriteLine(”  Upper Right (” + GDALInfoGetPosition( ds, ds.RasterXSize, 0.0) + “)”);
            Console.WriteLine(”  Lower Right (” + GDALInfoGetPosition( ds, ds.RasterXSize, ds.RasterYSize) + “)”);
            Console.WriteLine(”  Center (” + GDALInfoGetPosition( ds, ds.RasterXSize / 2, ds.RasterYSize / 2) + “)”);
            Console.WriteLine(”");

            /* ——————————————————————– */
            /*      Get raster band                                                 */
            /* ——————————————————————– */
            for (int iBand = 1; iBand <= ds.RasterCount; iBand++)
            {
                Band band = ds.GetRasterBand(iBand);
                Console.WriteLine(”Band ” + iBand + ” :”);
                Console.WriteLine(”   DataType: ” + Gdal.GetDataTypeName(band.DataType));
                Console.WriteLine(”   ColorInterpretation: ” + Gdal.GetColorInterpretationName(band.GetRasterColorInterpretation()));
                ColorTable ct = band.GetRasterColorTable();
    if (ct != null)
     Console.WriteLine(”   Band has a color table with ” + ct.GetCount() + ” entries.”);
               
    Console.WriteLine(”   Description: ” + band.GetDescription());
                Console.WriteLine(”   Size (” + band.XSize + “,” + band.YSize + “)”);
                int BlockXSize, BlockYSize;
                band.GetBlockSize(out BlockXSize, out BlockYSize);
                Console.WriteLine(”   BlockSize (” + BlockXSize + “,” + BlockYSize + “)”);
                double val;
                int hasval;
                band.GetMinimum(out val, out hasval);
                if (hasval != 0) Console.WriteLine(”   Minimum: ” + val.ToString());
                band.GetMaximum(out val, out hasval);
                if (hasval != 0) Console.WriteLine(”   Maximum: ” + val.ToString());
                band.GetNoDataValue(out val, out hasval);
                if (hasval != 0) Console.WriteLine(”   NoDataValue: ” + val.ToString());
                band.GetOffset(out val, out hasval);
                if (hasval != 0) Console.WriteLine(”   Offset: ” + val.ToString());
                band.GetScale(out val, out hasval);
                if (hasval != 0) Console.WriteLine(”   Scale: ” + val.ToString());
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(”Application error: ” + e.Message);
        }
    }

 private static string GDALInfoGetPosition(Dataset ds, double x, double y)
    {
        double[] adfGeoTransform = new double[6];
        double dfGeoX, dfGeoY;
        ds.GetGeoTransform(adfGeoTransform);

        dfGeoX = adfGeoTransform[0] + adfGeoTransform[1] * x + adfGeoTransform[2] * y;
        dfGeoY = adfGeoTransform[3] + adfGeoTransform[4] * x + adfGeoTransform[5] * y;

        return dfGeoX.ToString() + “, ” + dfGeoY.ToString();
    }
}

———————————————————————————

code ตัวอย่างจาก GDAL developer group โดย Tamas Szekeres

         สรุปอีกที GDAL &OGR เป็นไลบารีที่มีประสิทธิภาพ และใช้งานได้สารพัดประโยชน์จริงๆครับ ท่านที่เริ่มศึกษาการเขียนโปรแกรมทาง GIS หรือ Remote Sensing ก็สามารถนไปประยุกต์ใช้ได้ ซึ่งจะช่วยลดภาระเรื่องการจัดการไฟล์ไปได้มากเลยทีเดียว อ่านรายละเอียดเพิ่มเติมและดูตัวอย่างอื่นๆที่ http://trac.osgeo.org/gdal/wiki/GdalOgrInCsharp

 

 


Maptales Mobile: GPS logging

มิถุนายน 12, 2008

              Maptales Mobile เป็น Opensource J2ME GPS Application ที่เปิดให้ผู้ใช้สามารถใช้บริการ tracking ของ Maptale.com ผู้ใช้และนักพัฒนาสามารถ download โปรแกรม Maptales Mobile มาติดตั้งที่เครื่อง มือถือ แล้ว โดยสามารถทำงานร่วมกับ GPS Bluetooth กรณีที่ต้องการ tracking ก็สามารถ upload เส้นทางการเดินทาง(Route) และข้อมูลประกอบอื่นๆไปยังระบบที่ Maptale.com ได้ทันที

              ท่านที่สนใจสามารถไปดาวน์โหลดโปรแกรมได้ที่ http://www.maptales.com/page/mobile และสามารถสมัครใช้งาน account ของ Maptale.com ในกรณีต้องการใช้ webapplication ได้ที่ http://www.maptales.com/register/

หน้าตาเมนูครับ

เริ่มต้นทำการ logging

upload ข้อมูลไปยัง maptales ก็ได้

 


Free Open Source GPS Tracking

มิถุนายน 12, 2008

      ช่วงนี้ application ประเภท GPS Tracking กำลังเป็นที่นิยม ตัวผมเองก็จับ application ประเภทนี้อยู่ครับ และก็เคยทำระบบ tracking มาบ้างแล้ว หลายท่านถามหา opensource ทางด้านนี้ว่ามีหรือไม่ จริงๆก็มีอยู๋หลายตัวนะครับ แต่มันยังไม่ค่อยเข้าตา บางตัวก็เฉพาะกิจแล้วเลิกไป บางตัวก็มีข้อจำกัดกับ mobile ที่จะนำไปใช้ แต่สำหรับผมเองนั้นก็ใช้ opensource เป็น base ในการพัฒนา ตัวที่ผมชอบและนำแนวคิดเค้ามาปรับใช้ก็คือ porject ที่ชื่อว่า LocateMe ของ slient development ทำกันแบบเงียบๆเอามันส์ ทำงานบน MIDP 2.0 mobile phones เป็น j2me application

     โปรแกรมเขียนค่อนข้างดี และมี module จัดการ รวมถึงติดต่อกับ GPS Device ได้ดีทีเดียว หลายอย่างหลายเทคนิคผมก็มาเรียนรู้จาก project นี้ เช่นเรื่อง DOP, GPS trigonometry แต่น่าเสียดายคนทำไม่ได้ maintain ต่อแล้วท่านที่สนใจจะศึกษาทางด้านนี้เข้าดาวน์โหลดได้ที่ http://brownb2.ndo.co.uk/downloads/locateme/locateme_src_1.0.zip

สำหรับ รายละเอียดโปรเจคตามได้ที่ http://silentdevelopment.blogspot.com/2008/03/locateme-free-j2me-gps-tracking.html

 

 

 


Google Navigator

มิถุนายน 12, 2008

       Google Navigator โปรแกรม Navigator & Mapping เจ๋งๆที่ทำงานบน PPC รองรับ window mobile 6.0 แต่ไม่ฟรีนะครับ เสียค่าซอฟท์แวร์นิดหน่อยเพียง $59 แต่ก็น่าจะคุ้มกับฟีเจอร์ที่จะได้รับ เช่น Tracking GPS, 3D Map, Fix GPS Bug, Build Tracking Line, Send Position, Search/Find Location ทดลองเข้าไปดาวน์โหลดโปรแกรมมาใช้งานที่ http://www.pdafun.net/download.htm ครับ

3D View พร้อมกับการ Navagation

tracking ไปบนแผนที่ของ Google Map

export/send ตำแหน่งของเราไปให้เพื่อนๆได้

ฟังก์ชั่นอื่นๆสำหรับ google navigator

 

 


iphone gps ข่าวลือที่กลายเป็นจริง

มิถุนายน 11, 2008

      อาทิตย์นี้ถ้าไม่พูดถึง iPhone 2nd ก็กลัวจะ out แต่สำหรับผมที่จดจ่อ รอดูก็เพราะว่าอยากจะเปลี่ยนมือถือจะเต็มแก่ ประกอบกับอนาจใจตัวเองเพราะเวลาทำ gps tracking app ก็ต้องไปยืม ppc คนอื่นใช้

     ผมเคยเขียนถึงเรื่องนี้มาแล้วครั้งหนึ่งตอนที่ยังเป็นข่าวลืออยู่ ถึงแม้วงในจะคอนเฟริม 70% แล้วแต่หลายคนก็ยังไม่เชื่อว่า iPhone 2nd จะมี built-in GPS เพราะการ เพิ่ม GPS ลงในมือถือหมายถึง cost ที่สูงขึ้น และ battery ที่ต้องเพิ่ม capacity เพราะการใช้ GPS ต้องใช้พลังงานมากขึ้น จนแล้วจนรอด apple ก็ประกาศขาย iPhone 2nd generation ออกมา โดยมีการนำเสนออย่างเป็นทางการในงาน World Wide Developers Conference ใน San Francisco ด้วยราคาที่ไม่แพงเกินเอื้อม ประกอบกับรูปลักษณ์และดีไซน์ที่ลงตัว จึงทำให้ใครหลายคนเต็มใจที่จะควักเงินจ่ายกัน

    ในรุ่นนี้มี 2 ประเภท 8GB Black-backed iPhone 2: $199 ,16GB White-backed iPhone 2: $299 แต่มีเรื่องข้อกำหนดในการใช้บริการ operation ของ AT&T โดยมีกำหนดวางขาย 22 ประเทศใน 22กรกฎาคม (ไม่มีไทยนะครับ) จุดเด่นที่น่าสนใจเป็น 3G (ที่เมืองไทยยังไม่มีให้ใช้) และ GPS โดยจะมี application Mapping ซึ่งใช้ข้อมูลแผนที่ของ Google map ซึ่งใน app จะมีฟังก์ชั่นหลักได้แก่ Find yourself, Get directions, See traffic นอกจากนี้ยังใช้งานระบบนำทางแบบเดิมที่ใช้ wifi หรือ GSM-locate ได้อีกด้วยครับ ลองเข้าอ่านรายละเอียดเพิ่มได้ที่ http://www.apple.com/iphone/ 

 

      


Virtual Terrain Project

มิถุนายน 11, 2008

       ห่างหายจากการ update บทความใน blog มาหลายวันจนมี email ไปทวงถาม จริงๆแล้วไม่ได้หายไปไหนครับแต่ป่วยเป็นโรคกระเพาะกำเริบนิดหน่อย ประกอบกับช่วงนี้ดูบอลทุกวัน ไม่ค่อยได้ทำงานทำการไรนัก มาถึงหัวข้อแรกของวันนี้ที่อยากจะมาแนะนำให้ท่านรู้จักกันครับ คือโปรแกรม 3D Virtual Terrain Project (VTP)

       Virtual Terrain Project(VTP) เป็นโปรแกรมที่น่าสนใจเลยทีเดียวครับ ที่สำคัญเป็น opensource โดยมีการนำไปใช้ในงานต่างๆมากมายหลากหลาย โดยครอบคลุมงานด้าน CAD, GIS, visual simulation, surveying และ remote sensing โดยในเว็บหลักก็มีตัวอย่าง application เจ๋งๆหลายอันผมลองเข้าไปเล่นมาแล้ว จุดเด่นที่น่าประทับใจคงเป็นการนำโมเดล 3D Object มาใส่ในข้อมูลภูมิประเทศได้ ที่สำคัญเราสามารรถ input ข้อมูล DEM ที่ละเอียดเข้าไปได้อีกด้วย โปรแกรมนี้มี sourcecode ซึ่งสามารถนำมาโมดิฟายได้ หรือท่านผู้ใช้ทั่วไปก็นำ binary มาติดตั้งและใช้งานได้ครับ ลองเข้าไปดาวน์โหลดโปรแกรมได้ที่ http://vterrain.org/Download/

terrain model สวยๆของเกาะ

solid model ที่สามารถนำเข้าไปสร้าง city model ในโปรแกรมได้

ตัวอย่างการนำข้อมูล vector เข้าไป drape ลงบน terrain

 


วิธีเสียบปลั๊ก Notebook‏ ที่ถูกต้อง

มิถุนายน 9, 2008

        หัวข้อนี้เป็นเรื่องที่หลายๆคนคงอยากรู้ หรือไม่ก็คงเคยสัมผัสมาก่อน สืบเนื่องมาจากเมื่อสัปดาห์ที่แล้ว ผมรับเชิญไปบรรยายที่หน่วยงานหนึ่ง แล้วก็ได้มีโอกาสเห็นภาพโปรแกรมเมอร์สาวเสียบปลั๊กโน๊ตบุ๊ค มันคงเป็นภาพปกติไม่ได้แปลกอะไร แต่ที่แปลกก็คงเป็นท่าตกใจของน้องเค้า เสียบแล้วไฟก็แล๊ปออกจากเต้าเสียบ แถมมีเสียงช็อตดังตามมา เหตุการณ์นี้หลายคนคงเคยประสบ ผมก็เป็นครับเคยงุ่นงงอยู่เหมือนกันว่าเกิดจากอะไร เพราะโน๊ตบุ๊คหลายเครื่อง หลายยี่ห้อ ก็สปาร์คเหมือนกัน แต่สุดท้ายก็สรุปไปเองว่าน่าจะเกิดจาระบบไฟของอาคาร

        และแล้ววันนี้ผมก็มาได้รับคำตอบครับ แต่อย่างเพิ่งเชื่อตามนะครับ ลองนำไปพิสูจน์กันดูก่อน “คู่มือเขาบอกไว้ชัดเจนเลยครับว่า วิธีการเสียบปลั๊กอะแดปเตอร์ของโน้ตบุ๊ก ที่ถูกต้องก็คือ ให้เราเสียบปลั๊กเข้ากับเต้ารับที่บ้านหรือที่ทำงานก่อนครับ จากนั้นค่อยเอาปลายอีกด้านที่เหลือมาเสียบเข้ากับโน้ตบุ๊ก อันนี้คือวิธีที่ถูกต้อง ” วิธีนี้ผมได้มาจาก i-why ลองทำตามแล้วใช้ได้แฮะ ดูง่ายๆแต่ได้ผล

        ผมลองตั้งคำถามกับตัวเองว่าทำไมเราไม่เสียบปลั๊กแบบนี้ตั้งแต่แรก คำตอบที่ได้คือกลัวไฟดูดเพราะปลายเปิดของสายอีกด้านอาจจะดูดเราก็ได้แต่มันน่าจะเป็นการคิดไปเองมากกว่า(เพราะยังไม่เห็นข่าวว่ามีใครโดนดูดตาย) เอาเป็นว่าอย่างเพิ่งเชื่อที่ผมเขียนนะครับ ทดลองนำไปทำดูก่อนแล้วค่อยสรุปผลอีกที…

 

 อ้างอิงจาก

http://www.i-why.net/wordpress/plug-notebook-truesight/


Mini Flight Sim on Goole Earth

มิถุนายน 6, 2008

         เมื่อวานผมนำเสนอเรื่องของ Google Earth API ที่เปิดให้เราสามารถพัฒนา Application บน Google Earth ในรูปแบบของ Web application ได้ แค่เพียงการแสดงผลแบบ 3D Geoweb ก็เจ๋งจะแย่แล้ว ที่สำคัญยังเขียนโปรแกรมได้อีก แล้ววันนี้ผมก็ไปเจอ application ที่โครตจะ cool ของ barnabu ที่สร้าง Mini Flight Sim บน Google Earth browser plug-in

         ท่านที่ชอบเล่นเกมส์แนวขับเครื่องบินน่าจะชื่นชอบ ลองเข้าไปเล่นได้ที่ http://www.barnabu.co.uk/geapi/flightsim