|
[GeoServer활용]Shapefiles (*.shp) 을 벡터 데이터 원본으로 하여 WFS 서비스로Transaction으로 저장등 편집하기입니다.
이전글, [GeoServer활용]GeoServer설치/설정 와 타 툴에서 쿼리로 읽어와 파싱해서 그리기를 해보았습니다.
이번에는 이전글에 이어 shp파일 원본을 GeoServer의 WFS 서비스로 설정한것을 편집(Insert, Update, Delete)하는 예로 타 언어/GIS클라이언트 툴 또는, 데스크탑 툴 등에서 해볼수있도록 URL로 처리하는 내용을 해보았습니다.
Postgis, Oracle, H2 등 DBMS를 GeoServer와 연동하여 OpenLayers, QGIS등 클라이언트 라이브러리로 중첩이나 편집 기능을 개발하는 것은 많은 예제로 있으며,
요즘 GIS업체도 GIS개발킷이나 서버 등 에서 GeoServer나 GeoWebCache의 서버를 활용하여 원천적인으로 만드는게 아니라 드라이버를 만들고 있습니다.
이러한 활용과 요청(Open SW을 활용한 DBMS 드라이버 개발)을 하다보니 WFS-T(Transaction)로만 검색해보고 편집 등 테스트를 정리해봅니다. 간단히해보기 위해 별도 DBMS를 사용하지 않고 간단히 shp파일 원본으로 수정/검색을 해보았습니다.
GeoServer에서 재미 있었던건 Shapefile이 메모리 기반의 서비스가 아니라 WFS에서는 Shapefile 원본 자체에서 검색하고 수정을 하고 있었습니다. 물론 장단점으론 속도와 불안정, 보안, 접속자 수 등 문제는 있지만, 개발시 테스트하기에는 간단합니다.
* 참고 : http://docs.geoserver.org/2.7.1/developer/programming-guide/versioning/wfsv/samplecalls.html
* Insert
protected function Interest_Area(PolygonGeometry:Geometry):void var service :HTTPService = new HTTPService(); |
* Update
private function Update_Area(featureID:String, FieldName:String, FieldValue:String, PolygonGeometry:Geometry):void { var StrPoints:String = ""; var gPolygon:com.esri.ags.geometry.Polygon = PolygonGeometry as com.esri.ags.geometry.Polygon; var polygonRings:Array = gPolygon.rings[0]; for (var i:int = 0; i < polygonRings.length; i++){ var mapPoint:MapPoint = polygonRings[i]; StrPoints += (mapPoint.x.toString()) + " " + mapPoint.y.toString() + " "; } var GEOXML:String = ' <MultiSurface srsName="http://www.opengis.net/gml/srs/epsg.xml#900913" xmlns="http://www.opengis.net/gml">' + ' <surfaceMember>' + ' <Polygon>' + ' <exterior>' + ' <LinearRing>' + ' <posList>' + StrPoints + ' </posList>' + ' </LinearRing>' + ' </exterior>' + ' </Polygon>' + ' </surfaceMember>' + ' </MultiSurface>'; /////////////////////////// var service :HTTPService = new HTTPService(); service.url = GeoServerUrl+"/geoserver/"+GSSpaceOfTask+"/ows?service=WFS&version=1.0.0&request=Transaction&typeName="+GSSpaceOfTask+":"+GSLayer; service.method = "POST"; service.contentType = "application/xml"; service.resultFormat = 'xml'; service.useProxy = false; var StrXML:String = '<?xml version="1.0" encoding="EUC-KR"?>' + '<Transaction service="WFS" version="1.1.0" ' + 'xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/WFS-transaction.xsd ' + GeoServerUrl + '/' + GSSpaceOfTask + '/wfs/DescribeFeatureType?typename=' +GSSpaceOfTask+":"+GSLayer +'" ' + 'xmlns="http://www.opengis.net/wfs" xmlns:wfs="http://www.opengis.net/wfs" ' + 'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ogc="http://www.opengis.net/ogc">' + ' <Update typeName="' +GSSpaceOfTask+":"+GSLayer +'">' + ' <Property>' + ' <Name>'+ 'the_geom' +'</Name>' + ' <Value>'+ GEOXML +'</Value>' + ' </Property>' + ' <Property>' + ' <Name>'+ FieldName +'</Name>' + ' <Value>'+ FieldValue +'</Value>' + ' </Property>' + ' <ogc:Filter>' + ' <ogc:FeatureId fid="'+ featureID +'"/>' + ' </ogc:Filter>'+ ' </Update>' + '</Transaction>'; var getFeatureXML :XML = XML(StrXML); var token :AsyncToken = service.send(getFeatureXML); token.addResponder( new AsyncResponder( function onSuccess( result :ResultEvent, token :Object = null ) :void { //Alert.show('Success' + "\n" + result.result.toString()); MapLayerRePaint();//Commit_Area(featureID); }, function onFailure( error :FaultEvent, token :Object = null ) :void { //Alert.show('Failure' + "\n" + error.toString()); }, this ) ); } |
* Delete
private function Delete_Area(featureID:String):void { var service :HTTPService = new HTTPService(); service.url = GeoServerUrl+"/geoserver/"+GSSpaceOfTask+"/ows?service=WFS&version=1.0.0&request=Transaction&typeName="+GSSpaceOfTask+":"+GSLayer; service.method = "POST"; service.contentType = "application/xml"; service.resultFormat = 'xml'; service.useProxy = false; var StrXML:String = '<?xml version="1.0" encoding="EUC-KR"?>' + '<Transaction service="WFS" version="1.1.0" ' + 'xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/WFS-transaction.xsd ' + GeoServerUrl + '/' + GSSpaceOfTask + '/wfs/DescribeFeatureType?typename=' +GSSpaceOfTask+":"+GSLayer +'" ' + 'xmlns="http://www.opengis.net/wfs" xmlns:wfs="http://www.opengis.net/wfs" ' + 'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ogc="http://www.opengis.net/ogc">' + ' <Delete typeName="' +GSSpaceOfTask+":"+GSLayer +'">' + ' <ogc:Filter>' + ' <ogc:FeatureId fid="'+ featureID +'"/>' + ' </ogc:Filter>'+ ' </Delete>' + '</Transaction>'; var getFeatureXML :XML = XML(StrXML); var token :AsyncToken = service.send(getFeatureXML); token.addResponder( new AsyncResponder( function onSuccess( result :ResultEvent, token :Object = null ) :void { //Alert.show('Success' + "\n" + result.result.toString()); MapLayerRePaint();//Commit_Area(featureID); }, function onFailure( error :FaultEvent, token :Object = null ) :void { //Alert.show('Failure' + "\n" + error.toString()); }, this ) ); } |
기술없는 영업은 공허하고, 영업없는 기술은 맹목적이다. 예전 지인(이**과장님)과의 회식하며 나온 취중명언 |
|