내 블로그 목록

2020년 3월 18일 수요일

[GeoServer활용]가시권 분석(WPS Plugin RadialLineOfSight)

[GeoServer활용]가시권 분석(WPS Plugin RadialLineOfSight)
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:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.opengis.net/wps/1.0.0"'
  +    '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">'
  +   'statistics:RadialLineOfSight
  +   ''
 
  +  ''
  +    'inputCoverage'
  +    'http://geoserver/wcs
" method="POST">'
  +   ''
  +     ''
  +    'FGIS:K_DEM'
  +    ''
  +      'http://www.opengis.net/gml/srs/epsg.xml#3857">'

  +     ''+ (myMapPoint.x-1010).toFixed()+' '+ (myMapPoint.y-1010).toFixed()+''
  +     ''+ (myMapPoint.x+1010).toFixed()+' '+ (myMapPoint.y+1010).toFixed()+''
  +      ''
  +    ''
  +    ''
  +     '
'
  +   ''
  +    ''
  +  ''
 
  +  ''
  +    'observerPoint'
  +    ''
  +   '<![CDATA['
  +             'POINT(' + myMapPoint.x.toFixed() + ' ' + myMapPoint.y.toFixed() + ')'
  +           ']]>
'
  +    '
'
  +  '
'

  +  ''
  +    'observerOffset'
  +    ''
  +   '1.8'
  +    '
'
  +  '
'
 
  +  ''
  +    'radius'
  +    ''
  +   '1000'
  +    '
'
  +  '
'
 
  +   ''
  +    ''
  +     ''
  +      'result'
  +     '
'
  +    '
'
  + '';
 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;

  /*
  
    141368394519545.014137081.4242424244519545.0http://www.opengis.net/gml/srs/epsg.xml#3857">141368394519545.014137081.4242424244519545.0
>
     
        http://www.opengis.net/gml/srs/epsg.xml#3857
">
          
             
                  1.4136839E7,4519545.0,1.0 1.41368491010101E7,4519545.0,1.0 1.4136859202020202E7,4519545.0,1.0 1.4136869303030303E7,4519545.0,1.0 1.4136879404040404E7,4519545.0,1.0 1.4136889505050505E7,4519545.0,1.0 1.4136899606060605E7,4519545.0,1.0 1.4136909707070706E7,4519545.0,1.0 1.4136919808080807E7,4519545.0,1.0 1.4136929909090908E7,4519545.0,1.0 1.4136940010101011E7,4519545.0,1.0 1.4136950111111112E7,4519545.0,1.0 1.4136960212121213E7,4519545.0,1.0 1.4136970313131314E7,4519545.0,1.0 1.4136980414141415E7,4519545.0,1.0 1.4136990515151516E7,4519545.0,1.0 1.4137000616161617E7,4519545.0,1.0 1.4137010717171717E7,4519545.0,1.0 1.4137020818181818E7,4519545.0,1.0 1.413703091919192E7,4519545.0,1.0 1.413704102020202E7,4519545.0,1.0 1.4137051121212121E7,4519545.0,1.0 1.4137061222222222E7,4519545.0,1.0 1.4137071323232323E7,4519545.0,1.0 1.4137081424242424E7,4519545.0,1.0
             

          

       
     
      0.00
   
 
  */
 
  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의 셀연산으로한 화면입니다. 차이점이 큽니다.

댓글 없음:

댓글 쓰기