SWIG Mapscript vs PHP Mapscript

Standard

เคยแต่ใช้ PHP Mapscript มาสะนาน คราวนี้มาลองใช้ SWIG Mapscript ดูบ้าง ก็เลยลองกลับ Python 2.6

มาเปรียบเทียนกันเลยละกัน Code ที่แสดงเป็นการเปลี่่ยนค่า PROCESSING ของ RASTER layer แล้วทำการ QueryByPoint โดยใน PHP เจอปัญหาสามารถกำหนดค่า BANDS ได้เพียง 5 bands แต่ใน python ในนั้นไม่มีปัญหา รวมถึงหากกำหนดใน mapfile เช่นกันคาดว่าจะเป็นในเรื่องของ ขนาด shape result ที่ใหญ่เกินกว่าที่กำหนดไว้

เท่าที่ลองใช้ python mapscript ก็ใช้งานได้ดี โดยเฉพาะในแบบ interactive ทำให้ง่ายต่อการ debug

Python Code

import mapscriptomap=mapscript.mapObj("test.map")

olayer=omap.getLayerByName("testdata")

olayer.status=mapscript.MS_ON

olayer.clearProcessing()

olayer.setProcessingKey("BANDS","1,2,3,4")

queryPoint = mapscript.pointObj(-179.5,89.5)

olayer.queryByPoint(omap,queryPoint,mapscript.MS_SINGLE,-1)

olayer.open()

for i in range(olayer.getNumResults()):

result=olayer.getResult(i)

s=olayer.getFeature(result.shapeindex)

for i in range(olayer.numitems):

print "%s: %s" % (olayer.getItem(i), s.getValue(i)

olayer.close()

PHP Mapscript

dl("php_mapscript.so");$oMap = ms_newMapobj("/srv/maps/modis/config.map");

$oLayer = $oMap->getLayerByName("testdata");

$oLayer->clearprocessing();

$oLayer->setprocessing("BANDS=1,2,3,4");

$oLayer->set("status","MS_ON");

$queryPoint=ms_newPointObj();

$queryPoint->setXY(-179.5,89.5);

@$oLayer->queryByPoint($queryPoint,MS_SINGLE,-1);

$oLayer->open();

for ($i=0;$i< $oLayer->getNumResults();$i++){

             $oResult = $oLayer->getResult($i);

             $oshape = $oLayer->getfeature($oResult->shapeindex);

             foreach ($oLayer->getitems() as $name){

                          echo $name.": ".$oshape->values[$name]."\n";

             }

}

Result

x: -179.5
y: 89.5
value_0 : -9999
value_1 : -9999
value_2 : 4040
value_3 : 4785
value_list : -9999,-9999-4040,4785
red : 0
green : 0
blue : 0

WMS and WCS Time

Standard

รับรู้มาตั้งนานแล้วว่า Mapserver support WMS และ WCS Time

เช่นในกรณี MODIS data set ซึ่งจะมีภาพทุก ๆ วัน ก็จะเป็นประโยชน์มากวิธีการทำก็มีใน

http://mapserver.org/ogc/wms_time.html และ http://mapserver.org/ogc/wcs_server.html#wcs-server

มาสรุปสั้น ๆ ให้ได้ใจความ

ก่อนอื่นทำความเข้าใจก่อนว่า 1 ไฟล์ภาพ คือ ข้อมูล หนึ่งวัน หรือหนึ่งเวลา อาจจะมีหลาย band ก็ได้

ขั้นที่ 1 ก็ทำการสร้าง index file ด้วยคำสั่ง

-gdaltindex inde.shp image/*.tif

ก็จะได้ไฟล์ index มาซึ่งจะมี colume “location”  ที่มี path และ filename อยู่

ก็ทำการสร้าง colume เพิ่มมาใหม่ด้วย โปรแกรม GIS เช่น Mapwindos, Qgis etc.. ตั่งชื่ออะไรก็ได้ ให้ข้อมูลเป็นชนิด Text

จากนั้นอาจจะต้องหาวิธีใส่ข้อมูลวันที่เข้าไป ในแต่ละ records.

เสร็จไปขั้นแรก

2. ก็มาสร้าง map file โดยทำการสร้าง layer สำหรับ tile index ซึ่งก็เป็นแบบทั่วไปของ Polygon SHP

3. ทำการสร้าง Layer สำหรับภาพ Modis โดยมีข้อมูลที่สำคัญตามนี้

Layer

NAME modisa ชื่อข้อมูล

Projection

“init=epsg:4326″

End

TYPE RASTER

DUMP True

TILEINDEX “location” ชื่อ colume ที่มี path และ filename

TILEINDEX “time_idx” ชื่อ layer ของ tileindex

METADATA

“wms_timextent” “2008-09-01/2008-09-05 จากวันที่ 1 ถึง 5

“wms_timeitem” “dtime” ชื่อ colume ใน shp ที่มีข้อมูลวันที่

“wms_timedefault” “2008-09-01″

…… และอื่นที่ ๆจำเป็นสำหรับ wms implementation

“wcs_timeitem” “dtime”

“wcs_timeposition” “2008-09-01/2008-09-05″

……

END

เป็นที่น่าสังเกตว่า

wcs_timeextent สามารถกำหนดเป็น แบบ range ได้ หลังจาก Mapserver version 5.4.1

WxS Mapscript non-work on NON-CGI environment

Standard
หลังจากปวดหัว ตั้งแต่เช้า ว่าอยู่ดี ๆ ทำไม script เก่า มันใช้งานไม่ได้ฟะ ในที่สุดก็ค้นพบว่า mandriva 2008 ที่ลงไปนั้นยังไม่ได้ปรับแก้ให้ ใช้ php ใน แบบ cgi ไม่ใช่แบบ mod_php

เพราะจะมีผลกับคำสั่งบางอย่างของ php-mapscript เช่น WxS Mapscript

พอสร้าง object

$request = ms_newowsrequestobj();

มันก็เงียบไป แล้วไม่มี error ใด ๆ ทั้งสิ้น ทั้งทางหน้าจอและใน log

บางอ่านบอกให้ทำการ parse จาก request url แล้วใส่เข้าไปด้วยวิธี

$request = ms_newOwsRequestObj();



foreach ($_GET as $k=&gt;$v) {

$request-&gt;setParameter($k, $v);

}



ก่อน $request-&gt;loadparams(); แต่สำหรับเราลองแล้วยังงัยก็ไม่สำเร็จ ก็ไม่เข้าใจ

ก็เลยปรับเปลี่ยนไปใช้ แบบ cgi ดีกว่า

ถ้าใครเจอปัญหาแบบนี้ลองแก้ตามข้างบนแล้วกันถ้าผ่านนะ


Powered by ScribeFire.