空间分析

发送反馈


支持空间分析,如数据集(几何对象)缓冲区分析、数据集(几何对象)叠加分析、数据集(几何对象)邻近分析、动态分段分析、空间关系分析、插值分析、表面分析(提取等值线、提取等值面)、路由对象的定位及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中的空间分析。