Irmante Astalavista

Simsalabim!!!
Blog ini bercerita tentang dunia IT, ilmu kebumian, dan lain-lain.

Saturday, June 26, 2010

Mapserver, Extent PostGIS, dan jQuery

Seringkali kita dihadapkan pada keinginan untuk menampilkan peta lokasi berdasarkan pilihan user. Contoh sederhananya, ketika user melakukan klik pada sebuah tabel atau grafik yang memiliki informasi lokasi, maka panel lain akan menampilkan peta lokasi pada baris tabel atau grafiknya.
Well... biasanya sih, bilamana kita menggunakan mapserver berbasis framework, seperti pMapper, ka-map!, fist, dst, maka kita dapat melakukan pencarian lokasi dengan menggunakan tombol Find, Search, dan sebagainya.
Nah framework Mapserver dengan segala tombolnya itu, malah bukan tampilan yang diinginkan user awam a.k.a management :D. User maunya dari sembarang tabel atau grafik, klik… muncul peta lokasinya tanpa embel-embel perlu klik sana-sini. Sesederhana itu dan ga banyak cingcong....
'Klik dan tampilkan lokasi' yang bisa dilakukan pada Mapserver adalah dengan memanfaatkan bahasa PHPMapscript dengan perintah dasar
$oMap->setExtent(xMin, yMin, xMax, yMax)
Artinya tampilkan peta lokasi dengan batas pojok kiri bawah (xMin, yMin) dan batas pojok kanan atas (xMax, yMax). Pada mapserver, nilai extent itu secara default tersimpan pada file *.Map, dimana ukuran nilai extent biasanya meliputi wilayah seluruh peta, bukan lokasi spesifik dari peta.

Itu malah jadi problem buat klik dan tampilkan lokasi....
Perhatikan gambar di atas. Area bergaris biru (----), merupakan nilai kotak extent dari peta kecamatan A, B, C, D, E, F. Area bergaris hijau (----), merupakan nilai kotak extent dari peta kecamatan D, E.
Untuk areal seluruh kecamatan memiliki nilai extent:
xMin-yMin: 581663.9375 - 9621369
xMax-yMax: 1050545 - 9855190
Untuk areal kecamatan D dan E, propinsi DEF memiliki nilai extent:
xMin-yMin: 790040.8125 - 9663481
xMax-yMax: 981676.375 - 9846642

Taunya darimana nilai koordinat pojok kiri dan pojok kanan atas wilayah yang kita ingin tampilkan?
Ada beberapa cara sebenernya, yang paling sederhana adalah buat kotak pada piranti lunak GIS terhadap kedua areal tersebut. Kemudian catat nilai kursor koordinat pojok kiri bawah dan koordinat pojok kanan bawah dari kotak tsb.
Perhatikan! bahwa sistem proyeksi yang mudah diinterpretasi Mapserver dalam menentukan nilai skala adalah sistem proyeksi UTM yah, bukan derajat desimal.
Well…, yang bisa saya pikirkan adalah menggunakan fasilitas ST_EXTENT pada PostGIS. ST_EXTENT merupakan perintah untuk mengambil extent batas terluar dari sekumpulan lokasi peta hasil query, dengan output hanya satu baris!. Misal tabel peta dengan menggunakan query WHERE diperoleh hasil 2 kecamatan, maka fitur ST_EXTENT ini akan menampilkan nilai batas terluar dari kedua kecamatan tersebut, hanya satu baris.Dengan menambahkan beberapa bumbu query, maka kita akan dapat memperoleh nilai xMin, yMin, xMax, yMax dari wilayah terpilih.


Kalo lebih mudah utk mapserver dpt dipecah jadi 2 kolom extent yaitu kolom xymin dan xymax, melalui query berikut:
SELECT REPLACE(SPLIT_PART(ASTEXT(ST_EXTENT(ST_TRANSFORM(geometry,32749))), ',', 1), 'POLYGON((', '') as xymin, SPLIT_PART(ASTEXT(ST_EXTENT(ST_TRANSFORM(geometry,32749))), ',', 3) as xymax FROM wilayahku WHERE propinsi='DEF' AND kabupaten='3';

Artinya: Tentukan area extent dari wilayah propinsi='DEF' AND kabupaten='3'; (perintah WHERE), dengan cara mengambil nilai geometri (kolom GEOMETRY), dalam proyeksi UTM 49S (perintah ST_TRANSFORM(geometry,32749)), lalu terjemahkan sebagai text (perintah ASTEXT), lalu pisahkan nilai tersebut menggunakan parameter split (perintah SPLIT_PART).
Dengan mengubah-ubah parameter WHERE, maka kita bisa mendapatkan nilai extent secara dinamis ya tho… Nilai extent inilah yang menjadi dasar inisiasi Mapserver sehingga user bisa melakukan 'klik dan menampilkan lokasi'.

Masuk ke koding yah...
Langkah pertama adalah membuat query function pada PostGIS untuk mendapatkan area extent berdasarkan inputan propinsi, kabupaten, dan kecamatan. Nama query function itu: _a_mapex(propinsi, kabupaten, kecamatan).
-- Function: _a_mapex(text, text, text)

