因为最近在做GIS相关的工作,在工作过程中出现了很多的关于对空间坐标处理的问题,下面来记录一下:
一、已知空间坐标数据,获取当前空间坐标数据的面积:
获取空间面积存在两个方面,
一种是java通过oracle的空间函数进行获取
通过oracle空间坐标的:
SDO_GEOM.SDO_AREA函数进行获取。
SDO_GEOM.SDO_AREA( geom IN SDO_GEOMETRY, dim IN SDO_DIM_ARRAY [, unit IN VARCHAR2] ) RETURN NUMBER;
or
SDO_GEOM.SDO_AREA( geom IN SDO_GEOMETRY, tol IN NUMBER [, unit IN VARCHAR2] ) RETURN NUMBER;
函数的使用根据不同参数可以采取不同的使用方式,其中参数geom为空间坐标数据,参数dim为集合维度数组,tol为公差值,unit为单位,一版默认不填写
例如:
select SDO_GEOM.SDO_AREA(geom,0.05) area from tableNmae
第二种是通过将图层进行发布之后,通过openlayer的方式获取
通过openlayer的方式获取面积需要获取到图形的经纬度,然后进行计算,因为我这边使用的是
EPSG:4326,因为我们需要获取的单位是常规的平方米,所以需要进行转化,示例代码:
var sphere = new ol.Sphere(6378137); console.log(Math.abs(sphere.geodesicArea(feature.getGeometry().getCoordinates()[0])));
二、对于空间坐标可能会出现坐标值很多的情况,通过直接导入的方式会出现异常,所以我们需要将空间坐标进行一个转化,在进行导入:
DECLARE geom mdsys.sdo_geometry; BEGIN geom := mdsys.sdo_geometry(2003,4326,null,sdo_elem_info_array(1,1003,1),sdo_ordinate_array(121.71358318910205,31.382628846679829,121.71149355855012,……121.71358318910205,31.382628846679829));EXECUTE IMMEDIATE 'UPDATE TABLENAME set GEO_ = :gm WHERE IDOLD=405' USING geom; END;
将空间坐标的值伪装成函数进行存储,这样就可以实现
三、空间坐标的读取
当我们需要将空间坐标读取,需要对空间坐标进行处理的时候:我们首先通过sql读取出来的数据是
STRUCT geom = (STRUCT)map.get("GEOM"); --STRUCT 是jdbc-driver的类
然后再通过JGeometry读取STRUCT的数据
JGeometry jg = JGeometry.load(geom);
通过JGeometry我们可以获取到空间数据的坐标,及坐标系等信息
double[] jgArr = jg.getOrdinatesArray();--获取空间坐标系坐标

本文主要探讨了在GIS工作中遇到的空间坐标处理问题,包括通过Oracle空间函数和OpenLayer获取空间面积的方法,解决大量坐标导入异常的策略,以及如何读取和处理空间坐标数据。涉及到的关键技术包括Oracle的SDO_GEOMETRY类型、Java的JGeometry库以及SQL操作。
1万+

被折叠的 条评论
为什么被折叠?



