先用一张图来表达。
ArcGIS的相交是将两个要素类的交集部分保存到生成的要素类中。
PostGIS的相交和ArcGIS的相交底层数学逻辑不一样
1.0 版本
create table ana_test as
with
a as (select * from xzqxs_temp ),
b as (select * from yjjbntcbq_temp ),
resultTable as (select ST_Multi(st_intersection(ST_MakeValid(a.wkb_geometry),ST_MakeValid(b.wkb_geometry))) as wkb_geometry from a,b)
select *,ST_Area(resultTable.wkb_geometry) as inter_area
from resultTable where ST_Area(wkb_geometry)>0
但是该版本sql执行效率很慢,我们看一下执行计划
2.0 版本
create table ana_test as
with
a as (select * from xzqxs_temp ),
b as (select * from yjjbntcbq_temp ),
resultTable as (select ST_Multi(st_intersection(ST_MakeValid(a.wkb_geometry),ST_MakeValid(b.wkb_geometry))) as wkb_geometry from a,b where ST_Intersects(a.wkb_geometry,b.wkb_geometry))
select *,ST_Area(resultTable.wkb_geometry) as inter_area
from resultTable where ST_Area(wkb_geometry)>0
但是该版本sql执行效率很慢,我们看一下执行计划
3.0 版本
增加索引,提升分析过滤效率
CREATE INDEX spatial_xzqxs_temp_geom_idx
ON xzqxs_temp
USING GIST (wkb_geometry);
CREATE INDEX spatial_yjjbntcbq_temp_geom_idx
ON yjjbntcbq_temp
USING GIST (wkb_geometry);
explain analyze
create table ana_test as
with
a as (select * from xzqxs_temp ),
b as (select * from yjjbntcbq_temp ),
resultTable as (select ST_Multi(st_intersection(ST_MakeValid(a.wkb_geometry),ST_MakeValid(b.wkb_geometry))) as wkb_geometry from a,b where ST_Intersects(a.wkb_geometry,b.wkb_geometry))
select *,ST_Area(resultTable.wkb_geometry) as inter_area
from resultTable where ST_Area(wkb_geometry)>0
4.0 版本
在比较特殊的情况下,上述版本3的代码执行还是很慢,首先我们观察数据
原因有如下几点:
- 行政区数据较大,空间索引发挥的作用优先,大图斑筛选出来的图斑个数仍然较多
- 行政区数据较大,每一个筛选出来的图斑需要与行政区图版做计算,大图斑中绝大部分节点的计算是无效且无意义的。但是大量节点的计算耗时巨大
所以如果使用小图斑计算可以更加便捷。
- 将行政区数据格网化后计算
- 使用下一级行政区数据进行计算,比如CJDCQ(村级调查区)、XZXZQ(乡镇行政区)
最后
以上就是老实指甲油最近收集整理的关于使用PostGIS求两个要素类的相交部分1.0 版本2.0 版本3.0 版本的全部内容,更多相关使用PostGIS求两个要素类的相交部分1.0内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复