-- DROP FUNCTION _a_mapex(text, text, text;
CREATE TYPE ms_extent AS
(xmin text,
xmax text);
ALTER TYPE ms_extent OWNER TO postgres;

CREATE OR REPLACE FUNCTION _a_mapex(text, text, text)
RETURNS SETOF ms_extent AS
$BODY$
--returns setof party as $$
DECLARE

BEGIN
IF $1!='0' AND $2!='0' AND $3!='0' THEN
RETURN QUERY
select replace(split_part(astext(st_extent(st_transform(geometry,32749))), ',', 1), 'POLYGON((', '') as xymin,
split_part(astext(st_extent(st_transform(geometry,32749))), ',', 3) as xymax from wilayahku where propinsi = $1 and kabupaten=$2 and kecamatan=$3;

ELSE IF $1!='0' AND $2!='0' AND $3='0' THEN
RETURN QUERY
select replace(split_part(astext(st_extent(st_transform(geometry,32749))), ',', 1), 'POLYGON((', '') as xymin,
split_part(astext(st_extent(st_transform(geometry,32749))), ',', 3) as xymax from wilayahku where propinsi = $1 and kabupaten=$2;

ELSE IF $1!='0' AND $2='0' AND $3='0' THEN
RETURN QUERY
select replace(split_part(astext(st_extent(st_transform(geometry,32749))), ',', 1), 'POLYGON((', '') as xymin,
split_part(astext(st_extent(st_transform(geometry,32749))), ',', 3) as xymax from wilayahku where propinsi = $1;

ELSE IF $1='0' AND $2='0' AND $3='0' THEN
RETURN QUERY
select replace(split_part(astext(st_extent(st_transform(geometry,32749))), ',', 1), 'POLYGON((', '') as xymin,
split_part(astext(st_extent(st_transform(geometry,32749))), ',', 3) as xymax from wilayahku;
END IF;
END IF;
END IF;
END IF;
RETURN;
END
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100
ROWS 1000;
ALTER FUNCTION _a_mapex(text, text, text) OWNER TO postgres;
Contoh pemanfaatan query function itu dengan mencoba query berikut:
Untuk menampilkan semua wilayah menggunakan perintah:
select * from _a_mapex('0','0','0');
Untuk menampilkan propinsi ‘DEF’ menggunakan perintah:
select * from _a_mapex('DEF','0','0');
Untuk menampilkan propinsi ‘DEF’ dan kabupaten ‘3’ dan kecamatan=’F’ menggunakan perintah:
select * from _a_mapex('DEF','3','F');

PostGIS function udah... ,
Sekarang tinggal urusan MapServer dan jQuery neh…
Langkah keduanya adalah kita buat dulu file wilayahku.map yg menampilkan peta.
Filenya berjudul: wilayahku.map, dengan layer berjudul data_postgis.
MAP
NAME "wilayahku"
STATUS ON
SIZE 550 400
#EXTENT 558219.89536477 9609678.45877826 1073988.99548252 9866880.21769665
EXTENT 581663.9375 9621369 1050545 9855190
UNITS meters
RESOLUTION 72
IMAGETYPE PNG
IMAGECOLOR 255 255 255

SCALEBAR
STYLE 1
UNITS kilometers
END

WEB
IMAGEPATH "/ms4w/tmp/ms_tmp/"
IMAGEURL "/ms_tmp/"
END

PROJECTION
"init=epsg:32749"
#"init=epsg:4326"
#"+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"
END

#--------------------------------------------------------------------
LAYER
NAME "data_postgis"
STATUS DEFAULT
TYPE POLYGON
CONNECTIONTYPE POSTGIS
CONNECTION "host=localhost port=5432 dbname=msdemo user=postgres password=00000"
DATA "geometry from wilayahku using unique gid using srid=32749"

PROJECTION
"init=epsg:32749"
#"+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"
END #PROJECTION

CLASS
COLOR 225 255 100
OUTLINECOLOR 0 0 0
END

END #LAYER
END


Langkah ketiga, kita perlu membuat file PHPMapscript mapex.php, yang dapat menghasilkan gambar peta lokasi, berdasarkan serangkaian input parameter.

Dilanjut dengan script berikut:
<?php
//Generate the chart element
$paramd = $_GET['param'];
$eval = explode("_", $paramd);
//Connect to the DB
$conn = pg_connect("host=localhost user=postgres password=00000 dbname=msdemo");
//Fetch all factory records
$strQuery = "select * from _a_mapex('" . $eval[0] . "','" . $eval[1] . "','" . $eval[2] . "');";
// echo $strQuery;
// exit;
$result = pg_query($strQuery) or die('Query failed: ' . pg_last_error());
// printing table rows
if ($result) {
while($ors = pg_fetch_array($result)) {
$mapex = $ors[0] . " " . $ors[1];
}
}
//echo $mapex;

pg_free_result($result);
pg_close($conn);

$map = ms_newMapObj($_GET['map']);
// We create the map object based on the mapfile received as parameter

$size = explode(" ",$_GET['mapsize']);
$map->setSize($size[0], $size[1]);
// and set the image size (resolution) based on mapsize parameter
// Update: The map size must be setted before the extent, otherwise the extent
// will be adjusted to the aspect ratio of the map defined on SIZE parameter
// of MAP object in your mapfile

$extent = explode(" ",$mapex);
$map->setExtent($extent[0], $extent[1], $extent[2], $extent[3]);
// We get the mapext parameter... split it on its 4 parts using
// the space character as splitter

$layerslist=$_GET['layers'];
for ($layer = 0; $layer < $map->numlayers; $layer++) {
$lay = $map->getLayer($layer);
if ((strpos($layerslist,($map->getLayer($layer)->name)) !== false)
or (($map->getLayer($layer)->group != "") and
(strpos($layerslist,($map->getLayer($layer)->group)) !== false))){
// if the name property of actual $lay object is in $layerslist
// or the group property is in $layerslist then the layer was requested
//so we set the status ON... otherwise we set the stat to OFF
$lay->set(status,MS_ON);
} else {
$lay->set(status,MS_OFF);
}
}

// The next lines are the same as previous mapscript
$oImg = $map->draw();
$url = $oImg->saveWebImage(MS_PNG, 0, 0, -1);
echo "<img id=\"mymap\" src=" . $url . " style=\"border:1.5px solid grey;\"></img>";
//echo $map->scaledenom //check skala output yang keluar, soalnya kalo dalam satuan DD ga keluar jeh.

//BILAMANA ADA PERHITUNGAN MAX-MINLABEL, JANGAN GUNAKAN UNIT DD, TAPI GUNAKAN UNIT METERS, SRID LAYER PETA TETAP PROYEKSI DESIMAL DEGREE GAK MASALAH,
//CUMAN OUTPUT PROJECTION *.MAP TETAP HARUS UTM, CONTOH SRID 32739 utk UTM 49S atau 32649 utk UTM 49N
?>
Berikutnya adalah pengetesan nilai parsing dengan cara mencopy paste url ke dalam browser (perhatikan bagian input param):
Contoh untuk menampilkan peta kabupaten 1 propinsi ABC
http://localhost/msdemo/mapex.php?param=ABC_1_0&map=wilayahku.map&mapsize=450%20300&layers=data_postgis

Contoh untuk menampilkan data propinsi DEF
http://localhost/msdemo/mapex.php?param=DEF_0_0&map=wilayahku.map&mapsize=450%20300&layers=data_postgis

Welldone…!!!
Langkah keempat, sekarang kita bermain dengan file HTML-nya yang akan melakukan proses klik dan tampilkan lokasi.
Copy paste script berikut, dan simpan dalam file berjudul mapex_jquery.html:
Perhatikan kalo file ini membutuhkan jQuery file jquery-1.4.2.min.js yg tersimpan dalam direktori jQuery. jQuery ini bertujuan untuk:
  • mengolah dan menampung peta hasil query pada mapex.php kedalam div dengan id=map_tag,

  • proses render halaman bersifat parsial Ajax, karena yang diubah hanya gambarnya saja bukan keseluruhan dari halaman web,

  • Menambahkan efek animasi sederhana, biar keliatan lebih cooool…


<HTML>
<HEAD>
<style type="text/css">
<
body {
font-family: Arial, Helvetica, sans-serif;
font-size: 12px;
}
</style>

<SCRIPT LANGUAGE="JavaScript" src="FusionCharts/jquery-1.4.2.min.js"></SCRIPT>
<SCRIPT LANGUAGE="JavaScript">
function mymap(mylocation1){
//window.alert(mylocation1);
//perhatikan, kalo yg diubah sekali lagi hanya pada input param yah!
$.ajax({ type: "GET", url: "mapex.php", dataType: 'html', data: "map=wilayahku.map&param=" + mylocation1 + "&mapsize=450%20300&layers=data_postgis", error: function(xhr, textStatus, errorThrown) { alert('An error occurred! ' + errorThrown); }, success: function(html){ $('#map_tag').hide().slideDown().html(html); } }); };
</SCRIPT>
</HEAD>
<BODY>
<p><h1>Klik dan tampilkan lokasi</h1></p>
<table>
<tr>
<td>
<a href="JavaScript:mymap('0_0_0');">Seluruh Area</span></a>
<li><a href="JavaScript:mymap('ABC_0_0');">Propinsi ABC</a></li> <ul> <li><a href="JavaScript:mymap('ABC_1_0');">Kabupaten 1</a></li> <ul> <li><a href="JavaScript:mymap('ABC_1_A');">Kecamatan A</a></li> <li><a href="JavaScript:mymap('ABC_1_C');">Kecamatan C</a></li> </ul> <li><a href="JavaScript:mymap('ABC_2_0');">Kabupaten 2</a></li> <ul> <li><a href="JavaScript:mymap('ABC_2_B');">Kecamatan B</a></li> </ul> </ul> <li><a href="JavaScript:mymap('DEF_0_0');">Propinsi DEF</a></li> <ul> <li><a href="JavaScript:mymap('DEF_3_0');">Kabupaten 3</a></li> <ul> <li><a href="JavaScript:mymap('DEF_3_D');">Kecamatan D</a></li> <li><a href="JavaScript:mymap('DEF_3_E');">Kecamatan E</a></li> </ul> <li><a href="JavaScript:mymap('DEF_4_0');">Kabupaten 4</a></li> <ul> <li><a href="JavaScript:mymap('DEF_4_F');">Kecamatan F</a></li> </ul> </ul>
</td>
<td>
<div id="map_tag"></div>
</td>
</tr>
</table>
</BODY>
</HTML>
</BODY>
</HTML>

Sekarang tinggal testing outputnya:


Downloadnya di sini.

Labels: ,


Monday, April 13, 2009

Map Materialized View untuk Postgis


Materialized view adalah tabel yang berisi baris dan kolom, TETAPI memiliki sifat seperti table view. Artinya setiap perubahan dari table view akan dialami juga oleh table materialized view.

Enaknya apa sih?
Pernah tidak Anda membuat 1 peta view administrasi dengan 30 kolom hasil query rumit crosstab, hasil join table dari 8 table view dengan 1000 sub-administratif, ternyata untuk menampilkannya membutuhkan waktu 5 menit?
User Anda pasti akan mencak2 kayak cicak gara-gara wasting time menunggu minimal 5 menit untuk melihat peta yang Anda buat. Belum lagi ditambah keterbatasan bandwidth jaringan misalnya.

Anda sebagai database engineer sangat kelelahan atas upaya Anda mempercepat query peta view tersebut, dan akhirnya Anda menyadari bahwa untuk mempercepat query adalah memindahkan peta view tersebut keformat peta permanen (table view to table).
So trik yang dilakukan adalah menayangkan peta view dari basisdata tadi, kemudian mengeksportnya ke basisdata peta permanen melalui software GIS, Cadcorp misalnya.

OK, sekarang query sudah cepat, dengan peta permanen user bisa tersenyum melihat peta Anda tampil dalam <5 detik, 1/60 kali lebih cepat dari metode sebelumnya.

Masalah timbul lagi ketika ternyata, peta view yang diubah ke peta permanen secara reguler perlu diupdate karena data yang ditampilkan adalah data peta harian misalnya. Mungkin tidak masalah bila peta tersebut hanya < 10 layer. Manual juga gak papa yang sehingga ada tugas rutin harian ala PNS...:D
Kalo peta view yang diubah ke peta permanen puluhan layer gimana coba? Berapa banyak orang yg perlu Anda libatkan untuk mengubah peta tersebut satu per satu :D

Inilah pentingnya materialized view!
So, materialized view peta merupakan cara untuk menjadikan peta permanen memiliki sifat seperti peta view. Apapun perubahan yang ada pada peta view akan diikuti oleh peta permanennya. Anda tidak perlu lagi mengubahnya satu per satu, cukup memanggil query satu baris untuk menjalankan proses tersebut secara otomatis.

Dari grafik di atas, materialized view akan bersifat sama dengan view table. Saat ini magic spell-nya perlu dibuat secara manual di postgres 8.*. Tentunya kedepan postgres akan menambahkan fitur ini secara built-in mengingat pentingnya fasilitas ini.

OK, langsung hajar saja yah:

Bahan ajar:
1. PostgreSQL 8.* atau lebih tinggi
2. PostGIS yang sesuai dengan seri PostgreSQL 8.* atau lebih tinggi.
3. Contreng PLPGSQL pada saat Anda install PostgreSQL.
4. Peta basisdata hasil export dari shp2pgsql.exe atau menggunakan software GIS.
5. Peta view hasil query beberapa table.

Berikut adalah tabel yang digunakan untuk menampung informasi materialized view peta:

Tujuan:
Mencatat judul-judul peta sekaligus mencatat data timestamp terhadap perubahan dari table materialized view peta.

Kolom:
mv_name untuk judul peta permanen
v_name untuk judul peta view
last_refresh untuk Timestamp update terakhir terhadap peta permanen.

CREATE TABLE matviews (
mv_name NAME NOT NULL PRIMARY KEY
, v_name NAME NOT NULL
, last_refresh TIMESTAMP WITH TIME ZONE);

Berikutnya adalah fungsi untuk membuat materialized view peta

Tujuan:
- untuk mengubah peta view menjadi peta permanen dalam satuan koordinat yang sesuai.
- Menyamakan struktur kolom tabel peta view terhadap peta permanen, karena materialized view tidak dapat berjalan bilamana struktur kolom tidak sama antara peta permanen dengan peta view.

Input:
- $1 untuk judul peta permanen yang akan dibuat
- $2 untuk judul peta view yang menjadi dasar peta permanen
- $3 untuk kode SRID dari peta tersebut, misal 4326 untuk Derajat Desimal atau 32749 untuk UTM.

-- Function: create_matview_map(name, name, integer)

-- DROP FUNCTION create_matview_map(name, name, integer);

CREATE OR REPLACE FUNCTION create_matview_map(name, name, integer)
RETURNS void AS
$BODY$
DECLARE
matview ALIAS FOR $1;
view_name ALIAS FOR $2;
srid_code ALIAS FOR $3;
entry matviews%ROWTYPE;
BEGIN
SELECT * INTO entry FROM matviews WHERE mv_name = matview;

IF FOUND THEN
--RAISE EXCEPTION 'Materialized view ''%'' already exists.',
DELETE FROM matviews WHERE mv_name = matview;
END IF;

EXECUTE 'REVOKE ALL ON ' || view_name || ' FROM PUBLIC';

EXECUTE 'GRANT SELECT ON ' || view_name || ' TO PUBLIC';

EXECUTE 'CREATE TABLE ' || matview || ' AS SELECT * FROM ' || view_name;
EXECUTE 'CREATE INDEX ' || matview || '_geometry_sidx ON ' || matview || ' USING gist (geometry)';
EXECUTE 'ALTER TABLE ' || matview || ' ADD CONSTRAINT ' || matview || '_pkey PRIMARY KEY (gid)';
EXECUTE 'ALTER TABLE ' || matview || ' ADD CONSTRAINT enforce_dims_geometry CHECK (ndims(geometry) = 2)';
EXECUTE 'ALTER TABLE ' || matview || ' ADD CONSTRAINT enforce_srid_geometry CHECK (srid(geometry) = ' || srid_code || ')';

EXECUTE 'REVOKE ALL ON ' || matview || ' FROM PUBLIC';

EXECUTE 'GRANT SELECT ON ' || matview || ' TO PUBLIC';

INSERT INTO geometry_columns (f_table_catalog, f_table_schema, f_table_name,
f_geometry_column, coord_dimension, srid, type) VALUES ('', 'public', matview, 'geometry', 2, srid_code, 'GEOMETRY');

INSERT INTO matviews (mv_name, v_name, last_refresh)
VALUES (matview, view_name, CURRENT_TIMESTAMP);

RETURN;
END
$BODY$
LANGUAGE 'plpgsql' VOLATILE SECURITY DEFINER
COST 100;
ALTER FUNCTION create_matview_map(name, name, integer) OWNER TO postgres;


Selanjutnya adalah fungsi untuk melakukan drop off terhadap peta permanen.

Tujuan:
Menghapus peta permanen yang sudah dibuat sebelumnya, dapat diikuti dengan membuat materialized view peta baru sesuai struktur kolom peta view terbaru, atau sekedar membuang materialized view peta.

Input:
$1 untuk judul peta permanen yang akan dihapus

-- Function: drop_matview_map(name)

-- DROP FUNCTION drop_matview_map(name);

CREATE OR REPLACE FUNCTION drop_matview_map(name)
RETURNS void AS
$BODY$
DECLARE
matview ALIAS FOR $1;
entry matviews%ROWTYPE;
BEGIN

SELECT * INTO entry FROM matviews WHERE mv_name = matview;

IF NOT FOUND THEN
RAISE EXCEPTION 'Materialized view % does not exist.', matview;
END IF;

EXECUTE 'DROP TABLE ' || matview;
DELETE FROM geometry_columns WHERE f_table_name=matview;
DELETE FROM matviews WHERE mv_name=matview;

RETURN;
END
$BODY$
LANGUAGE 'plpgsql' VOLATILE SECURITY DEFINER
COST 100;
ALTER FUNCTION drop_matview_map(name) OWNER TO postgres;

Selanjutnya adalah fungsi untuk melakukan refresh terhadap peta permanen:

Tujuan:
- melakukan refresh terhadap peta permanen yang memiliki struktur tabel sama dengan peta view.

Input:
- $1 untuk judul peta permanen yang akan direfresh

-- Function: refresh_matview(name)

-- DROP FUNCTION refresh_matview(name);

CREATE OR REPLACE FUNCTION refresh_matview(name)
RETURNS void AS
$BODY$
DECLARE
matview ALIAS FOR $1;
entry matviews%ROWTYPE;
BEGIN

SELECT * INTO entry FROM matviews WHERE mv_name = matview;

IF NOT FOUND THEN
RAISE EXCEPTION 'Materialized view % does not exist.', matview;
END IF;

EXECUTE 'DELETE FROM ' || matview;
EXECUTE 'INSERT INTO ' || matview
|| ' SELECT * FROM ' || entry.v_name;

UPDATE matviews
SET last_refresh=CURRENT_TIMESTAMP
WHERE mv_name=matview;

RETURN;
END
$BODY$
LANGUAGE 'plpgsql' VOLATILE SECURITY DEFINER
COST 100;
ALTER FUNCTION refresh_matview(name) OWNER TO postgres;


Udah lengkap nih fungsi-fungsi materialized view peta untuk Postgisnya.

So sekarang implementasinya:
Saya gunakan:
viewmap1, untuk judul peta view dan
map1, untuk judul peta permanen.
4326, sebagai kode SRID untuk peta basisdata yang memiliki proyeksi Derajat Desimal.

Bila materialized view peta baru pertama kali dibuat, maka peta membutuhkan struktur tabel yang sama dengan peta view, maka gunakan perintah:

SELECT create_matview_map('map1','viewmap1',4326);

Bilamana hanya ingin merefresh peta terhadap perubahan nilai data pada peta view, dapat digunakan perintah:
SELECT refresh_matview('map1');

Bilamana terjadi perubahan struktur peta view, misalnya ada perubahan syntax query dari peta view, dapat digunakan perintah:
-- hapus peta permanen
SELECT drop_matview_map('map1');

-- buat peta permanen dengan struktur peta view terbaru
SELECT create_matview_map('map1','viewmap1',4326);


Untuk menghapus materialized view peta secara permanen dapat digunakan perintah:
SELECT drop_matview_map('map1');


That's all folks. Silahkan modifikasi sesukanya, so far ini yang Saya gunakan untuk menangani 30-an layer peta. 15 diantaranya adalah peta dinamis yang perlu diupdate secara harian/bulanan/tahunan.

Untuk Materialized View yang khusus format table alphanumerik (bukan peta) dapat menuju artikel ttg materialized view or snapshot.
Dimana artikel tersebut menjadi dasar tulisan map materialized view ini.

Sebagai komparasi dengan oracle dapat dibaca lewat artikel materialized view pada Oracle, yang ternyata fungsi tersebut built-in.

Best regards
[irmant]

Labels: ,


Friday, January 09, 2009

TableView Peta pada Postgis

Peta dalam postgresql bisa dimungkinkan karena skema database postgresql telah mendukung data geometri yang berupa titik, garis, poligon, multi-garis, multi-poligon, dan multi-titik.
Sehingga, ketika kita membuat table view yang merupakan hasil join sembarang tabel, ditambah sebuah tabel yang memiliki kolom bertipe geometry, kemudian terhubung melalui kolom refensi yang sama, maka tabel tersebut memungkinkan untuk ditayangkan dalam bentuk peta.
Contohnya adalah script berikut, yang akan membuat view "tabelpeta_join", terdiri dari tabel bergeometri berjudul "tabel_peta", dijoin dengan
tabel biasa berjudul "tabel_data", berdasarkan ID_2008, maka kalimat querynya adalah:

CREATE OR REPLACE VIEW tabelpeta_join AS SELECT p.*, b.uid
FROM tabel_peta p
LEFT JOIN tabel_data d
ON (p.id_2008=d.id_2008);

Nah meskipun query berjalan sukses tanpa error, ditandai kalimat
Query result in 50ms,
bukan berarti table view "tabelpeta_join" dapat langsung diakses dari aplikasi GIS.

Hal ini disebabkan karena file geometri tersebut belum terdaftar pada tabel daftar data spasial-nya postgis.
Tabel daftar data spatial postgis bernama "geometry_columns". Tabel ini mengatur berbagai referensi proyeksi, kolom geometri, SRID, dari sebuah tabel.

So, table view "tabelpeta_join" tadi musti didaftarkan dulu ke tabel tersebut dengan perintah umum:

INSERT INTO geometry_columns (f_table_catalog, f_table_schema, f_table_name,
f_geometry_column, coord_dimension, srid, type) VALUES ('', 'public', 'tabelpeta_join', 'geometry', 2, 4326, 'GEOMETRY');


Bagi yang penasaran kode 2 merupakan kode referensi dimensi koordinat, dan kode 4326
merupakan kode SRID untuk proyeksi Latitude/Longitude atau derajat desimal.

Berikut adalah tahapan untuk membuat tabel peta permanen bukan view.
CREATE TABLE namatabel
AS select sum(td_2008,td_2008) as TD_2008 from prod;

--1. PRIMARY KEY:
ALTER TABLE namatabel
ADD CONSTRAINT namatabel_pkey PRIMARY KEY(gid);

--2. Tambahkan NDIMS:
ALTER TABLE namatabel
ADD CONSTRAINT enforce_dims_geometry CHECK (ndims(geometry) = 2);

--3. Tambahkan SRID:

ALTER TABLE namatabel
ADD CONSTRAINT enforce_srid_geometry CHECK (srid(geometry) = 4326);

--4. Buat index:
CREATE INDEX namatabel_geometry_sidx
ON namatabel USING gist (geometry);

--5. Daftarkan pada geometry columns:
INSERT INTO geometry_columns (f_table_catalog, f_table_schema, f_table_name,
f_geometry_column, coord_dimension, srid, type) VALUES ('', 'public', 'namatabel',
'geometry', 2, 4326, 'GEOMETRY');


Selamat mencoba,
Irmant

Labels: ,


Thursday, December 11, 2008

Pengukuran Dimensi Peta dalam Postgis

Geodatabase sudah semakin keren dan canggih dewasa ini. Peta-peta sekarang udah banyak tersimpan di geodatabase, dibandingkan penyimpanan secara terpisah per file yang membuat redundan data. Padahal banyak peta-peta yang sifatnya confidential. Berikut adalah komparasi antar beberapa geodatabase, postgis, SQLServer 2008, dan MySQL di sini.

Sesudah peta masuk ke dalam postgis misal lewat tools shp2pgsql. Pertanyaan selanjutnya biasanya berkutat pada di pengukuran dimensi, selain perhitungan2 spasial lain. Function yang disiapkan postgis buanyak. Diawali dengan code ST_*, misal untuk menghitung luas area
menggunakan function ST_area, menghitung panjang menggunakan ST_length, dst.

Nah yang jadi pertanyaan klasik adalah, kok nilai perhitungan areanya keliru?
Misal perintah SQL-nya:
SELECT blok, st_area(geometry)/10000 as hectares
FROM areal order by blok asc
Menghasilkan luas per blok:
R1: 2.513432432
R2: 1.3432566549
dst...
Nilai luas ini keliru, setelah dibandingkan dengan hasil perhitungan software mapping.

Nah ini yang menjadi pertanyaan klasik, dan jawabannya terletak pada proyeksi peta yang kita masukkan dalam geodatabase.

Peta di Indonesia ada 4 macam proyeksi:
1. proyeksi lokal (asal gambar dari peta kertas tanpa koordinat),
2. proyeksi Derajat Desimal
3. Proyeksi Universal Transverse Mercantor (UTM)
4. Proyeksi TM3

Untuk peta proyeksi lokal yang biasanya satuan meter, ya ukuran luasnya dijamin pas, karena dimensinya tanpa melibatkan proyeksi muka bumi proj4. Sementara kalo kita inputnya peta derajat desimal, outputnya keliru, kenapa? Karena output proyeksi derajat desimal adalah derajat, bukan meter.

Padahal yang pengen dikeluarkan adalah satuan meter/km/hektar... ya tho ya tho...

Untuk melakukan pengubahan satuan ini kita perlu tau aturan main geodatabase postgis. Yaitu perlunya dilibatkan yang namanya SRID (Spatial Reference Identification).
Kongkretnya gini untuk peta shapefile berproyeksi derajat desimal memiliki kode SRID = 4236.
Sementara untuk UTM, dibagi kedalam 2 bagian satuan 6 derajat:
- zone x north.
- zone x south.
Zone x indonesia umumnya dari zone 46- hingga zone 54.

Kode SRID untuk UTM bisa dilihat begini:
north: 326
south: 327
Zonanya mengikuti bro:

So misalnya peta tersebut yang ada pada UTM zona 49S, brati kode SRID-nya:
327 (kode south) + 49 (zona 49) = 32749.
Misal UTM zona 47N brati kode SRID-nya
326 (kode north) + 49 (zona 49) = 32647.

Sesudah Anda memahami fakta ini, maka selanjutnya adalah mengganti perintah SQL perhitungan luas ini dari koordinat derajat desimal dengan output derajat:
SELECT blok, st_area(geometry)/10000 as hectares
FROM areal order by blok asc
menjadi proyeksi UTM zona 49s dengan satuan dimensi meter:
SELECT blok, st_area(st_transform(geometry, 32749))/10000 as hectares
FROM areal order by blok asc

Outputnya:
R1: 31.5991234 hektar
R2: 45.1234322 hektar
dst... nahhhh ini baru beneerrr!

Selamat mencoba teman-teman... :D

Labels: ,


Thursday, April 24, 2008

SRID dan MySQL problem

Perintah berikut ditujukan untuk menghitung distance obyek garis (Linestring) yang disimpan dalam kolom geometry 'G' pada tabel GEOM.
Acuan kodenya adalah perintah LineFromText(wkt[,srid])
dimana wkt merupakan obyek geometri dalam format WKT/WKB.
dan kode SRID merupakan kode Spatial Reference ID.

Gw coba perintah ini:

SELECT GLength(LineFromText(asText(g), 4236)) FROM geom LIMIT 0, 30
outputnya: 
0.012685477748776
0.0087030137100028


SELECT GLength(LineFromText(asText(g), 1)) FROM geom LIMIT 0, 30
outputnya:
0.012685477748776
0.0087030137100028

Liat dua hasil output di atas, nilai outputnya sama kan...

Pdhl saya sudah memberikan kode SRID yang berbeda, dimana kode '1' itu kode SRID sesuai tabel spatial_ref_sys. Yang '4236' merupakan kode EPSG WGS 1984. Meski menggunakan MySQL seri 5.xx tyt perhitungan jarak/luas/dimensi/perimeter
mengacu pada planar coordinate system TIDAK mengacu pada kode EPSG/SRID.

Sesuai kalimat yang ditulis dlm manualnya:
Its SRID, or Spatial Reference Identifier. This value identifies the geometry's associated Spatial Reference System that describes the coordinate space in which the geometry object is defined.
In MySQL, the
SRID value is just an integer associated with the geometry value. All calculations are done assuming Euclidean (planar) geometry. Its coordinates in its Spatial Reference System, represented as double-precision (eight-byte) numbers. All non-empty geometries include at least one pair of (X,Y) coordinates. Empty geometries contain no coordinates.
Coordinates are related to the SRID. For example, in different coordinate systems, the distance between two objects may differ even when objects have the same coordinates, because the distance on the planar coordinate system and the distance on the geocentric system (coordinates on the Earth's surface) are different things.


Pantesan Mapserver supportnya ke Postgis, SRID itu menjadi kata kunci akurasi proyeksi. Yah... kita tunggu saja kelanjutan perkembangan mysql spatial :D

Labels: ,


Tuesday, February 27, 2007

Mainan Wikimapia yukkk....


Coba deh tunggu sampe gambar di atas muncul semua gambar satelitnya. Terus tinggal arahkan kursor mouse pada kotak-kotak tersebut. :D

Menandai suatu lokasi itu merupakan suatu hal yang menarik. Apalagi daerah itu merupakan suatu tempat kenangan, misalnya: tempat tinggal, tempat kongkow yang te o pe be ge te, rumah pacar, tempat kerja, apartemen selingkuhan, dst. Apalagi kalo kita bisa menambahkan atribut berupa foto didalamnya, wuihhhh... sannggaaatttt menarik! Ternyata, ada satu website yang menyediakan layanan tersebut yaitu WikiMapia. Layanan ini berbasiskan mesin google API, dimana data satelit atau data peta vektor menjadi latar petanya. Coba deh klik di sini, dijamin Anda akan langsung tau apa yang saya maksud. Disitu ada yang buat kotak kampus, ada kotak lokasi angkringan, ada kos-kosan, ada kotak lokasi tempat 'razia motor', tempat siomay paling enak, dst.

Nah sisanya adalah mengenai fitur-fiturnya.
Coba arahkan kursor mouse ke tulisan WikiMapia dibagian pojok kiri atas...
Akan muncul gambar berikut:
- Home, balik ke halaman utama Wikimapia.
- Change language, ganti bahasa yang digunakan, sayang layanan dalam bahasa Indonesia belum tersedia.
- Map on your page, digunakan untuk menambahkan peta lokasi yang kita pilih pada halaman website yang kita punya. Kalo misalnya kita punya blog di blogger, bisa kita letakkan pada saat kita posting menggunakan mode Edit HTML.
- WikiMapia FAQ, tanya jawab tentang WikiMapia
- Login/Register, bilamana kita ingin registrasi atau login, penandaan lokasi sementara ini tidak perlu membutukan login/register.

Bila Anda arahkan ke bagian View, akan muncul menu berikut:
- Auto, pemilihan otomatis.
- Map, mode peta vektor
- Hybrid, mode paling hemat bandwidth
- Satelite, mode citra satelit saja yang ditampilkan
- No place, tidak ada kotak-kotak lokasi tertandai.
- Approved places, kotak lokasi tertandai yang sudah disetujui
- All places, seluruh kotak lokasi tertandai.
Untuk membuat kotak area informasi. Coba aja klik tombol Add Place, nah akan muncul kotak dengan tombol Save dan Cancel...
Sesuaikan kotak lokasi melalui pojok kotaknya,
Berikutnya akan muncul tampilan isian informasi obyek, bilamana anda menekan tombol save. Bilamana gak yakin lokasi tersebut, klik tombol cancel.

Pilih jenis obyeknya.
Beri judul (title), judul ini akan muncul ketika seseorang mengarahkan kursor pada kotak lokasi.

informasi deskripsi (description), informasi ini akan muncul bilamana kita melakukan klik pada lokasi tersebut.
Tags, tags merupakan kata kunci obyek tersebut yang nantinya akan memudahkan seseorang menemukan kotak lokasi yang kita buat melalui kolom pencarian (search), misalnya "SMA 6 Jogjakarta".

Pada WikiMapia ini juga terdapat fasilitas pencarian. Yang perlu dilakukan adalah mengisikan nama lokasi yang menarik, misalnya "SMA", dst, maka kita akan mendapatkan baris informasi lokasi tertandai. Bilamana di 'klik' salah satu baris informasi segera meluncur menuju lokasi itu.

Mending langsung dicoba aja deh di sini. OK.

[irmant]

Labels: ,


Bila peta bakosurtanal salah

Ini curhatnya supervisor peta bakosurtanal. Pihak yang punya otoritas untuk menangani pembuatan peta-peta dasar di Indonesia. Menarik sekali untuk disimak. Sumber: RSGISForum-net
Banyak orang yang sering "menuduh" bahwa "Peta Bakosurtanal salah", dan membuat banyak orang kelimpungan. Tuduhan itu biasanya diterima oleh "front-desk", yaitu Pusjasinfo (Bu Diah!) atau orang-orang Bakosurtanal yang sedang ketemu orang di luar (konferensi, bintek, sosialisasi). Dan terkadang jawaban yang diberikan kurang memuaskan juga, karena ya banyak yang tidak tahu soal dapurnya, bagaimana produk peta itu terbuat.

Complain lain yang pernah saya terima adalah:
1. Kasus pulau Sangihe atau pulau Rondo yang konon tidak ada di peta Bako hanyalah salah satu contoh.
2. Ada waduk di sebuah kabupaten yang tidak digambar, dan ini konon menyesatkan proyek irigasi di sana.
3. Pertemuan sungai di Sulawesi keliru, dan akibatnya penelitian masalah Anoa oleh LIPI jadi meleset.
4. Ada bukit di suatu tanjung di Kalimantan yang jadi landmark nelayan, koq di peta tidak ada.
5. Ada jalan-jalan yang tidak digambar, atau digambar tapi peringkatnya keliru (jalannya lebar sekali tetapi koq simbolnya jalan lokal).
6. Ada pemukiman yang salah nama, atau bahkan punya nama ganda.
7. Ada penutup lahan yang di sheet yang satu hutan, dan di sheet sebelahnya tegalan.
8. Sebuah kecamatan yang sekarang di Kabupaten B ternyata masih digambar di Kabupaten A
9. Batas darat antara Desa P,Q,R,S itu masih sengketa, koq di peta Bakosurtanal sudah digambar.
10. Batas laut dua Kabupaten Kepulauan di Peta Bakosurtanal berbeda dengan UU Pembentukan Kabupaten ybs, ini sangat merugikan karena luas mempengaruhi hitungan DAU.
Udahlah, 10 saja cukup. Kalau diinventarisir benar bisa jadi bahan disertasi nich ... :-)


Dari sisi dapur, saya bisa memberi penjelasan umum sbb:

“Complain kesalahan peta” dapat dibagi menjadi dua:

1. Salah memang pada peta, dan ini dapat bersumber dari beberapa hal:

1.1. Delay antara akuisisi data, survey lapangan dengan publikasi peta.

Kita belum punya sistem yang bisa menghasilkan peta sekejap mata, untuk wilayah yang amat besar. Pusat PDRTR, dapurnya peta RBI Bakosurtanal, hanya memiliki kemampuan menghasilkan maksimum 200 NLP per tahun (atau kira-kira 150.000 km2 atau 15 juta hektar), ini sudah dengan dikeroyok beberapa perusahaan / konsultan pemetaan. Ingat luas Indonesia kira-kira 190 juta hektar! Bikin peta itu tidak sekedar motret / ambil
citra, terus dikasih toponimi, dilayout, terus cetak. Kalau mau gitu ya cepat, tapi produknya bukan peta RBI (rupa bumi indonesia), jadi nanti komplainnya lebih banyak lagi ….
Vendor teknologi (seperti Radar atau Satellite Image) suka “nyombong” bahwa mengambil data dengan teknologi mereka akan cepat dan murah. Iya ngambilnya … mrosesnya, berapa tahun? Proyek SRTM itu motretnya dari spaceshuttle cuma 1 minggu, data baru keluar setelah 5 tahun! Itupun cuma DSM, bukan DTM, tidak ada interpretasi menjadi topographic line map, tidak ada toponimi yang rinci …

Walhasil, apa yang kita potret, yang masih kita coba update lagi ketika survey lapangan, bisa saja sudah berubah lagi pada saat publikasi. Karena itu, ketika ada complain seperti nomor 2 (waduk terlewat), 5 (jalan salah), 6 (pemukiman salah), 7
(penutup lahan) salah, ya bisa saja. Tapi cobalah berpikir positif, dari 1000 objek di peta, berapa biji yang salah?


1.2. Data yang ada memang tidak memadai.

Beberapa kali data yang kita butuhkan untuk membuat peta memang kurang memadai. Padahal Bakosurtanal selalu mencoba menggunakan last technology. Kita pernah mencoba pakai SPOT5-Stereo (resolusi 5 meter) untuk mengupdate peta Kalimantan Barat skala 1:50.000. Sudah order ke SPOT, dari 22 stereopair (44 scene) yang dibutuhkan, sampai Oktober baru ada 4 pair (8 scene) yang memenuhi syarat untuk stereoscopy. Yang lainnya scene ada tapi satu atau keduanya awan melulu. Bingung kan?
Untuk mengatasi itu pernah juga pakai radargrametry dari citra Radarsat. Pas jadi DEM-nya, ada kenampakan-kenampakan aneh, gunung-gunung yang menjulang sampai ke langit (H > 10.000 meter). Saya tanya ke Radarsat, solusi mereka “buldozing” saja.
Ketika kita pangkas, akibatnya ada gunung yang ikut hilang (kasus complain no 4).
Untuk optimasi (penghematan) anggaran, kami pernah pakai foto-foto arsip HPH skala 1:20.000. Tetapi ketika untuk dibikin peta, pusing juga, karena foto-foto itu tidak mengcover perkotaan (kan memang tidak ada hutan di kota!). Selain itu, foto-foto itu
sering tidak dilengkapi dengan prasyarat untuk fotogrametri (seperti info kalibrasi kamera dsb).
Jenis kamera dan skalanya juga heterogen, sehingga kalau diolah pakai softcopy fotogrametri pasti trouble. Pas disurvey, juga sudah banyak tampilan yang berubah, sehingga identifikasi untuk titik GCP yang mau diukur dg GPS sangat sulit.

1.3. Sistem pembuatan yang distributed dan bertahap.

Karena tidak mungkin memetakan Indonesia sekaligus, kita membuatnya bertahap. Tahun 2006 misalnya, kita petakan sebagian Kaltim, Kalteng dan Kalbar. Ada 7 kontraktor swasta yang terlibat. Tahun-tahun sebelumnya juga mirip. Nah ketika data antar kontraktor dalam satu tahun itu digabung, pasti ada yang tidak matched(kasus complain no. 7). Harus kita akui, bahwa SDM di persh-persh swasta kita juga belum semua profesional. Banyak yang hanya dikarbit (training on the job) ketika ada proyek, dan yang pinter-pinter suka kabur setelah itu.
Kami di Bakosurtanal punya kewajiban menjadikan data antar kontraktor itu jadi smooth – but it is not easy! Meski spec jelas, dan prosedur supervisi dijalankan, tetap saja map is not only science, but art! Ini baru dari tahun yang sama, bagaimana kalau yang dari tahun berbeda dicoba di-matched kan? Wah mabuk deh! Peta di Luar Negeri juga akan mengalami hal yang sama.
Kadang unmatching ini cuma di planimetry (mungkin ada jalan baru, penutup lahan sudah berubah atau ada nama baru). Masih bisa diatasi, meski kita bingung juga, ini yang lama ikutan diupdate tidak, tetapi sumber data yang baru kan tidak ada… Yang maha rumit kalau yang tidak matched ini di 3-dimensi, yakni kontur atau sungai. Kalau kontur dipas-pasin masih bisa, kalau sungai? Sungai tidak mungkin naik turun! Sungai diedit, otomatis kontur berubah. Kontur berubah, batas bisa berubah. Batas berubah, landcover harus ikut. Landcover ikut, toponimi terpengaruh …

1.4. Sistem produksi yang belum terintegrasi dari A sampai Z

Kami sekarang menggunakan teknologi digital. Tetapi teknologi (software) yang dipakai belum menyatu. Untuk fotogrametri, kita pakai Datem dan Soccet Set.
Untuk Image kita pakai Er-Mapper, PCI atau ENVI. Untuk interpretasi dan editing paling enak pakai AutoCAD. Untuk pembentukan topologi pakai ArcInfo/ArcView/ArcGIS. Untuk desktop kartografi dan separasi kita pakai FreeHand atau CorelDraw. Belum
semua software ini bisa diconnect ke database spatial (seperti Oracle atau PostgreSQL). Nah terkadang, operator menemukan kejanggalan ketika sudah di level
kartografi. Untuk memperbaikinya, harusnya kembali ke hulu, ke foto lagi, ke Soccet Set lagi. Tapi apakah ini selalu bisa? Tidak. Kadang waktunya sudah mepet. Jadi akhirnya yang diperbaiki kartonya saja.
Cetakannya akan benar. Namun data digitalnya (misal DXF atau SHP-nya) masih salah.

2. Salah pada pengguna, ini juga beberapa hal:

2.1. Pengguna tidak memahami sistem pemetaan sistematis.

Peta RBI dibuat dengan metode sheetwise (skala 1:50.000, tiap sheet mengcover area 15’ x 15’). Jadi tidak dibuat berdasarkan area administrasi. Pulau-pulau terluar, sering terletak ekstrem jauh di luar sheet normal, makanya bisa tidak masuk.
Solusinya memang dibuat Inset. Kadang mau dibuat inset, data yang tersedia belum memenuhi standar minimal peta RBI (misalnya tidak ada data kontur dll).

2.2. Pengguna tidak memahami cara membaca peta.

Complain no 3 di atas, setelah saya telusuri ternyata hanya didasarkan pada peta yang jauh lebih kecil (peta 1:500.000 buatan Departemen Kehutanan). Jadi ketika ybs melapor bahwa pertemuan sungai keliru, dari petanya saja dia sudah bisa meleset 500 meter (1 mm = 500 meter). Apalagi ternyata ybs tidak membawa GPS. Jangan-jangan identifikasi dia yang keliru.

2.3. Pengguna tidak membaca disclaimer masalah batas.

Ingat di setiap peta RBI ada disclaimer bahwa batas yang digambar bukanlah referensi resmi. Di era otonomi daerah seperti sekarang, di mana daerah-daerah baru bermunculan seperti jamur di musim hujan, dan mereka tidak ada kewajiban melapor ke Bakosurtanal,
sulit bagi Bakosurtanal untuk mengikuti perkembangan batas yang baru (complain no 8 & 9). Untuk peta 1:250.000 Papua, kami akhirnya memutuskan untuk menaruh toponiminya, tetapi tidak menggambar garis batasnya. Takut nanti garis batas sementara ini malah
dijadikan legitimasi konflik antar daerah yang memicu perang suku.
Untuk batas laut lebih rumit lagi (complain no 10), karena rezim yang ada UU sebenarnya kewenangan laut Kabupaten hanya terbatas 4 mil. Sedang di peta-peta,
kadang kita asal taruh saja batas di tengah-tengah (padahal lebih dari 4 mil). Untuk hitungan DAU, luas daratan yang dipakai adalah yang kami hitung dari batas sementara di peta RBI. Mau batas yang definitif? Ya tunggu HUT RI yang ke-100 … kalau anggaran dan SDMnya masih begini terus … :-) Saya ada paper hitungan tingkat kesalahan data luas yang ada dan pengaruhnya ke kesalahan uang DAU.

