DEM데이터로 GeoServer의 WPS Plugin RadialLineOfSight으로 가시권 분석을 하는 예제입니다.
예제 프로그램은 FGIS/Pro ( http://www.gisapplication.kr/FGISPro/ )으로 하였습니다.
* 관련글 : [GeoServer활용] WPS Plugin RasterZonalStatistics사용 : 평균경사 및 고도 분석
[입지분석]전국 평균경사 분석 시스템
* GeoServer에 WPS설치 및 WPS Extension를 설치하여야 합니다.
그리고, Spatial Extension for GeoServer WPS를 추가설치 하여야합니다.
Spatial Extension for GeoServer WPS (https://sourceforge.net/projects/mango-spatialstatistics/files/GeoServer ) process-spatialstatistics-2.8.5.jar과 gs-wps-spatialstatistics-2.8.5.jar 다운로드 한 2 개의 jar 파일을 webapps/geoserver/WEB-INF/lib 폴더 내에 복사하고 GeoServer를 다시 실행합니다. |
*동영상 : 남산에서 1.8m높이에서 반경 1km의 가시권 분석
* 주요소스 : 높이는 1.80m, 범위는 1km로 하였습니다.
//가시권분석 WPS public function RadialLineOfSight(myMapPoint:MapPoint):void { var sText:String = ' + 'xmlns:wfs="http://www.opengis.net/wfs" xmlns:wps="http://www.opengis.net/wps/1.0.0"' + 'xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:gml="http://www.opengis.net/gml"' + 'xmlns:ogc="http://www.opengis.net/ogc" xmlns:wcs="http://www.opengis.net/wcs/1.1.1"' + 'xmlns:xlink="http://www.w3.org/1999/xlink"' + 'xsi:schemaLocation="http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsAll.xsd">' + ' + ' + ' + ' + ' |
+ '
+ '
+ '
+ '
+ '
+ '
+ '
+ ''
+ ''
+ '
+ '
+ ''
+ ''
+ ''
+ '
+ '
+ '
+ '
+ 'POINT(' + myMapPoint.x.toFixed() + ' ' + myMapPoint.y.toFixed() + ')'
+ ']]>
+ '
+ '
+ '
+ '
+ '
+ '
+ '
+ '
+ '
+ '
+ '
+ '
+ '
+ '
+ ''
+ '
+ '
+ '
+ '
+ '
+ '';
var xml :XML = XML(sText);
var httpService_XML:mx.rpc.http.mxml.HTTPService = new mx.rpc.http.mxml.HTTPService( );
httpService_XML.url = GEOServer_URL + "/ows"; //"/WPS";
httpService_XML.method = "POST";
httpService_XML.contentType = "application/xml";
httpService_XML.resultFormat = "text"; //"e4x";
httpService_XML.addEventListener(ResultEvent.RESULT, onResult_XML);
httpService_XML.addEventListener(FaultEvent.FAULT, onFault);
httpService_XML.send(xml);
MessageBoxLabel.text = "가시권 분석중(3분이상 소요)...";
MessageBox2.visible = true;
CursorManager.setBusyCursor();
BusyIndicator.visible = true;
MessageBox2.x = this.screen.width/2 -MessageBoxLabel.width/2 - 100;
MessageBox2.y = this.screen.height/2- MessageBoxLabel.height/2;
viewshedGraphicsLayer.clear();
function onResult_XML(e:ResultEvent):void{
CursorManager.removeBusyCursor();
BusyIndicator.visible = false;
MessageBox2.visible = false;
var item_data:String = e.result as String;
/*
*/
var WPSXml:XML = XML(e.result);
var o:Object= xmlToObject(WPSXml);
var top:Object=o.FeatureCollection;
var componentArrayC:ArrayCollection=top.featureMember;
if(componentArrayC.length > 0){
for each(var _featureMember:Object in componentArrayC) {
try{
var _feature:Object = _featureMember.RadialLineOfSight;
var _Visible:String = _feature.Visible;
var newClr:uint = 0xFF0000;
var newAlpha:Number = 0.8;
if(_Visible != '0'){
newClr = 0x0000FF;
newAlpha = 0.3;
}
var shape:Object = _feature.geom;
var polyLine :Polyline = new Polyline();
var MultiLineString:Object = shape.MultiLineString;
var lineStringMember:Object = MultiLineString.lineStringMember;
var LineString:Object = lineStringMember.LineString;
var path:String = LineString.coordinates;
polyLine.addPath( createPointArray( path) );
var _graphic :Graphic = new Graphic();
_graphic.geometry = polyLine as Geometry;
var LineSymbol:SimpleLineSymbol = new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID, newClr, newAlpha, 3);
_graphic.symbol = LineSymbol;
viewshedGraphicsLayer.add(_graphic);
} catch (err:Error) {
}
}
var graphic:Graphic = new Graphic(myMapPoint, viewshedSimpleMarker);
viewshedGraphicsLayer.add(graphic);
}
}
function createPointArray( coordinates :String ) :Array
{
var points :Array = new Array();
var coords :Array = coordinates.split( " " );
for( var i :int = 0; i < coords.length; i++)
{
var PointXY :Array = coords[i].split( "," );
points.push( new MapPoint( PointXY[0], PointXY[1]) );
}
return points;
}
function xmlToObject(x:XML):Object{
var xmlStr:String = x.toString();
var xmlDoc:XMLDocument = new XMLDocument(xmlStr);
xmlDoc.ignoreWhite=true;
var decoder:SimpleXMLDecoder = new SimpleXMLDecoder(true);
var resultObj:Object = decoder.decodeXML(xmlDoc);
return resultObj;
}
function onFault(e:FaultEvent):void{
CursorManager.removeBusyCursor();
BusyIndicator.visible = false;
MessageBox2.visible = false;
}
}
* 참조: 위는 10*10m로 WPS RadialLineOfSight하였으나,
아래는 30*30의 셀연산으로한 화면입니다. 차이점이 큽니다.
댓글 없음:
댓글 쓰기