______บ่อยครั้งที่ผมมักเจอคำถามว่าใช้ซอฟต์แวร์ GIS ที่เป็น commercial ด้วยหรือ? แล้วตามด้วยน้ำเสียงแดกดันเล็กๆว่า “นึกว่าใช่แต่ opensource” ผมเองก็ได้แต่ยิ้มไม่ได้ตอบอะไร จริงๆแล้วอยากอธิบายให้น้องๆหรือเพื่อนๆที่คิดจะทำงานด้าน GIS ว่าการเรียนรู้อะไรหลายๆอย่างโดยไม่ยึดติดเป็นเรื่องดี ใช้ได้หลายๆโปรแกรม เพราะหน้าที่ของเราคือการพัฒนาระบบ การชี้นำหรือมีอคติไม่ได้ช่วยให้อะไรดีขึ้นมา ผมเองใช้ได้ทั้ง commercial และ opensource โดยคนที่ีเลือกไม่ใช่ผมคนเลือกจริงๆคือลูกค้าหรือหน่วยงานต่างหาก ถ้าลูกค้ามีเงินจะจ่ายพอใจที่จะใช้ solution แบบ commercial เราเองต่างหากที่ต้องเรียนรู้และปรับตัวให้สามารถใช้งานซอฟต์แวร์ให้ได้อย่างมีประสิทธิภาพ ผมไม่เห็นด้วยกลับการที่จะยกข้อด้อยมาเป็นข้อโจมตีเพื่อดึงดันจะเอาชนะ ไม่ต่างอะไรกับพวกที่เอาแต่ตะแบงเพื่อความสะใจโดยไม่ฟังเหตุและผลของผู้คนในสังคม จุดอ่อนของ opensource คือการ maintenain ข้อนี้เป็นเรื่องที่ทราบกันดี จนหลายคนที่จะเลือกใช้ก็ต้องตระหนักกว่าจะแก้ปํญหาหนึ่งกันได้ ต้องวิ่งกันขาขวิด หาทางออกกันอย่างมากมาย ต่างจาก commercial ที่ท่านสามารถโทรถามผู้เชี่ยวชาญได้ตลอด นั้นก็เป็นอีกหนึ่งเหตุผลหลัก สิ่งที่สำคัญที่สุดคือต้องแยกให้ออกระหว่างการใช้งานโปรแกรมกับทฤษฏี ถ้าเข้าใจในเรื่องของทฤษฏีไม่ว่าใช้โปรแกรมอะไรผลลัพธ์ที่ออกมาก็จะมีประสิทธิภาพไม่แพ้กัน

______วันนี้พามาดูอีกตัวอย่างของการบรรจบกันของ commercial product กับ opensource ผมยกตัวอย่าง openlayers โปรแกรม Opensource Web Mapping Client ที่ได้รับความนิยมมากอีกตัวหนึ่ง Openlayers มีการพัฒนา Class สำหรับการเพิ่มชั้นข้อมูลที่มาจาก Arcgis Server API จาก blog ที่ผ่านมาผมเขียนถึง arcgis server javascript API แบบเขียน code สำหรับ web mapping ทั้งหมด วันนี้เป็นตัวอย่างของการใช้ openlayers กับ ArcGIS Server 9.3 Rest API โดยข้อมูลมากจาก sampleserver1.arcgisonline.com โดยสามารถกำหนดการแสดงผลแผนที่ตามตัวอักษรของชื่อขึ้นต้นแต่ละรัฐได้

Step การทำงาน

1. เพิ่ม Openlayers library ลงใน Html

<script src=”../OpenLayers.js“></script>

2. เขียน code ภาษา javascript สำหรับ application

<scrip type=”text/javascript”>

var map;

var layer;

function init(){

var mapOptions = {

// กำหนด extent ครอบคลุมบริเวณแผนที่, ใช้ SRS เป็น epsg:4326 geodetic WGS84

maxExtent: new OpenLayers.Bounds(-174,18.4,-63.5,71),maxResolution: 0.25,projection: “EPSG:4326”};

map = new OpenLayers.Map( ‘map’, mapOptions );

// Add Service จาก Arcgis Server

layer = new OpenLayers.Layer.ArcGIS93Rest( “ArcGIS Server Layer”,

http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StateCityHighway_USA/MapServer/export&#8221;,

{layers: “show:0,2”});

map.addLayer(layer);

map.addControl( new OpenLayers.Control.MousePosition() );

map.setCenter(new OpenLayers.LonLat(-115, 45), 0);

}

function enableFilter() {

// Filter layer ข้อมูลจาก REST API

layer.setLayerFilter(2, “STATE_NAME LIKE ‘%” + document.getElementById(‘filterValueField’).value + “%'”);

layer.redraw();

}

function disableFilter() {

layer.setLayerFilter(2, null);

layer.redraw();

}

function updateButton() {

document.getElementById(‘filterButton’).value = “Show ‘” +

document.getElementById(‘filterValueField’).value + “‘ States”;

}

</script>

3. add event onload ลง html โดยเก็บไว้ที่ body oject เพื่อ run ฟังก์ชั่น init()

<body onload=”init()”>

4.  ใส่ control object และ DIV สำหรับแสดงแผนที่

<div id=”map” class=”smallmap”></div>

<input id=”filterValueField” type=”textfield” value=”A”/>

<input id=”filterButton” type=”button” onclick=”enableFilter();” value=”Filter States”/>

<input type=”button” onclick=”disableFilter();” value=”Show All States”/>

_____เสร็จสิ้นกระบวนความแล้วครับ รวดเร็วและก็ไม่ยุ่งยาก ลองแวะไปดูผลลัพธ์ได้ที่

http://www.openlayers.org/dev/examples/arcgis93rest.html

122

<scrip type=”text/javascript”>
var map;
var layer;
function init(){
var mapOptions = {
maxExtent: new OpenLayers.Bounds(-174,18.4,-63.5,71),
maxResolution: 0.25,
projection: “EPSG:4326”};
map = new OpenLayers.Map( ‘map’, mapOptions );
layer = new OpenLayers.Layer.ArcGIS93Rest( “ArcGIS Server Layer”,
{layers: “show:0,2”});
map.addLayer(layer);
map.addControl( new OpenLayers.Control.MousePosition() );
map.setCenter(new OpenLayers.LonLat(-115, 45), 0);
}
function enableFilter() {
layer.setLayerFilter(2, “STATE_NAME LIKE ‘%” + document.getElementById(‘filterValueField’).value + “%'”);
layer.redraw();
}
function disableFilter() {
layer.setLayerFilter(2, null);
layer.redraw();
}
function updateButton() {
document.getElementById(‘filterButton’).value = “Show ‘” +
document.getElementById(‘filterValueField’).value + “‘ States”;
}
</script>