2.4. Pengguna tidak familier dengan legenda atau format digital yang ada.

Peta RBI dijual pada bentuk cetak atau digital format DXF atau ArcInfo (coverage or SHP). Untuk memahami bentuk cetak ya harus familiar dengan legenda peta RBI. Untuk peta digital lebih sulit, karena ada lebih dari 200 kode layer. Kedalaman informasi peta digital jauh lebih tinggi dari peta cetak. Untuk mengubah dari DXF ke SHP, kami menggunakan script SML khusus, jadi tidak asal impor DXF ke ArcInfo/ArcView. Pasti
gagal kalau seperti itu.

Jadi sebelum ribut PETA BAKO SALAH, coba introspeksi
dulu …

Kita sama-sama sedang membangun sebuah sistem pemetaan Indonesia yang handal, yang meliputi SDM, teknologi (hardware, software) , data, organisasi dan budget.

Bakosurtanal is not the sole player. Kita cuma kebetulan menurut undang-undang dapat amanah untuk menjadi koordinator sekaligus dinamisator dan katalysatornya … Kualitas peta ditentukan juga oleh semua stakeholder yang terlibat. Dan SDM mereka tergantung mutu pendidikan tinggi kita juga. Pendidikan tinggi tergantung pendidikan SMA, SMP, SD. Yang SD payah … karena APBN Pendidikan realnya masih jauh di bawah yang diamanahkan UUD, yaitu 20%. Wah koq jadi ke politik larinya …

