利用postgis进行图斑处理
2018-11-07 本文已影响63人
上岸躲雨
1 背景
最近写了个爬取网络地图矢量数据的爬虫(土地分类),程序比较给力能够把数据爬取下来,且效率还是比较高的。
直接上图:
原始数据
由于是请求矢量切片爬取的数据,就存在瓦片边界的问题,比如一个完整的多边形可能因为存在于多个切边上这个多边形就被切成多个部分。怎么把这个分开来的多边形合并起来,这就需要解决。本质上这个问题就是处理图斑的问题。当然可以用arcgis、qgis的类似软件进行人工处理。但是写代码的,怎么能用这种耗时耗力的方法呢。
2 思路
第一个想到的是监测边界,然后程序合并(程序写起来难度太大了)。
第二个方法是建立网格,一个一个格子去处理(复杂度依然存在)。
第三观察图形,发现能合并的数据距离都极近,那如果把多边形进行聚簇,然后对簇进行合并,问题就解决了。
postgis里面有ST_ClusterWithin函数,可以进行聚簇。
Synopsis
geometry[] ST_ClusterWithin(geometry set g, float8 distance);
Description
ST_ClusterWithin is an aggregate function that returns an array of GeometryCollections, where each GeometryCollection represents a set of geometries separated by no more than the specified distance. (Distances are Cartesian distances in the units of the SRID.)
当然里面也会用到其他的一些函数:如ST_UnaryUnion、ST_CollectionHomogenize等,这里就不对各个函数进行解释了,自行Google。这些比较偏的函数,为了实现这个功能,也是费尽脑汁,对着电脑坐了一整天。废话少说,直接上处理程序的代码。
--以一种土地类型进行合并
WITH testdata AS (
SELECT
UNNEST (
ARRAY (
SELECT
st_transform (geom, 3857)
FROM
region grh
WHERE
grh.z = 17
AND heigth = 'regions:public'
)
) as geom
)
SELECT ST_UnaryUnion(ST_CollectionHomogenize(st_transform(unnest(ST_ClusterWithin(geom, 0.1)),4326))) FROM testdata
3 结果验证
合并结果效果蛮好的,磨刀不费砍柴工,有了这套解决方案,以后再碰到需要处理的图斑,一条sql语句,直接搞定。所以玩开源方案,能随便组织自己的想法,真是蛮爽。