คำนิยามแบบได้ใจความของ Mapserver

Standard

ได้ไปอ่านเจอ “Mapserver : a completed unbiased  Overview” by Paul Ramsey แล้วได้ใจมากกับคำนิยามที่ตรงใจ เวลาคนอื่นถามว่าทำไมไม่ใช้ ArcIMS ทำไมไม่ Geoserver ก็เพราะว่า …..

Mapserver is strong like OX มันแข็งแรงเหมือน วัว

Mapserver is fast like cheetah มันเร็วเหมือนเสือชีตาท์ (อันนี้เห็นด้วยอย่างแรง เวลาบอกคนอื่นก็มักบอกแต่คนดี อันนี้)

Mapserver is kind of cheetox or an Oxtah คุณเห็นด้วยไหม ???

อีกอย่างที่น่าสนใจก็คือ

Mapserver is an rendering engine มันก็เป็นแค่เครื่องจักรที่มีหน้าที แปลงข้อมูลดิบ ให้เป็นแผนที่ที่สวยงาม

แต่ Geoserver, Mapguide  and Arc IMS นั้นเปรียบได้เหมือน รถยนต์ ที่มักรวมเบาะที่นั่งนุ่ม ๆ เครื่องเสียงเล้าใจ ไฟกระพริบสีสรร

ลองอ่านเพิ่มเติมได้จากที่นี่นะครับ

http://s3.cleverelephant.ca/geoweb-mapserver.pdf

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

Mapserver 5.0.0 Change

Standard

ไม่มั่นใจ เหมือนกันว่าเป็นที่ Mapserver หรือ GDAL หรือ จากส่วนไหน แต่แน่ ๆ คือ

หากจะใช้ Layer OGR จากเดิม หากจะใช้ Labelitem หรือ Classitem จะต้องใช้

ogr:DO หรือ ogr:Name

ต่อตอนนี้นั้นไม่จำเป็นแล้ว ให้ใช้แค่ DO หรือ NAME เท่านั้น

และอยู่ดีก็เจอปัญหาแปลกเกี่ยวกับ

PHP Warning: [MapServer Error]: msProcessProjection(): no system list, errno: 2

หลายท่านแนะนำว่าให้ใส่

CONFIG “PROJ_LIB” “/usr/share/proj/”

ใน map file

หรือ ใส่ SetEnv PROJ_LIB “/usr/share/proj/”

ไปใน apache config สะ แต่บางที คิดว่ามันเป็น bug อะ เพราะ พอเกิดข้อพลาดมันก็แจ้ง แต่พอ restart apache ก็หายสะงั้น แล้วลองเอา ไอ้ proj_lib ที่ใส่ค่าไว้ทั้งหมดออกไป ระบบก็ทำงานได้ดี

Powered by ScribeFire.

เกร็ดเล็กน้อย สารพัน Mapserver ทั้งหลาย 1

Standard

พอดีวันนี้เจอปัญหาด้าน Symbol Scaling ที่เกิดขึ้นกับ Symbol ที่เป็น PixMap ที่เกิดขึ้นกับ Mapserver 4.8.1
ก็เลยนั่งหาคำตอบอยู่นานเลยเจอ link ต่าง ๆ และเกร็ดบางอย่างน่าสนใจเลยเอาลงไว้แก้ขัดนะครับ

เป็น webboard ที่รวมความรู้ด้าน GIS และ Mapserver ไว้คนข้าง ใช้ได้เชียวเลย

Nabble

นี่เป็นอีกคำตอบนึงที่ได้จาก web แห่งนี้ยังไม่เคยลองเหมือนกัน
เป็นการใช้คำสั่งของ gdal ในการทำ tiling ไว้จะลองใช้ดู

เป็นคำสั่งในการสร้าง Tiled Tiff file ออกมา
gdal_translate -co TILED=YES your.tif tiled.tif

เป็นคำสั่งสร้าง preview ออกมา
gdaladdo tiled.tif 2 4 8 16 32 64 128 256

นี่ก็เป็นอีกหนึ่งของ Client ตัวใหม่ ที่น่าสนใจ คาดว่าพัฒนามาจาก Thesis ของเด็ก ปโท

FIST

วกกลับด้วย AppforMap กันสะหน่อยแล้วกันนะ

php.ini ต้องอนุญาตให้ใช้

register_globals = On

เพื่อจะทำให้สามารถใช้ CheckBox และฟังก์ชัน ต่าง ๆ ได้อย่างสมบูรณ์

จากนั้นด้านการใช้งาน postgis 1.0 อาจมีปัญหาบ้างนิดหน่อยกับเรื่องของข้อมูลเพราะมีการเข้มงวดกับการใช้มากขึ้นจาก postgis 0.8

โดยตัวอย่างที่ต้องทำการแก้ไข code ที่ทำการเพิ่มจุดเข้าไปให้นั้นจะรับได้แค่ จุดแรกที่กด เท่านั้น ส่วนจุดอื่น ๆ ก็จะข้ามไป
ใน functions.php


switch ($this -> theGeometry)
{
////Edit Change Log 1
case POINT :
$pointgeoCoordStr=explode(“,”,$geoCoordStr);
$__wkt=”POINT($pointgeoCoordStr[0])”;
break;

ที่เหลือก็ยังมีพวก ค่าการ zoom to point ที่ีมีการใ้ช้ magic number ใน file attrupdate.phtml ไว้ที่ 100 ซึ่งหากใช้หน่วยของแผนที่แบบ degrees ก็สัก 1 หรือ 1.5 ก็น่าจะดีกว่า

แล้วในส่วน Measure นั้นจะใช้ได้กับ Map File ที่ใช้ หน่วยเป็น Meters

- การแสดง Legend ด้วยคำสั่ง Drawlegend สำหรับ i18n

ต้องทำการกำหนด การแสดงค่าใน Label object ใน Legend obj ให้เป็นดังรูปแบบด้านล่าง

LEGEND
KEYSIZE 40 20
KEYSPACING 10 10
OUTLINECOLOR 0 0 0
IMAGECOLOR 255 255 255
LABEL
TYPE TRUETYPE
ENCODING SJIS
FONT “Sazanami-Mincho”
COLOR 0 0 0
SIZE 12
POSITION CL
PARTIALS FALSE
BUFFER 3
END
STATUS OFF
END

แล้ว legend จะทำาการสร้าง legend ด้วยภาษานั้นได้ จากการใช้ค่า Class name นั้นเอง