Agar kira-kira dapat gambaran lengkap tentang proses pemetaan dan apa yang sering dituduhkan sebagai kesalahan.

Kesalahan itu memang kadang terjadi, bukan karena tidak updated, tapi memang "salah" - maksudnya pada level skala tersebut. Kami tim supervisi, biasanya membagi dalam kesalahan syntax dan kesalahan semantik.
Kalau kita tidak mengenal langsung objek realnya, maka kita hanya bisa kenali kesalahan syntax, misalnya ada tambak di pegunungan, atau ada pemukiman tanpa akses jalan/sungai, maka itu pasti salah.

Tetapi kalau yang semantik, misalnya apakah yang benar "Gunung Merbabu" atau "Gunung Marbabu", maka ini susah. Kita harus punya source yang dapat dipercaya. Jadi yang berani nyalahin (mau merevisi, mengupdate) harus lebih terpercaya dari info pertama.

Usia data di dalam peta itu tidak sama. Data kontur/topografi saya kira bertahan sampai 50 tahun, kecuali ada pembangunan besar-besaran yang merubah landskap. Penutup lahan (vegetasi) bisa berubah setiap musim. Pemukiman dan jalan berubah menurut pembangunan, kalau di kota-kota kecil di daerah, amat sangat lambat perubahannya. Batas administrasi dan toponimi, berubah immediately kalau ada policy dari pemerintah.

