DAFTAR PUSTAKA (1)
Cassettari, Seppe. (1993), Introduction to integrated geo-information management, Chapman & Hall, Great Britain.
(2)
Eddy Prahasta. (2001), Konsep-konsep Dasar Sistem Informasi Geografis, Informatika, Bandung.
(3)
Ethan Cerami. (2002), Web Services Essentials, O’Reilly.
(4)
Korte, George. (2006), The GIS Book.OnWord press, -, United States
(5)
Martin, Didiew. (2000), Professional XML, Wrox,-,United States.
(6)
Mitchell, Tyler. (2005), Web Mapping Illustrated, Oreilly, United States
(7)
Peng, Zhong-Ren; Tsou. (2003),
Internet GIS, Distributed
Geographic Information Services for the internet and wireless Network. John Wiley & Sons, Canada. (8)
Rigaux,Philippe. (2002), Spatial Databases With Application to GIS, Morgan Kaufmann publisher.
(9)
Tang, Winnie; Selwood, Jan. (2003), Connecting our world –Gis web services, ESRI Press, United States.
97
Lampiran A
Hubungan antara Kasus Guna dan Aktor
1 Membuka data konfigurasi
Tabel 1 Hubungan aktor dan reaksi pada Membuka Data Konfigurasi
Skenario Aksi Aktor
Reaksi Aplikasi
Aktor akan memulai sistem dengan 1. Modul nodemap akan melakukan membaca menjalankan aplikasi web server file konfigurasi pada aplikasi nodemap. (start-up tomcat)
2. hasil pembacaan tersebut disimpan dalam memori komputer (dimuat ke obyek data modul nodemap)
2. Mengonfigurasi Datastore Tabel 2 Hubungan Aktor dan Reaksi pada Mengonfigurasi Datastore
Skenario Aksi Aktor
Reaksi Aplikasi
1. Aktor akan memilih
1. Sistem akan membaca konfigurasi datastore dari
datastore configuration.
memory (hasil loading) data config, dan menampilkan hasilnya dalam sebuah combo pilihan.
2. Aktor memilih new
2 Sistem akan membuat masukan tentang
datastore configuration.
konfigurasi datastore, apakah menggunakan file system (lokasi), apakah menggunakan database spatial (username, password, databasename, port).
3. Aktor memilih edit
3. Sistem akan membuat masukan baru dari
datastore configuration.
datastore yang telah ada pada combo pilihan.
3. Mengonfigurasi Kenampakan
Tabel 3 Hubungan Aktor dan Reaksi pada Mengonfigurasi Kenampakan
Skenario Aksi Aktor
Reaksi Aplikasi
1. Aktor akan memilih feature
1. Sistem akan membaca konfigurasi
1
Skenario Aksi Aktor
Reaksi Aplikasi
configuration
feature type dari memory (hasil loading) data config, dan akan menampilkan hasilnya dalam sebuah combo pilihan.
2. Aktor akan memilih feature baru (new
1. Sistem akan menampilkan datastore
feature)
yang tersedia dalam combo box kemudian memilih new. 2. Sistem akan menampilkan masukan feature baru, contoh keterangan mengenai feature baru adalah : a. nama feature b. boundingbox (extent) c. spatial reference system yang digunakan (srs)
3. Aktor akan memilih edit feature baru
Sistem akan menampilkan data masukan
(edit feature)
yang lama dan pilihan masukan yang baru.
4. Menyimpan ke Data Konfigurasi Tabel 4 Hubungan aktor dan reaksi pada Menyimpan ke Data Konfigurasi
Skenario Aksi Aktor
Reaksi Aplikasi
Aktor akan memilih
Sistem akan menyimpan hasil perubahan ke file
savetoxml tombol.
xml.
5. Memanajemen layer konfigurasi
Tabel 5 Hubungan aktor dan reaksi pada Memanajemen Layer Konfigurasi
Skenario Aksi Aktor
Reaksi Aplikasi
1. Aktor membuka halaman web
1. Sistem akan menampilkan halaman
berdasarkan url yang diberikan
management layer.
2. Aktor akan menekan pilihan
2. Sistem akan menampilkan masukan
konfigurasi layer baru.
halaman management layer. Masukan
2
Skenario Aksi Aktor
Reaksi Aplikasi
3. Aktor akan menekan pilihan
Management layer ini berisi antara lain
simpan
a. Asal data b. koordinat batas penggambaran. 3. Sistem akan menyimpan masukan tersebut ke file xml.
6. Mendapatkan Peta dan Menavigasi
Tabel 6 Hubungan aktor dan reaksi pada Mendapatkan Peta dan Menavigasi
Skenario Aksi Aktor
Reaksi Aplikasi
1. Aktor membuka halaman mapedit.
1. Sistem akan membaca konfigurasi file
2. Aktor memilih tombol navigasi (pan,
xml yang dihasilkan pada management
zoom).
layer. 2. Sistem akan menampilkan gambar/image/peta sesuai dengan konfigurasi pada management layer diatas. 3. Sistem akan menampilkan peta sesuai dengan perintah navigasi dari aktor.
7. Mendapatkan informasi kenampakan
Tabel 7 Hubungan aktor dan reaksi pada Mendapatkan informasi kenampakan
Skenario Aksi Aktor
Reaksi Aplikasi
Aktor akan memilih kenampakan pada
Sistem akan menampilkan keterangan
peta yang dihasilkan.
mengenai data atribut pada kenampakan tersebut.
3
8. Memanajemen Kenampakan
Tabel 8 Hubungan Aktor dan Reaksi pada Memanajemen Kenampakan
Skenario Aksi Aktor
Reaksi Aplikasi
1. Aktor akan memilih pilihan (tombol)
1. Sistem akan menampilkan masukan
add point / add line / add poligon.
mengenai
data
interaktif
akan
atribut
dan
secara
menampung
nilai
koordinat pemilihan. 2. Aktor akan memilih tombol save.
2. Sistem akan mengirimkan xml stream (post) ke modul nodemap, kemudian di modul nodemap akan memprosesnya. 3. Sistem akan menampilkan pesan success jika sukses dan fail jika gagal.
3. Aktor akan memilih kenampakan,
4.Sistem akan mengirimkan xml stream
mengisi masukan data dan menekan
(post) ke modul nodemap, kemudian di
tombol save/delete
modul nodemap akan memprosesnya. 5. Sistem akan menampilkan pesan success jika sukses dan fail jika gagal.
4
Lampiran B Kode Penting 1. XMLConfigWriter.java public void serializeNode(Node node, Writer writer, String indentLevel) throws IOException { switch (node.getNodeType()) { case Node.DOCUMENT_NODE: writer.write(""); writer.write(lineSeparator); NodeList nodes = node.getChildNodes(); if (nodes != null) { for (int i = 0; i < nodes.getLength(); i++) { serializeNode(nodes.item(i), writer, ""); } } break; case Node.ELEMENT_NODE: String name = node.getNodeName(); writer.write(indentLevel + "<" + name); NamedNodeMap attributes = node.getAttributes(); for (int i = 0; i < attributes.getLength(); i++) { Node current = attributes.item(i); writer.write(" " + current.getNodeName() + "=\"" + current.getNodeValue() + "\""); } writer.write(">"); NodeList children = node.getChildNodes(); if (children != null) { if ((children.item(0) != null) && (children.item(0).getNodeType() == Node.ELEMENT_NODE)) { writer.write(lineSeparator); } for (int i = 0; i < children.getLength(); i++) { serializeNode(children.item(i), writer, indentLevel + indent); } if ((children.item(0) != null) && (children.item(children.getLength() - 1) .getNodeType() == Node.ELEMENT_NODE)) {
5
writer.write(indentLevel); } } writer.write("" + name + ">"); writer.write(lineSeparator); break; case Node.TEXT_NODE: writer.write(node.getNodeValue()); break; case Node.CDATA_SECTION_NODE: writer.write(""); break; case Node.COMMENT_NODE: writer.write(indentLevel + ""); writer.write(lineSeparator); break; case Node.PROCESSING_INSTRUCTION_NODE: writer.write("" + node.getNodeName() + " " + node.getNodeValue() + "?>"); writer.write(lineSeparator); break; case Node.ENTITY_REFERENCE_NODE: writer.write("&" + node.getNodeName() + ";"); break; case Node.DOCUMENT_TYPE_NODE: DocumentType docType = (DocumentType) node; writer.write(""); writer.write(lineSeparator); break; } }
6
2. ModelBase.js this.loadModelDoc = function(objRef) { if (objRef.url) { objRef.callListeners("newModel"); objRef.setParam("modelStatus", "loading"); if (objRef.contentType == "image") { objRef.doc = new Image(); objRef.doc.src = objRef.url; } else { var xmlHttp = new XMLHttpRequest(); var sUri = objRef.url; if (sUri.indexOf("http://") == 0) { if (objRef.method.toLowerCase() == "get") { sUri = getProxyPlusUrl(sUri); } else { sUri = config.proxyUrl; } } xmlHttp.open(objRef.method, sUri, objRef.async); if (objRef.method.toLowerCase() == "post") { xmlHttp.setRequestHeader("content-type", objRef.contentType); xmlHttp.setRequestHeader("serverUrl", objRef.url); } xmlHttp.onreadystatechange = function() { objRef.setParam("modelStatus", httpStatusMsg[xmlHttp.readyState]); if (xmlHttp.readyState == 4) { if (xmlHttp.status >= 400) { var errorMsg = mbGetMessage("errorLoadingDocument", sUri, xmlHttp.statusText, xmlHttp.responseText); alert(errorMsg); objRef.setParam("modelStatus", errorMsg); return; } else { if ((xmlHttp.responseXML != null) && (xmlHttp.responseXML.root != null) && (xmlHttp.responseXML.root.children.length > 0)) { objRef.doc = xmlHttp.responseXML; if (UtilDOM.getParseErrorText(objRef.doc) == UtilDOM.PARSED_OK) { objRef.finishLoading(); } else { alert(mbGetMessage("parseError", UtilDOM.getParseErrorText(objRef.doc))); } return; }
7
if (xmlHttp.responseText != null) { objRef.doc = UtilDOM.getDomDocument(); objRef.doc.async = false; objRef.doc = (new DOMParser()).parseFromString(xmlHttp.responseText.replace(/>\s+<"), "text/xml") if (objRef.doc == null) { alert(mbGetMessage("documentParseError", UtilDOM.getParseErrorText(objRef.doc))); } else { if (UtilDOM.getParseErrorText(objRef.doc) == UtilDOM.PARSED_OK) { objRef.finishLoading(); } else { alert(mbGetMessage("parseError", UtilDOM.getParseErrorText(objRef.doc))); }
}
return; }} }} xmlHttp.send(objRef.postData); if (!objRef.async) { //alert('non async'); if (xmlHttp.status >= 400) { //http errors status start at 400 var errorMsg = mbGetMessage("errorLoadingDocument", sUri, xmlHttp.statusText, xmlHttp.responseText); alert(errorMsg); this.objRef.setParam("modelStatus", errorMsg); return; } else { //alert(xmlHttp.getResponseHeader("Content-Type")); if (null == xmlHttp.responseXML) alert(mbGetMessage("nullXmlResponse", xmlHttp.responseText)); //alert('objectRef.doc '+ objRef.doc.id); objRef.doc = xmlHttp.responseXML; objRef.finishLoading(); } }}}}
3. Implementasi kode untuk kebutuhan nonfungsional yaitu mengetahui keadaan modul nodemap (MapBuilder.js). function serverChecking() { var a = document.getElementById("checkserver"); //Dari config.xml /* Langkahnya adalah :
8
1. Dari Lokasi.xml, cari alamat server peta. 2. setelah didapat maka parsing ke server.txt 3. jika ada yang mati maka alert 4. reconfigure ulang */ var doc = UtilDOM.getDomDocument(); doc.async = false; doc.validateOnParse = false; var url = 'lokasi.xml'; doc.load(url); if (UtilDOM.getParseErrorText(doc) != UtilDOM.PARSED_OK) { alert("error loading config document: " + url); } var mbUrl = "http://www.opengis.net/context"; var namespace = "xmlns:mb='" + mbUrl + "'"; if (! _UtilDOM_IS_SAFARI) { doc.setProperty("SelectionLanguage", "XPath"); UtilDOM.setXpathNamespaces(doc, namespace); } var layerList; layerList = doc.selectNodes("/mb:ViewContext/mb:LayerList/mb:Layer"); var hasilcheck = ''; for (var i = 1; i < layerList.length; i++) { var tempUrl = layerList[i].selectSingleNode("mb:Server/mb:OnlineResource").getAttribute("xlink:href"); var nameLayer = layerList[i].selectSingleNode("mb:Name").firstChild.nodeValue; //mari kita teliti satu persatu var proxyUrl = "Proxy.jsp"; //var tempUrl = map.layers[j].url; var urlmodif = null; if (tempUrl.indexOf("http://") == 0) { if (proxyUrl) { urlmodif = proxyUrl + "?url=" + escape(tempUrl).replace(/\+/g, '%2C').replace(/\"/g, '%22').replace(/\'/g, '%27'); } else { urlmodif = null; } } urlmodif = (urlmodif.replace("wms", "server.txt")); //checking status server (jika servernya mati) var XMLHttp = null; if (window.XMLHttpRequest) {
9
try { XMLHttp = new XMLHttpRequest(); } catch (e) { } } else if (window.ActiveXObject) { try { XMLHttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { XMLHttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { }
}
}
XMLHttp.open("GET", urlmodif, false); var hasil = null; XMLHttp.onreadystatechange = function handlerServerStatus() { if (XMLHttp.readyState == 4) { if (XMLHttp.status >= 400) { hasil = "servermati"; }
else
{ hasil = XMLHttp.responseText; } }}; XMLHttp.send(null); if (hasil == 'serverok') { hasilcheck = hasilcheck + tempUrl + " : " + nameLayer + " : " + hasil + "
"; } else { hasilcheck = hasilcheck + tempUrl + " : " + nameLayer + " : " + hasil + "
"; var jawab = window.confirm('Please Reconfigure this sercive (maybe server down)'); if (jawab == true) { location.replace("/mapedit/demo.do"); } }} a.innerHTML = hasilcheck;}
4. Penanganan untuk data yang relatif besar package org.nodemap.servlets; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import javax.servlet.http.HttpServletResponse; /* File
: BufferStrategy.java
Author
: Lukfi Halim (23506015)
Desc
: merupakan strategi service yang membuffer output sampai writeTo
komplit. */
10
public class BufferStrategy implements ServiceStrategy { /* Kamus */ ByteArrayOutputStream buffer = null; private HttpServletResponse response; /* Algoritma */ public String getId() { return "BUFFER"; } /** * Menyediakan ByteArrayOutputStream untuk writeTo. */ public OutputStream getDestination(HttpServletResponse response) throws IOException { this.response = response; buffer = new ByteArrayOutputStream(1024 * 1024); return buffer; } /** * Menyalin buffer. */ public void flush() throws IOException { if ((buffer == null) || (response == null)) { return; } OutputStream out = response.getOutputStream(); buffer.writeTo(out); buffer = null; } /** * membersihkan buffer jika ada perintah abort */ public void abort() { buffer = null; }
public Object clone() throws CloneNotSupportedException { return new BufferStrategy(); } }
11
5. Kode Pengubahan kenampakan if (element instanceof DeleteRequest) { DeleteRequest delete = (DeleteRequest) element; LOGGER.info("Transaction Delete:" + element); try { DataStore data = store.getDataStore(); FilterFactory factory = FilterFactoryFinder.createFilterFactory(); FeatureWriter writer; writer = data.getFeatureWriter(typeName, filter, transaction); try { while (writer.hasNext()) { String fid = writer.next().getID(); locking.unLockFeatures(factory.createFidFilter(fid)); writer.remove(); } } finally { writer.close(); }}} if (element instanceof InsertRequest) { try { InsertRequest insert = (InsertRequest) element; FeatureCollection collection = insert.getFeatures(); FeatureReader reader = DataUtilities.reader(collection); FeatureType schema = store.getSchema(); FeatureTypeInfo typeInfo = catalog.getFeatureTypeInfo(element.getTypeName()); featureValidation(typeInfo.getDataStoreInfo().getId(), schema, collection); Set fids = store.addFeatures(reader); build.addInsertResult(element.getHandle(), fids); envelope.expandToInclude(collection.getBounds()); } catch (IOException ioException) { throw new WfsTransactionException(ioException, element.getHandle(), request.getHandle()); }} if (element instanceof UpdateRequest) { try { UpdateRequest update = (UpdateRequest) element; AttributeType[] types = update.getTypes(store.getSchema()); Object[] values = update.getValues(); FeatureReader preprocess = store.getFeatures(filter).reader(); try { while (preprocess.hasNext()) { Feature feature = preprocess.next();
12
fids.add(feature.getID()); envelope.expandToInclude(feature.getBounds()); } } catch (NoSuchElementException e) { throw new ServiceException("Could not aquire FeatureIDs", e); } catch (IllegalAttributeException e) { throw new ServiceException("Could not aquire FeatureIDs", e); } finally { preprocess.close(); } try { if (types.length == 1) { store.modifyFeatures(types[0], values[0], filter); } else { store.modifyFeatures(types, values, filter); } } catch (IOException e) { }}}
12. XML POST Reader (TransactionXmlReader.java) public Request read(Reader reader, HttpServletRequest req) throws WfsTransactionException { // translate string into a proper SAX input source InputSource requestSource = new InputSource(reader);
// instantiante parsers and content handlers TransactionHandler contentHandler = new TransactionHandler((WFService) getServiceRef()); TransactionFilterHandler filterParser = new TransactionFilterHandler(contentHandler, null); Data catalog = getServiceRef().getCatalog(); TransactionFeatureHandler featureParser = new TransactionFeatureHandler(filterParser, req, catalog); GMLFilterGeometry geometryFilter = new GMLFilterGeometry(featureParser); GMLFilterDocument documentFilter = new GMLFilterDocument(geometryFilter);
//membaca xml stream ke Content Handler try { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); ParserAdapter adapter = new ParserAdapter(parser.getParser()); adapter.setContentHandler(documentFilter); LOGGER.info("about to start parsing");
13
adapter.parse(requestSource); LOGGER.info("just parsed: " + requestSource); } catch (SAXException e) { System.out.println(e.getMessage()); } Request r = contentHandler.getRequest(req); return r; }
14
Lampiran C Penanganan Proxy <% /* File
: Proxy.jsp
Author
: Lukfi Halim
Purpose
: For Coding response Server (handle for proxy)
*/
if ("GET".equals(request.getMethod())) { //execute the GET String serverUrl = request.getParameter("url"); java.net.URL url = new java.net.URL(serverUrl); if (!"http".equals(url.getProtocol()) && !"https".equals(url.getProtocol())) { throw new javax.servlet.ServletException( "only use HTTP(S) Url's, please don't hack this server!"); } java.io.InputStream in = url.openStream();
//response.setContentType("text/xml"); byte[] buff = new byte[1024]; int count; java.io.OutputStream o = response.getOutputStream(); while ((count = in.read(buff)) > -1) { o.write(buff, 0, count); } o.flush(); o.close(); } else { //execute the POST try { // Transfer bytes from in to out java.io.PrintWriter o = response.getWriter(); javax.servlet.ServletInputStream in = request.getInputStream();
org.apache.commons.httpclient.HttpClient client = new org.apache.commons.httpclient.HttpClient();
String serverUrl = request.getHeader("serverUrl"); org.apache.commons.httpclient.methods.PostMethod httppost = new org.apache.commons.httpclient.methods.PostMethod(serverUrl);
15
httppost.addRequestHeader("Content-Type", "text/xml"); httppost.setRequestBody(in); //httppost.setRequestContentLength(PostMethod.CONTENT_LENGTH_CHUNKED);
client.executeMethod(httppost);
if (httppost.getStatusCode() == org.apache.commons.httpclient.HttpStatus.SC_OK) { response.setContentType("text/xml"); String responseBody = httppost.getResponseBodyAsString(); response.setContentLength(responseBody.length()); //System.out.println("responseBody:" + responseBody); o.print(responseBody); } else { throw new javax.servlet.ServletException("Unexpected failure: " + httppost.getStatusLine().toString()); } httppost.releaseConnection(); o.flush(); o.close(); } catch (java.io.IOException e) { throw new javax.servlet.ServletException(e); } } %>
16
Lampiran D Studi GeoTools Pada geotools terdapat beberapa konsep yaitu datastore, feature type, feature reader dan feature writer. Untuk memahami tentang representasi dari 4 konsep di atas perlu adanya diagram kelas (Gambar D-1) untuk memahaminya.
PostGISDataStore
DataStore
OracleDataStore FeatureType FeatureReader geometry Geometry
FeatureWriter
nonGeometry
MySQLDataStore
DBaseWriter
NonGeometry
ShapeFileWriter dbfWriter
shpWriter ShapeFileDataStore headerdBase DbaseFileHeader headerShapefileHeader GeometryCollection
LineString
Point
Polygon
shp
ShapeFileReader
MultiPolygon
MultiLineString
MultiPoint
dbf
DbaseWriter
LinearRing
Gambar D-1. Diagram kelas penanganan multiformat data dengan geotools
DataStore adalah suatu interface yang dapat implementasi oleh berbagai kelas dataStore seperti a. ShapefileDataStore.java b. PostgisDataStore.java c. MySQLDataStore.java d. OracleDataStore.java Untuk mengetahui datastore yang sesuai dengan bentuk data geografi dapat ditangani oleh DataStoreFinder.java. Sebuah interface DataStore berisi 1. featureType Sebuah interface yang digunakan untuk menunjukan tipe dari sebuah feature, apakah tipenya geometri atau bukan. Pada gambar diatas sebuah feature geometry dapat berupa point, lineString (polyline), polygon dan geometrycollection (polygon dalam polygon). Di dalam
17
pustaka geotool menggunakan kode-kode dari jts (java topology suite). Kode – kode jts selain sebagai penangan data geometri juga adanya penangan dalam bentuk geometri tersebut. 2. featureReader Dalam diagram kelas dalam featureReader terdapat kode yang digunakan untuk membaca sebuah dataStore, didalam pustaka geotools terdapat berbagai macam kelas yang dapat berfungsi sebagai featureReader disesuaikan dengan datastorenya antara lain a. untuk data shapefile 1. ShapefileReader.java , untuk membaca file *.shp 2. DbaseFileReader.java, untuk membaca file *.dbf b. untuk data postgre digunakan WKTReader .java (menggunakan koneksi jdbc) untuk mengakses data postgre. 3. featureWriter Dalam feature Writer terdapat kode-kode yang digunakan untuk menuliskan feature dalam sebuah datastore, kelas-kelas yang dapat berfungsi sebagai feature writer adalah a. Untuk data shapefile 1. ShapefileWriter.java, untuk menulis file *.shp 2. DbaseFileWriter.java, untuk menulis file *.dbf b. Untuk data postgre digunakan PostgisFeatureWriter.java, untuk menuliskan feature ke data postgr dan menggunakan koneksi jdbc. Tabel D-1 menunjukan penggunaan konsep-konsep geotools dalam pengubahan data geografi.
Tabel D-1. Cara penggunaan konsep –konsep geotools dalam pengubahan feature Shapefile
Postgre
try {
try String f =
{
“file:/D:/eclipse/workspace/testingData/src/org/g
PostgisDataStore ds;
eotools/test-data/shapes/tasmania_roads.shp”;
//params (hasMap Connection)
ShapefileDataStore s = new
ds = (PostgisDataStore)
ShapefileDataStore(new URL(f));
DataStoreFinder.getDataStore(params);
/* Coba kita mengupdate “testR” dengan
// Ubah Feature
18
Shapefile
Postgre
“Testing” */
FeatureWriter writer = writer(“road”);
FeatureWriter writer = writer =
Feature feature;
s.getFeatureWriter(s.getTypeNames()[0],
int counter =0;
Filter.NONE, Transaction.AUTO_COMMIT);
while (writer.hasNext()) {
while (writer.hasNext()) {
feature = writer.next(); System.out.println(“ feature : “
Feature feat = writer.next(); System.out.println(“ feature get ID
+ counter + “ : “ + feature.getID()); //fid
“ + feat.getID()); //fid
System.out.println(“ number of
String b = (String) feat.getAttribute(1);
attribute : “ +
System.out.println(“ b “ + b);
feature.getNumberOfAttributes() );
if (b.equals(“testR”)) {
System.out.println(“0 : “ +
//writer.remove();
feature.getAttribute(0));
feat.setAttribute(1, new
System.out.println(“ 1 : “ +
String(“Testing”));
feature.getAttribute(1));
}
if
}
(feature.getID().equals(“road.”+roadFeatures[
/*Coba kita menambahkan 1 record baru*/
0].getID())) { feature.setAttribute(“name”,
Feature tambah = writer.next();
“Rubah”);
Coordinate pertama = new
writer.write();
Coordinate(0.4, 0.70);
}
Coordinate kedua = new Coordinate(0.9,
}
//3. Tambah Feature
1.5);
Feature tambah = writer.next(); Coordinate[] coordinateArray =
Coordinate pertama = new
{pertama, kedua};
Coordinate(0.4, 0.70);
CoordinateSequence seq = new
Coordinate kedua = new
CoordinateArraySequence(coordinateArray);
Coordinate(0.9, 1.5);
LineString[] lineStrings = {new
Coordinate[] coordinateArray =
LineString(seq, new GeometryFactory())};
{pertama, kedua};
tambah.setAttribute(0, new
CoordinateSequence seq = new
MultiLineString(lineStrings, new
CoordinateArraySequence(coordinateArray);
GeometryFactory()));
tambah.setAttribute(0, new
tambah.setAttribute(1, “Tambah”);
LineString(seq, new GeometryFactory()));
writer.write();
tambah.setAttribute(1, “Tambah “);
}catch(Exception e)
writer.write();
{
writer.close(); System.out.println(“ Exception “
}catch(Exception e)
+e.getMessage() );}
{ System.out.println(“ Exception “ +e.getMessage() );}
19