空间分析 |
支持空间分析,如数据集(几何对象)缓冲区分析、数据集(几何对象)叠加分析、数据集(几何对象)邻近分析、动态分段分析、空间关系分析、插值分析、表面分析(提取等值线、提取等值面)、路由对象的定位及M值的计算。分析结果的获取及展示可在主线程和监听器类中两种方式来实现。
数据集缓冲区分析。点、线和面数据集支持圆头缓存,线数据集暂不支持平头缓冲。下面示例为线数据集进行左右半径不一致、生成结果数据集的圆头缓冲分析,分析结果在主线程中进行获取及展示。
// 缓冲区分析结果 public DatasetBufferAnalystResult result; public void DatasetBufferAnalyst() throws InterruptedException, ExecutionException { // 构造分析参数 DatasetBufferAnalystParameters parameters = new DatasetBufferAnalystParameters(); parameters.dataset = "Bounds@Interpolation"; // 设置分析结果参数 DataReturnOption resultSet = new DataReturnOption(); resultSet.dataReturnMode = DataReturnMode.DATASET_ONLY; resultSet.dataset = "Result_LineBuffer"; resultSet.deleteExistResultDataset = true; parameters.resultSetting = resultSet; // 设置缓冲区分析参数:缓冲端点类型、缓冲半径 BufferSetting bufferSet = new BufferSetting(); bufferSet.endType = BufferEndType.ROUND; BufferDistance buffervalue = new BufferDistance(); buffervalue.value = 100; BufferDistance buffervalue2 = new BufferDistance(); buffervalue2.expression = "SMUSERID*2"; bufferSet.leftDistance = buffervalue; bufferSet.rightDistance = buffervalue2; parameters.buffersetting = bufferSet; DatasetBufferAnalystService service = new DatasetBufferAnalystService( "http://MyServerIP:8090/iserver/services/spatialanalyst-sample/restjsr/spatialanalyst"); MyDatasetBufferAnalystEventListener listener = new MyDatasetBufferAnalystEventListener(); // 和服务端异步通讯 service.process(parameters, listener); // 等待监听器执行完毕 try { listener.waitUntilProcessed(); } catch (Exception e) { e.printStackTrace(); } // 结果验证:分析成功,返回分析结果的数据集标识 assertTrue("Analyst is not succeed", result.succeed); assertEquals("The dataset of result", "Result_LineBuffer@Interpolation", result.dataset); } // 监听器类 class MyDatasetBufferAnalystEventListener extends DatasetBufferAnalystEventListener { @Override public void onDatasetBufferAnalystStatusChanged(Object sourceObject, EventStatus status) { // 返回结果 result = (DatasetBufferAnalystResult) sourceObject; } }
数据集叠加分析。下面示例为面数据集和面数据集的求交分析,分析结果在监听器中进行获取及展示。
// 叠加分析结果 public DatasetOverlayAnalystResult result; public void DatasetOverlayAnalyst() throws InterruptedException, ExecutionException { // 设置叠加分析参数 DatasetOverlayAnalystParameters parameters = new DatasetOverlayAnalystParameters(); parameters.sourceDataset = "BaseMap_R@Jingjin"; parameters.operateDataset = "Geomor_R@Jingjin"; parameters.operation = OverlayOperationType.INTERSECT; // 设置分析结果参数 DataReturnOption resultSet = new DataReturnOption(); resultSet.dataReturnMode = DataReturnMode.DATASET_ONLY; resultSet.dataset = "Result_RR_Intersect"; resultSet.deleteExistResultDataset = true; parameters.resutlSetting = resultSet; DatasetOverlayAnalystService service = new DatasetOverlayAnalystService( "http://MyServerIP:8090/iserver/services/spatialanalyst-sample/restjsr/spatialanalyst"); MyDatasetOverlayAnalystEventListener listener = new MyDatasetOverlayAnalystEventListener(); // 和服务端异步通讯 service.process(parameters, listener); } // 监听器类 class MyDatasetOverlayAnalystEventListener extends DatasetOverlayAnalystEventListener { @Override public void onDatasetOverlayAnalystStatusChanged(Object sourceObject, EventStatus status) { // 返回结果 result = (DatasetOverlayAnalystResult) sourceObject; // 结果验证:分析成功,返回分析结果的数据集标识 assertTrue("The succeed of result", result.succeed); assertEquals("The dataset of result", "Result_RR_Intersect@Jingjin", result.dataset); } }
数据集邻近分析。下面示例为点数据集的邻近分析,不生成结果数据集,仅返回分析得到的多边形面数组,分析结果在主线程中进行获取及展示。
// 邻近分析结果 public ThiessenAnalystResult result; public void DatasetThiessenAnalyst() throws InterruptedException, ExecutionException { // 设置数据集邻近分析参数 DatasetThiessenAnalystParameters parameters = new DatasetThiessenAnalystParameters(); parameters.createResultDataset = false; parameters.returnResultRegion = true; parameters.dataset = "SamplesP@Interpolation"; DatasetThiessenAnalystService service = new DatasetThiessenAnalystService( "http://MyServerIP:8090/iserver/services/spatialanalyst-sample/restjsr/spatialanalyst"); MyDatasetThiessenAnalystEventListener listener = new MyDatasetThiessenAnalystEventListener(); // 和服务端异步通讯 service.process(parameters, listener); // 等待监听器执行完毕 try { listener.waitUntilProcessed(); } catch (Exception e) { e.printStackTrace(); } // 获取分析结果 int counts = result.regions.length; } // 监听器类 class MyDatasetThiessenAnalystEventListener extends DatasetThiessenAnalystEventListener { @Override public void onDatasetThiessenAnalystStatusChanged(Object sourceObject, EventStatus status) { // 返回结果 result = (ThiessenAnalystResult) sourceObject; } }
动态分段分析。下面示例为依据点事件表生成空间数据,分析结果在主线程中进行获取及展示。
// 动态分段分析结果 public GenerateSpatialDataResult result; public void GenerateSpatialData() throws InterruptedException, ExecutionException { // 构造分析参数,生成点事件 GenerateSpatialDataParameters parameters = new GenerateSpatialDataParameters(); parameters.routeTable = "RouteDT_road@Changchun"; parameters.routeIDField = "RouteID"; parameters.eventTable = "PointEventTabDT@Changchun"; parameters.eventRouteIDField = "RouteID"; parameters.measureField = "Measure"; parameters.measureStartField = ""; parameters.measureEndField = ""; parameters.measureOffsetField = ""; parameters.errorInfoField = ""; // 设置分析结果参数,事件表数据集若已有关联的结果空间数据集,不能重复创建 DataReturnOption resultSet = new DataReturnOption(); resultSet.dataReturnMode = DataReturnMode.RECORDSET_ONLY; parameters.dataReturnOption = resultSet; GenerateSpatialDataService service = new GenerateSpatialDataService( "http://MyServerIP:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst"); MyGenerateSpatialDataEventListener listener = new MyGenerateSpatialDataEventListener(); // 和服务端异步通讯 service.process(parameters, listener); // 等待监听器执行完毕 try { listener.waitUntilProcessed(); } catch (Exception e) { e.printStackTrace(); } // 结果分析成功,获取结果对象 assertTrue("The succeed of result", result.succeed); Feature[] resultfeatures = result.recordset.features; } // 监听器类 class MyGenerateSpatialDataEventListener extends GenerateSpatialDataEventListener { @Override public void onGenerateSpatialDataStatusChanged(Object sourceObject, EventStatus status) { // 返回结果 result = (GenerateSpatialDataResult) sourceObject; } }
几何对象的缓冲区分析。下面示例为点对象的缓冲区分析,分析结果在主线程中进行获取及展示。
// 缓冲区分析结果 public GeometryBufferAnalystResult result; public void GeometryBufferAnalyst() throws InterruptedException, ExecutionException { // 构造分析参数 GeometryBufferAnalystParameters parameters = new GeometryBufferAnalystParameters(); // 构造几何对象 Geometry geo = new Geometry(); Point2D[] points = { new Point2D(10, 10) }; geo.points = points; geo.type = GeometryType.POINT; parameters.sourceGeometry = geo; // 设置缓冲区分析参数:缓冲端点类型、缓冲半径 BufferSetting bufferSet = new BufferSetting(); BufferDistance buffervalue = new BufferDistance(); buffervalue.value = 100; bufferSet.leftDistance = buffervalue; parameters.buffersetting = bufferSet; GeometryBufferAnalystService service = new GeometryBufferAnalystService( "http://MyServerIP:8090/iserver/services/spatialanalyst-sample/restjsr/spatialanalyst"); MyGeometryBufferAnalystEventListener listener = new MyGeometryBufferAnalystEventListener(); // 和服务端异步通讯 service.process(parameters, listener); // 等待监听器执行完毕 try { listener.waitUntilProcessed(); } catch (Exception e) { e.printStackTrace(); } // 结果分析成功,获取结果对象 assertTrue("The succeed of result", result.succeed); Geometry georesult = result.resultGeometry; } // 监听器类 class MyGeometryBufferAnalystEventListener extends GeometryBufferAnalystEventListener { @Override public void onGeometryBufferAnalystStatusChanged(Object sourceObject, EventStatus status) { // 返回结果 result = (GeometryBufferAnalystResult) sourceObject; } }
几何对象的叠加分析。下面示例为点对象和面对象的擦除分析,分析结果在主线程中进行获取及展示。
// 叠加分析结果 public GeometryOverlayAnalystResult result; public void GeometryOverlayAnalyst() throws InterruptedException, ExecutionException { // 设置叠加分析参数 GeometryOverlayAnalystParameters parameters = new GeometryOverlayAnalystParameters(); // 构造几何对象 Geometry geo = new Geometry(); Point2D[] points = { new Point2D(10, 4) }; geo.points = points; geo.type = GeometryType.POINT; parameters.sourceGeometry = geo; Geometry geo2 = new Geometry(); Point2D[] points2 = { new Point2D(5, -5), new Point2D(5, 5), new Point2D(20, 5), new Point2D(20, -5) }; geo2.points = points2; geo2.type = GeometryType.REGION; parameters.operateGeometry = geo2; parameters.operation = OverlayOperationType.ERASE; GeometryOverlayAnalystService service = new GeometryOverlayAnalystService( "http://MyServerIP:8090/iserver/services/spatialanalyst-sample/restjsr/spatialanalyst"); MyGeometryOverlayAnalystEventListener listener = new MyGeometryOverlayAnalystEventListener(); // 和服务端异步通讯 service.process(parameters, listener); // 等待监听器执行完毕 try { listener.waitUntilProcessed(); } catch (Exception e) { e.printStackTrace(); } // 结果分析成功,获取结果对象 assertTrue("The succeed of result", result.succeed); Geometry georesult = result.resultGeometry; } // 监听器类 class MyGeometryOverlayAnalystEventListener extends GeometryOverlayAnalystEventListener { @Override public void onGeometryOverlayAnalystStatusChanged(Object sourceObject, EventStatus status) { // 返回结果 result = (GeometryOverlayAnalystResult) sourceObject; } }
几何对象的邻近分析。下面示例为点对象的邻近分析,分析结果在主线程中进行获取及展示。
// 邻近分析结果 public ThiessenAnalystResult result; public void GeometryThiessenAnalyst() throws InterruptedException, ExecutionException { // 构造几何对象邻近分析参数 Point2D[] points = { new Point2D(0, 0), new Point2D(5, 2), new Point2D(8, 10), new Point2D(20, -5) }; GeometryThiessenAnalystParameters parameters = new GeometryThiessenAnalystParameters(); parameters.createResultDataset = false; parameters.returnResultRegion = true; parameters.points = points; GeometryThiessenAnalystService service = new GeometryThiessenAnalystService( "http://MyServerIP:8090/iserver/services/spatialanalyst-sample/restjsr/spatialanalyst"); MyGeometryThiessenAnalystEventListener listener = new MyGeometryThiessenAnalystEventListener(); // 和服务端异步通讯 service.process(parameters, listener); // 等待监听器执行完毕 try { listener.waitUntilProcessed(); } catch (Exception e) { e.printStackTrace(); } // 结果分析成功,获取结果对象 assertTrue("The succeed of result", result.succeed); Point2D[] resultpoints = result.regions; } // 监听器类 class MyGeometryThiessenAnalystEventListener extends GeometryThiessenAnalystEventListener { @Override public void onGeometryThiessenAnalystStatusChanged(Object sourceObject, EventStatus status) { // 返回结果 result = (ThiessenAnalystResult) sourceObject; } }
空间关系分析。下面示例为面包含点的关系分析,分析结果在主线程中进行获取及展示。
// 空间关系分析结果 public GeoRelationAnalystResult result; public void GeoRelationAnalyst() throws InterruptedException, ExecutionException { // 构造分析参数 GeoRelationAnalystParameters parameters = new GeoRelationAnalystParameters(); parameters.dataset = "Edit_Point@Changchun"; QueryParameter reffilter = new QueryParameter(); reffilter.name = "Edit_AreaPoly@Changchun"; parameters.referenceFilter = reffilter; parameters.expectCount = 100; parameters.isBorderInside = true; parameters.returnFeature = true; parameters.returnGeoRelatedOnly = true; parameters.spatialRelationType = SpatialRelationType.CONTAIN; parameters.startRecord = 0; GeoRelationAnalystService service = new GeoRelationAnalystService( "http://MyServerIP:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst"); MyGeoRelationAnalystEventListener listener = new MyGeoRelationAnalystEventListener(); // 和服务端异步通讯 service.process(parameters, listener); // 等待监听器执行完毕 try { listener.waitUntilProcessed(); } catch (Exception e) { e.printStackTrace(); } // 结果分析成功,获取结果对象 assertNotNull("The GeoRelationAnalyst result is null!", result); Feature[] resfeature=(Feature[])result.geoRelationResults[0].result; } class MyGeoRelationAnalystEventListener extends GeoRelationAnalystEventListener { @Override public void onGeoRelationAnalystStatusChanged(Object sourceObject, EventStatus status) { // 返回结果 result = (GeoRelationAnalystResult) sourceObject; } }
插值分析。下面示例为普通克吕金插值分析。
// 插值分析结果 public InterpolationAnalystResult result; public void InterpolationAnalyst() throws InterruptedException, ExecutionException { // 构造分析参数 InterpolationKrigingAnalystParameters parameters = new InterpolationKrigingAnalystParameters(); parameters.dataset = "SamplesP@Interpolation"; parameters.outputDatasetName = "Result_Kriging"; parameters.type = InterpolationAlgorithmType.KRIGING; parameters.zValueFieldName = "AVG_TMP"; parameters.searchMode = SearchMode.KDTREE_FIXED_COUNT; parameters.resolution = 8000; // 与服务端交互 InterpolationAnalystService service = new InterpolationAnalystService( "http://MyServerIP:8090/iserver/services/spatialanalyst-sample/restjsr/spatialanalyst"); MyInterpolationAnalystEventListener listener = new MyInterpolationAnalystEventListener(); // 和服务端异步通讯 service.process(parameters, listener); // 等待监听器执行完毕 try { listener.waitUntilProcessed(); } catch (Exception e) { e.printStackTrace(); } // 结果分析成功,获取结果数据集标识 assertTrue("Analyst faild", result.succeed); String resultdt=result.dataset; } // 监听器类 class MyInterpolationAnalystEventListener extends InterpolationAnalystEventListener { @Override public void onInterpolationAnalystStatusChanged(Object sourceObject, EventStatus status) { // 返回结果 result = (InterpolationAnalystResult) sourceObject; } }
提取等值线分析。下面示例为提取等值线,分析结果在主线程中进行获取及展示。
// 表面分析结果 public SurfaceAnalystResult result; public void IsoLineSurfaceAnalyst() throws InterruptedException, ExecutionException { // 设置表面分析通用参数 SurfaceAnalystParametersSetting paramSetting = new SurfaceAnalystParametersSetting(); paramSetting.datumValue = 0; paramSetting.interval = 10; paramSetting.smoothMethod = SmoothMethod.BSPLINE; paramSetting.smoothness = 1.2; // 设置分析结果参数 DataReturnOption resultSet = new DataReturnOption(); resultSet.expectCount = 100; // 设置数据集表面分析参数 DatasetSurfaceAnalystParameters surfaceParams = new DatasetSurfaceAnalystParameters(); surfaceParams.dataset = "Temp5000@Interpolation"; surfaceParams.extractParameter = paramSetting; surfaceParams.resultSetting = resultSet; SurfaceAnalystService service = new SurfaceAnalystService("http://MyServerIP:8090/iserver/services/spatialanalyst-sample/restjsr/spatialanalyst"); MySurfaceAnalystEventListener listener = new MySurfaceAnalystEventListener(); // 和服务端异步通讯 service.process(surfaceParams, listener); // 等待监听器执行完毕 try { listener.waitUntilProcessed(); } catch (Exception e) { e.printStackTrace(); } // 结果分析成功,获取结果对象 assertTrue("Analyst faild", result.succeed); Feature[] features=result.recordset.features; } // 监听器类 class MySurfaceAnalystEventListener extends SurfaceAnalystEventListener { @Override public void onSurfaceAnalystStatusChanged(Object sourceObject, EventStatus status) { // 返回结果 result = (SurfaceAnalystResult) sourceObject; } }
提取等值面分析。下面示例为提取等值面,分析结果在主线程中进行获取及展示。
// 表面分析结果 public SurfaceAnalystResult result; public void IsoLineSurfaceAnalyst() throws InterruptedException, ExecutionException { // 设置表面分析通用参数 SurfaceAnalystParametersSetting paramSetting = new SurfaceAnalystParametersSetting(); paramSetting.datumValue = 4; paramSetting.interval = 10; paramSetting.smoothMethod = SmoothMethod.BSPLINE; paramSetting.smoothness = 1.2; paramSetting.expectedZValues = new double[] { 10, 20 }; // 设置分析结果参数 DataReturnOption resultSet = new DataReturnOption(); resultSet.expectCount = 3; // 设置数据集表面分析参数 DatasetSurfaceAnalystParameters surfaceParams = new DatasetSurfaceAnalystParameters(); surfaceParams.dataset = "Temp5000@Interpolation"; surfaceParams.extractParameter = paramSetting; surfaceParams.resultSetting = resultSet; surfaceParams.surfaceAnalystMethod = SurfaceAnalystMethod.ISOREGION; SurfaceAnalystService service = new SurfaceAnalystService("http://MyServerIP:8090/iserver/services/spatialanalyst-sample/restjsr/spatialanalyst"); MySurfaceAnalystEventListener listener = new MySurfaceAnalystEventListener(); // 和服务端异步通讯 service.process(surfaceParams, listener); // 等待监听器执行完毕 try { listener.waitUntilProcessed(); } catch (Exception e) { e.printStackTrace(); } // 结果分析成功,获取结果对象 assertTrue("Analyst faild", result.succeed); Feature[] features=result.recordset.features; } // 监听器类 class MySurfaceAnalystEventListener extends SurfaceAnalystEventListener { @Override public void onSurfaceAnalystStatusChanged(Object sourceObject, EventStatus status) { // 返回结果 result = (SurfaceAnalystResult) sourceObject; } }
计算路由对象指定点的M值。下面示例为计算路由对象指定点的M值,分析结果在主线程中进行获取。
// 分析结果 public RouteCalculateMeasureResult result; public void RouteCalculateMeasure() throws InterruptedException, ExecutionException { // 设置路由对象定位空间对象参数 RouteCalculateMeasureParameters params = new RouteCalculateMeasureParameters(); Route sourceRoute = new Route(); sourceRoute.type = GeometryType.LINEM; sourceRoute.parts = new int[] { 4 }; PointWithMeasure[] points = new PointWithMeasure[] { new PointWithMeasure(3817.3527876130133, -6674.466867067764, 0), new PointWithMeasure(3617.806369901496, -6670.830929417594, 199.57954019411724), new PointWithMeasure(3264.1498746678444, -6877.837541432356, 609.3656478634477), new PointWithMeasure(2979.846206068903, -7038.687780615184, 936.0174126282958) }; sourceRoute.points = points; params.sourceRoute = sourceRoute; params.isIgnoreGap = false; Point2D point = new Point2D(3330.77542694170, -6838.8394457216); params.point = point; params.tolerance = 1; RouteCalculateMeasureService service = new RouteCalculateMeasureService( "http://MyServerIP:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst"); MyRouteCalculateMeasureEventListener listener = new MyRouteCalculateMeasureEventListener(); // 和服务端异步通讯 service.process(params, listener); // 等待监听器执行完毕 try { listener.waitUntilProcessed(); } catch (Exception e) { e.printStackTrace(); } // 结果分析成功,获取计算结果 assertTrue("Calculate faild", result.succeed); double resultmeasure = result.measure; } // 监听器类 class MyRouteCalculateMeasureEventListener extends RouteCalculateMeasureEventListener { @Override public void onRouteCalculateMeasureStatusChanged(Object sourceObject, EventStatus status) { // 返回结果 result = (RouteCalculateMeasureResult) sourceObject; } }
路由对象定位空间对象分析。下面示例为路由对象定位点对象分析,分析结果在主线程中进行获取及展示。
// 分析结果 public RouteLocatorResult result; public void RouteLocator() throws InterruptedException, ExecutionException { // 设置路由对象定位空间对象参数 RouteLocatorParameters params = new RouteLocatorParameters(); Route sourceRoute = new Route(); sourceRoute.type = GeometryType.LINEM; sourceRoute.parts = new int[] { 4 }; PointWithMeasure[] points = new PointWithMeasure[] { new PointWithMeasure(3817.3527876130133, -6674.466867067764, 0), new PointWithMeasure(3617.806369901496, -6670.830929417594, 199.57954019411724), new PointWithMeasure(3264.1498746678444, -6877.837541432356, 609.3656478634477), new PointWithMeasure(2979.846206068903, -7038.687780615184, 936.0174126282958) }; sourceRoute.points = points; params.sourceRoute = sourceRoute; params.type = LocateType.POINT; params.measure = 10; params.offset = 0; params.isIgnoreGap = false; RouteLocatorService service = new RouteLocatorService("http://MyServerIP:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst"); MyRouteLocatorEventListener listener = new MyRouteLocatorEventListener(); // 和服务端异步通讯 service.process(params, listener); // 等待监听器执行完毕 try { listener.waitUntilProcessed(); } catch (Exception e) { e.printStackTrace(); } // 结果分析成功,获取分析结果 assertTrue("Calculate faild", result.succeed); Geometry resultgeo = result.resultGeometry; } // 监听器类 class MyRouteLocatorEventListener extends RouteLocatorEventListener { @Override public void onRouteLocatorStatusChanged(Object sourceObject, EventStatus status) { // 分析结果 result = (RouteLocatorResult) sourceObject; } }
完整示例可参考SampleCode中的空间分析。