Dari seluruh komponen peta, yang termahal adalah topografi (kontur, alur, sungai, garis pantai). Ini hampir 70% dari biaya produksi. Paling murah adalah jalan utama -- ini yang bisa diupdate sendiri pakai gps-tracking oleh masyarakat. Siapa yang mau meng-update jalan-jalan setapak di hutan / pegunungan secara sistematis?

Usul pak Aslan tentang "update berbasis masyarakat" cukup menarik, tetapi perlu dicermati. Mengupdate yang seperti apa? Secara umum, di setiap lembar peta Bako ada kalimat: "AGAR MEMBERI TAHU BAKOSURTANAL KALAU DITEMUKAN KESALAHAN DI PETA ITU". Kami pernah coba lho ... ternyata sangat sedikit yang memberi tahu dan yang sedikit inipun, pemberitahuannya sulit ditindaklanjuti.

Menurut saya, kalau masyarakat mau bikin peta sendiri, gps-tracking sendiri, atau men-derivate peta-peta turunan dari peta Bako, terus disempurnakan sendiri, silakan saja. Itu peta Jakarta dari Gunther yang sangat ngetop itu, topografinya juga ambil dari Bako koq. Saya lihat sendiri agreementnya sekitar 10 tahun y.l. Jadi dia sangat santun, bikin perjanjian mutual,
jadi Bako juga teoretis boleh jual produk dia.

