感受postgis空间函数在项目中应用的强大之处--带实例分析及mixed SRID geometries 错误解决

最近有个项目需求需要乙方完成,他们GIS开发人员能力有限遇到了困难。需求是将某区域进行固定大小的网格分割(类似渔网)根据网格内存在的点数量和属性值,对网格进行高度拉伸和颜色渲染的三维需求,点的属性信息中有区域和街道的属性。

      很多人一开始想到的就是循环。在代码中只要根据点和网格进行循环判断点是否在网格中,然后属性值通过代码组织就行。这样的实现方式,第一,对于数据量大的场景肯定不行的,因为逻辑处理过程花费的时间代价已经很高,web系统肯定还有图形渲染和展示的需求,甚至三维展示的需求,这些会造成时间等待过长,用户体验差;第二,代码量有点大,毕竟程序员都“懒”。

      那作为一个负责任的甲方怎么办呢,怼完他们,还是不符合要求,那咋办。那就自己解决吧,其实很简单。项目中用的是postGIS,将制定的网格制作处理,导入库中。根据分析我们需要对点和网格面进行相交(intersects)判断,直接通过st_intersect函数即可获取到所有相交的面,如此相交的结果是面与点一堆多的关系,此时只需对面进行聚合函数count 和 group by 面几何体(geom) ,便获取到了与当其那面相交的点的数量,也就是在面范围内的点数量。再根据其他需求,将需要统计的信息作为group by的条件即可。查询语句如下:

SELECT
	km_grid.gid,
	count( km_grid.geom ) AS count,
	st_asgeojson ( st_transform ( km_grid.geom, 4490 ) ) AS json 
FROM
	point,
	km_grid 
	
WHERE
	st_intersects ( point.geom, st_transform ( km_grid.geom, 4490 ) ) != 'f' 
GROUP BY
	km_grid.gid,
	km_grid.geom 
ORDER BY
	count DESC

当前语句,项目中2500多个点和2200多个面的相交操作判断,通过空间函数和分组、聚合函数的一个结合,只花了0.192秒,如果通过代码逻辑进行循环相交判断,属性字段进行查询组织,至少需要2-3秒的时间。可想而知通过空间函数的熟练使用,基本能达到质的变化。

注意事项:在查询构成中可能会出现 mixed SRID geometries 的错误,从两处着手处理:

1、这时候去检查一下当前查询中运用的坐标系与自己geom字段中的值是否是同一个坐标系下的坐标值,

比如:我的geom中的坐标值是那种平面坐标的值,比如3度带,中央经线为东经114的CGSC2000的平面坐标(对应的srid 是4575),这时我们需要将其坐标系重新设置为4575。SQL语句如下:

-- 重新设置坐标系的srid 
-- select UpdateGeometrySRID('GISER_dzj', 'geom', 4547);

如果是正常的4490对应的经纬度,则是设置为4490即可。

2、查看空间操作之间各geom坐标系是否一致(此时运用st_tranform(geom,srid)即可将坐标进行转换)。

比如:a 表中的srid 是4490 ,b 表中的srid 是4575,这就没法进行空间操作,需要将其中一方转换为另一方,再进行空间操作即可。转换函数的使用例子,可见第一处SQL语句。最后上个效果,吸引一下眼球。

感受postgis空间函数在项目中应用的强大之处--带实例分析及mixed SRID geometries 错误解决_第1张图片

 

 

你可能感兴趣的:(JavaScript,GIS,cesium)