Investasi yang dikeluarkan Gunther saya kira tidak akan sampai sepersepuluh yang dikeluarkan APBN melalui Bako. Tahun 2006, PT Enrique juga mengeluarkan peta jalan untuk Bandaaceh dari petatop Bako yang terbaru (pasca tsunami). Untuk bikin peta jalan itu,
investasi dia hanya 100.000 Euro. Bako mengeluarkan dana untuk pemotretan, GCP, interpretasi, fieldcheck toponim dsb lebih dari 2 juta US$.

Jadi saya kira yang penting jangan meng-klaim sesuatu yang bukan miliknya, atau sesuatu lebih hebat dari sebenarnya.

Dr.-Ing. Fahmi Amhar
Koordinator Supervisi
Pusat Pemetaan Dasar Rupabumi & Tata Ruang,
Bakosurtanal.

Labels:


Monday, February 26, 2007

Tanda-tanda terjadinya angin puting beliung

Bencana alam angin puting beliung itu bersifat lokal, tapi sanggup mengangkat atap rumah dan memporak-porandakan permukiman. Hal ini disebabkan karena kecepatannya hingga 120 km/jam, dan berlangsung antara 1-5 menit.
Pergerakan angin akan lebih cepat sampai ke daratan jika di wilayah daratan memantulkan panas dan bertanah lapang tanpa bebukitan. Gedung-gedung di perkotaan dan tanah tandus lapang menyumbang terjadinya angin itu.
Karena sifatnya yang lokal, luasannya kurang dari 10 km maupun durasinya yang sangat singat maka jika kita menggunakan model cuaca dengan grib 0,75 derajat (82,5 km), maka mempunyai perbandingan 1 : 8, kecuali kita mempunyai meso scal dengan domain yang sangat kecil kurang lebih 10 km, namun demikian fenomena tersebut sangat perlu diketahui oleh kita yang ada di luar rumah, seperti :
- Terjadi terutama di daerah yang kurang vegetasi dan kota yang banyak gedung-gedung penyebab panas di daratan.
- lebih sering terjadi pada peralihan musim kemarau ke musim hujan
- lebih sering terjadi pada siang atau sore hari, tapi terkadang pada malam hari
- Satu dua hari sebelumnya udara pada malam hari hingga pagi hari terasa panas/pengap/sumu’
- Pada hari berikutnya tumbuh awan cumulus (awan berlapis-lapis), diantara awan tersebut ada satu jenis awan yang mempunyai batas tepinya sangat jelas berwarna abu-abu menjulang tinggi seperti bunga kol.
- Awan itu ketebalannya bisa mencapai 9 kilometer, dan puncak awan bisa berupa es. Ciri-ciri selanjutnya, sesaat sebelum kejadian puting beliung, biasanya berembus angin sepoi yang berasa dingin disekitar tempat kita berdiri.
- Tahap berikutnya adalah awan tersebut akan cepat berubah warna menjadi hitam gelap
- perhatikan pepohonan disekitar tempat kita berdiri, apakah ada dahan atau ranting yang sudah bergoyang cepat, jika ada maka hujan dan angin kencang sudah akan datang
- biasanya hujan pertama kali turun adalah hujan tiba-tiba dengan deras, apabila hujan nya gerimis maka kejadian angin kencang jauh dari lingkungan kita berdiri
- Terdengar sambaran petir yang cukup keras, apabila indikator tersebut dirasakan oleh kita maka ada kemungkinan hujan lebat+petir dan angin kencang akan terjadi
- Jika 1 atau 3 hari berturut –turut tidak ada hujan pada musim penghujan, maka ada kemungkinan hujan deras yang pertama kali turun diikuti angin kencang baik yang masuk dalam kategori puting beliung maupun tidak.

Sumber:
* Rudy Teguh Imananta
Pusat Gempa Nasional - Pusat Sistem Data dan Informasi Geofisika
Badan Meteorologi dan Geofisika (BMG)
Jl. Angkasa I No 2, Kemayoran Jakarta Pusat
* website pelajaran dari NASA tentang badai tropis.

Labels:


Tuesday, February 20, 2007

Faktor-faktor penyebab banjir di Jakarta

Jumat pagi 2 Februari itu saya yakin sekali kalo Jakarta bakal banjir seperti tahun 2002, hujan yang tidak kunjung reda, bahkan semakin kenceng pagi itu. Ternyata hujan hari itu merupakan curah hujan tertinggi di Jakarta 10 tahun terakhir. Mulai dari jam 10 malem tanggal 1 Februari sampe jam 12 siang esok harinya. Keyakinan saya terbukti waktu saya menyalakan tipi pagi itu. Banjir dan kemacetan terjadi dimana-mana. Saya putuskan pagi itu gak usah masuk kantor, meski kalo jalan kaki cuman 6-7 menit :D. Sambil baca peta Jakarta buatan Pak Gunter, saya mencari lokasi-lokasi banjir yang disebutkan oleh stasiun televisi. Hmmmm, ternyata menarik sekali distribusi lokasi banjir tersebut. Faktor secara umum dibagi menjadi dua bagian yang terkait satu sama lain, yaitu faktor fisik dan faktor manusia. Faktor fisik sederhana dapat digunakan siklus hidrologi.


Hujan deras dengan curah hujan tinggi, menghasilkan banjir kiriman dari daerah Puncak yang kabarnya ’gundul’, mengalir ke wilayah Jakarta menuju ke Laut Jawa. Untuk mencapai Laut Jawa, aliran air ini mengalir melalui sungai-sungai meander yang dibeberapa tempat terhalang sampah, drainease buruk, pembangunan saluran air yang parsial, perubahan fungsi lahan, plus ketinggian muka air laut yang sejajar pada beberapa tempat, menghasilkan aliran permukaan yang tidak beraturan dan tentunya banjir...


CURAH HUJAN

Ada cerita saat banjir kemaren bahwa, seorang teman apartemennya ikut kebanjiran gara-gara saluran air di kamar mandinya mampet. Nah kalo airnya dikit tentunya tidak sampai banjir kan...?! :D. Meski hujan merupakan salah satu sumber air penyebab banjir dipermukaan bumi (selain luapan air laut, bendungan jebol, pencairan glesier, dst), tetapi biasanya hujan yang paling sering disalahkan, sehingga manusia kemudian menciptakan alat pengukur curah hujan. Alat ini biasanya ada dalam stasiun pengamatan cuaca. Tidak cuman satu alat, tapi banyak alat yang dipasang tersebar pada suatu daerah. Hasil pengamatan beberapa stasiun itu kemudian digabungkan hasilnya menggunakan metode polygon thiessen untuk kemudian menghasilkan peta curah hujan dalam satuan milimeter. Curah hujan yang di atas normal tentunya berpengaruh sekali terhadap peluang banjir. Berhubung curah hujan tertinggi di Indonesia terjadi selama bulan Februari-Maret, tentunya banjir biasanya terjadi dalam periode ini.



SALURAN AIR

Banjir di Jakarta sebenernya terjadi sejak lama, Jaman Jakarta masih bernama Batavia pun sudah terjadi banjir. Dewan Pemerhati Kehutanan dan Lingkungan Tatar Sunda (DPKLTS) Soepardijono Sobirin mengatakan bahwasannya sekitar 40 persen dari luas Kota Jakarta ketinggiannya hampir sama dengan permukaan air laut. “Meskipun tidak ada pemukiman, tetap saja banjir, termasuk banjir siklus lima tahunan seperti sekarang ini”. Kondisi ini, lanjut Sobirin, diperparah dengan penataan drainase yang parsial. Di daerah Kalapa Gading, misalnya, banyak pengembang yang menawarkan perumahan elite. Namun, tidak ada sinergi antara drainase perumahan yang satu dengan perumahan lainnya. “Akibatnya, air yang mengalir hanya di situ-situ saja. Tidak bisa keluar. Bayangkan kalau kemudian terjadi hujan lebat,” kata Sobirin.


Di Jakarta, membuat selokan yang baik itu bukan merupakan budaya atau patokan tata aturan pembuatan bangunan. Rumah-rumah pada daerah pemukiman padat penduduk non-perumahan biasanya memiliki saluran air seadanya. Ukuran satu kilan tangan dipakai untuk menangani limbah rumah tangga beberapa puluh rumah. Belum lagi warga yang membuat sambungan ’buk’ rumah dengan jalan tanpa memperhatikan hubungan antar selokan, sehingga seringkali tampak ada selokan menggenang untuk tempat sampah dan selokan yang kering kerontang yang dijadikan tempat bakar sampah dalam satu rute. Jangan salah ya, gedung2 bertingkat di Jakarta pun sering tidak memperdulikan kualitas gorong-gorong di depan gedung tersebut, misalnya genangan air di daerah Balai Kartini yang selalu muncul disaat hujan.


Yang paling parah, tegas Sobirin, adalah rusaknya daerah aliran sungai (DAS). Jakarta memiliki delapan DAS, yakni Das Cisadane, Angke, Ciliwung, Rukut, Sunter, Cilincing, Cikarang, dan Bekasi.

Yang paling besar adalah Cisadane dan Ciliwung. “Yang kecil-kecil semakin kerdil dan hilang karena pemukiman. Bantaran sungai semakin hilang karena diduduki pemukiman. Para pengembang bermunculkan tanpa melihat aliran air,” kata Sobirin. Sobirin mengatakan, semestinya, 30 persen dari total luas DAS seperti Ciliwung dan Cisadane itu berbentuk hutan. Maraknya alih fungsi di beberapa daerah memberikan andil besar membuat bencana banjir. Pasalnya, kemampuan alam menampung air menjadi sangat terbatas.

MEANDERNYA SUNGAI JAKARTA
Ada 13 sungai dan anak sungai yang mengalir ke Jakarta. Sungai ini sebagian besar polanya meander, berkelak-kelok. Anda bisa cek pola meander ini pada peta Gunter mulai dari Kali Angke, Pesanggrahan, Ciliwung, Kali Krukut, dst atau wilayah2 yang disebutkan sebagai lokasi banjir di Jakarta. Sungai ini otomatis akan membuat aliran air lebih lambat dan lama tergenang sebelum mencapai titik outlet.

Kalo pernah liat kali Krukut, sungai ini masuk kategori anak sungai yang bentuknya meander juga. Lebarnya di daerah perumahan warga wilayah Bangka sekitar 5 meter, tapi jangan salah Kali Krukut ini untuk wilayah Cilandak, ada yang lebarnya hanya 2 meter. Menciut melebar menciut melebar, yang tentunya banyak terdapat jebakan-jebakan air (pothole) didalamnya.


Jebakan air ini memiliki volume air yang besar, dan siap muntah diwaktu hujan dan menghasilkan debit yang cukup besar untuk menjadi banjir. Sungai ini juga ini ditugaskan untuk menangani aliran limbah rumah tangga dan industri wilayah yang menurut saya cukup banyak. Jadi sepanjang musim penghujan normal, muka airnya termasuk tinggi. Jadi wajar kalo ada hujan agak lamaan dikit dijamin bikin banjir, misalnya pada jembatan pada daerah jalan Kapten Tendean yang menghubungkan Kuningan dengan Blok M. Dan jangan salah, pada sempadan atau dataran banjirnya pun ada beberapa perumahan elit, ya tentunya jadi langganan banjir.

Kali Krukut yang merupakan anak sungai sering meluap ke Jalan Kapten Tendean-Kuningan Barat. (Peta Gunther, 2004 dan GoogleEarth 2007).

Untuk mengurangi tinggi debit sepanjang meander ini ya sebagai solusinya mungkin perlu dibuat sudetan sepanjang meander-meander, seperti yang dilakukan pada meander-meander pada Sungai Bengawan Solo. Dengan harapan aliran air akan berjalan lebih cepat dan tidak menggenang kelamaan.


PEMBANGUNAN KOTA

Banyak penelitian yang menunjukkan fenomena perubahan penggunaan lahan sebagai pemicu banjir, terutama perubahan lahan ke arah permukiman.

Kalo kembali ke peta Gunter, tampaknya sih solusi banjir kanal yang didengungkan VOC itu gak cukup lagi. Daerah banjir itu umumnya terjadi sepanjang sempadan meander-meander sungai yang sudah beralih fungsi menjadi perumahan, fasilitas umum, rumah sakit, dst. Bisa Anda cek langsung penggunaan lahan pada wilayah sepanjang Sungai Ciliwung, meski hanya pake peta Gunter sekalipun akan tampak ruas-ruas jalan pemukiman yang sebenarnya masuk dalam batas wilayah sempadan. Perlu diingat pula kalo istilah lain dari sempadan sungai adalah ’dataran banjir’. Resiko orang tinggal di dataran banjir, ya.... kebanjiran.


Dataran banjir yang ada disepanjang meander Kali Ciliwung. (GoogleEarth, 2007)

Tata penggunaan lahan yang sudah kadung daerah Jakarta, diistilahkan seperti membuat telor ceplok di wajan penggorengan dan membentuk kerak telor yang tidak beraturan bentuknya (kompas.com). Rawa diembat, sempadan diembat, lahan hijau diembat. Resapan air di-’delete’, masih mending kalo lokasi-lokasi tersebut bisa di-‘cut’ lalu di‘paste’ di tempat lain. Tentunya akan sulit buat pemerintah DKI Jakarta mengubah lahan-lahan terbangun yang kadung ’mateng’, kembali menjadi wilayah resapan, kawasan hutan kota, dst. Apalagi mengganti fungsi rawa yang telah menjadi penjinak banjir Jakarta berabad-abad lamanya (...).

Secara teori sih perubahan penggunaan lahan rawa ke permukiman atau perkantoran sih oke, tapi seringkali syarat mutlaknya kurang diperhatikan, yaitu saluran air yang ’sempurna’.



SAMPAH

Lahan terbangun yang telah mencapai 80% dari seluruh wilayah DKI Jakarta, membuat warga Jakarta yang tinggal dipemukiman padat biasanya kesulitan untuk membuang sampah. Maka, selokan atau sungai pun menjadi media untuk tempat buang sampah atau bakar sampah, bahkan itu menjadi semacam kebiasaan. Saya sering temui anak-anak kecil yang malah disuruh buang sampah di selokan oleh orang tuanya. Tentunya harapan para pembuang sampah bahwa sampah yang dibuang di selokan itu akan mengalir ke sungai tidak terjadi karena apa yang mereka buang itu malah menambah buruk saluran air yang memang sudah buruk. Tentunya ini disebabkan karena beragamnya asal muasal daerah dan karakter warga Jakarta. Ada yang kaya tapi ’ndeso’, misalnya tampak dari mobil2 niaga tahun terbaru tapi buang sampahnya di jalan, ada yang memang di kampungnya buang sampah di kali merupakan kebiasaan, dst. Ini cukup mengerikan, tapi itulah yang terjadi. Di sepanjang Sungai Ciliwung, sampah dalam bungkusan plastik menggunung.


Pernah sebuah stasiun tivi menayangkan volume sampah yang ada di pintu air Manggarai dapat dinaiki oleh pemulung saking banyaknya. Padahal kedalaman pintu air ini dapat mencapai 10 meter dan menjadi indikator waspada banjir di Jakarta. Coba bayangkan dalam sampah yang tertahan pada pintu air ini. Saya gak mau naif yah, bisa jadi saya menjadi salah satu kontributornya secara tidak langsung. Memang ada tukang sampah yang ngambilin sampah tiap hari, tapi saya juga nggak tanya sampah tersebut dibuang kemana, itu kan tanggung jawab tukang sampah itu, hehehe...

Bencana erosi selalu datang menghantui

Tanah kering kerontang banjir datang itu pasti

Isi rimba tak ada tempat berpijak lagi

Punah dengan sendirinya akibat rakus manusia

Lestarikan hutan hanya celoteh belaka

Lestarikan hutan mengapa tidak dari dulu saja

(Karya : Iwan Fals-Album Opini 1982)


SOLUSI

Kalo yang baru cari-cari rumah/kontrak,

Pilih perumahan yang jauh dari sungai dan anak sungai. Luapan banjir ini biasanya berasal dari sungai dan anak sungai. Biasanya yang terkena pertama kali adalah daerah sempadan sungai. Kadang juga ada perumahan bebas banjir yang ikut-ikut kebanjiran, gara-gara perumahan tetangga yang kebanjiran buang air (dipompa) melewati gorong-gorong perumahan bebas banjir.

Pilih daerah yang berkontur tinggi. Kontur tinggi ini bisa dipilih pada daerah-daerah Selatan Jakarta, seperti Depok, Kelapa Dua, Bogor dst. Kontur yang tinggi biasanya tidak mungkin ada pada daerah sempadan sungai. Namun demikian, meski tinggal dekat sungai, tapi kalo sungainya berbentuk lembah sungai yang dalam, ya bakal aman. Contohnya beberapa lokasi di dekat Kali Pesanggrahan, memiliki lembah sungai yang dalam.

hindari daerah-daerah yang berdekatan dengan bekas rawa. Gampangannya daerah berjudul 'Rawa', misal Rawa Buaya, Rawa Bebek, dst. Dari namanya aja udah ketahuan kalo itu daerah rawa yang alih fungsi :D. Biasanya perubahan penggunaan lahan rawa menjadi daerah terbangun, tidak diimbangi dengan pembuatan saluran air yang benar-benar sesuai. Padahal pembangunan saluran air pada daerah bekas rawa ini merupakan syarat mutlak untuk konservasi dan pengganti fungsi rawa tadi. Hasilnya banjir di daerah bekas rawa maupun sekitarnya, misal daerah Kelapa Gading.

Kalo yang udah kadung beli rumah daerah banjir, beli aja kasur pompa model DRTV. Kasur ini bisa dilipat dalam ukuran kecil sehingga mudah disimpan dan gak makan tempat. Kalo banjir tinggal dipompa untuk ngungsi.



Labels:


Thursday, February 15, 2007

Konversi Koordinat TM3-BPN

Berurusan dengan Badan Pertanahan Nasional merupakan hal yang sering dilakukan oleh orang yang mengurus surat tanah. Entah urusan jual beli, warisan, perubahan akte, dst. Meskipun denah tanah pada buku tanah itu berbentuk sket, sesungguhnya BPN memiliki sistem koordinat sendiri yang dinamakan TM3. Tentunya untuk lokasi itu, BPN memerlukan akurasi koordinat posisi lokasi yang tinggi.
Untuk itu dibuat undang-undang yang menetapkan penggunaan sistem koordinat yang dianggap akurat yaitu Transverse Mercator 3 yang lebih dikenal sebagai sistem koordinat TM3.Sistem koordinat ini memodifikasi sistem koordinat yang udah ada sebelumnya yaitu UTM (Universal Transverse Mecantor) WGS 1984, dengan cara membagi sistem proyeksi UTM 6 derajat ke 3 derajat. Sehingga dalam satu zona UTM 49 selatan misalnya, terdiri dari 2 zona TM3, yaitu TM3 zona 49.1 dan TM3 zona 49.2. Ndilalah, saya ketemu teman yang beli buku panduan TM3 terbitan Bakosurtanal pada pameran Geospasial 2006 lalu. Buku tersebut menjadi awal yang baik untuk pengembangan sistem proyeksi pada software SIG umum digunakan di Indonesia.


Saya coba memberi beberapa clue tentang cara konversi dari UTM ke TM3 menggunakan Arcview. Semoga bisa ditindak-lanjuti oleh teman-teman lain yang berkutat erat dengan produk2 ESRI.
Langkahnya adalah sbb:
1. buka sembarang file peta berkoordinat UTM pada Arcview, misal UTM WGS84 zona 49S.
2. Atur satuan jarak dan proyeksi peta dalam satuan meter (View > Properties)
3. Aktifkan ekstensi Projection Utility Wizard (File > Extensions). Ekstensi projection utility ini digunakan untuk mengubah sistem proyeksi misal dari Derajat desimal UTM atau sebaliknya.
4. Jalankan ekstensi Projection Utility (File > Arcview Projection Utility)
5. bila ada pesan error, klik OK, kemudian pilih Browse pada menu Wizard Step 1, untuk menentukan file peta yang akan diproyeksi ke TM3. Klik Next.
6. Pilih sistem proyeksi peta awal yaitu UTM WGS84 zona 49 selatan.


7. perhatikan menu bagian 'Parameters' akan tampak parameter2 yang digunakan untuk konversi sistem koordinat WGS84 zone 49s.

8. klik Next, maka projection utility wizard akan memberikan proyeksi pada file peta yang akan dikonversi (akan muncul tambahan file *.PRJ), dan akan muncul menu Wizard Step 3.

9. Nah, pada menu Step 3 bagian ini yang cukup krusial, yaitu penentuan parameter baru TM3, jadi mas-mas dan mbak-mbak perlu melihat ulang parameter dari buku tersebut.


Pada gambar berikutnya peta UTM zone 49 selatan dikonversi ke proyeksi TM3 zona 49.2, menggunakan parameter yang diambil dari buku tsb.

10. Good luck, hehehe

[irmant]
nb. Kalo produk GIS Cadcorp SIS desktop, konversi proyeksinya mah on the fly lewat map screen, meskipun datanya berformat ESRI-shapefile sekalipun.

Digambar tersebut, tampak peta ESRI shapefile (*.shp) yang menggunakan sistem proyeksi UTM WGS84 zona 49s, yang siap diklik ke proyeksi TM3. Cheers!

Labels: