Join Postgis:用于与普查枚举区域多边形进行空间连接的最佳光栅图块大小

Join Postgis:用于与普查枚举区域多边形进行空间连接的最佳光栅图块大小,join,polygon,postgis,raster,Join,Polygon,Postgis,Raster,问题是如何在将30x30m空间分辨率的光栅导入Postgis数据库时选择光栅分幅大小,以便优化与复杂多边形的空间连接 i、 例如,在raster2pgsql中,如何选择-t开关来优化空间连接查询 光栅数据表示从30米分辨率的SRTM数据得出的坡度。 多边形代表巴西利亚人口普查的普查区设置员censitário。一个统计区相当于覆盖300户家庭的面积,约为美国人口普查轨道的1/4,在城市地区,范围从1个城市街区到8个城市街区 我尝试使用以下查询获取每个枚举区的平均地形坡度: -- importin

问题是如何在将30x30m空间分辨率的光栅导入Postgis数据库时选择光栅分幅大小,以便优化与复杂多边形的空间连接

i、 例如,在raster2pgsql中,如何选择-t开关来优化空间连接查询

光栅数据表示从30米分辨率的SRTM数据得出的坡度。 多边形代表巴西利亚人口普查的普查区设置员censitário。一个统计区相当于覆盖300户家庭的面积,约为美国人口普查轨道的1/4,在城市地区,范围从1个城市街区到8个城市街区

我尝试使用以下查询获取每个枚举区的平均地形坡度:

-- importing
shp2pgsql -c -s 4674:4326 -I -W LATIN1 enum_districs_2010  public.enum_districs_2010 | psql -d r342471958
raster2pgsql -c -s 4326 -I -t 100x100 *.tif  public.slope | psql -d r342471958

-- average slop per enum distric
select sv.cd_geocodi, SUM(sv.val * ST_Area(sv.geom)) / ST_Area(ST_Union(sv.geom)) As avgsqm
  from (
     select set.cd_geocodi, (ST_Intersection(slo.rast,1, set.geom)).*
  from enum_districs_2010 set
     inner join slopes slo on ST_Intersects(slo.rast, 1, set.geom)
  ) sv 
group by sv.cd_geocodi

在选择tile size-t时是否有一些经验法则?

我相信这是为矢量/光栅相交编写空间连接的最干净的方法

选择sv.cd_geocodi,avgsv.val作为avgsqm 从…起 选择set.cd\u geocodi、ST\u Intersectionslo.rast、1、distr.geom* 来自enum_districs_2010 District,slo 在ST_交叉处,1号,地理分布区 sv 按sv.cd_geocodi分组 此外,我认为您应该能够使用平均值功能,因为您已经在按人口普查区分组。 关于光栅/矢量交点的最佳平铺问题是一个很好的问题,很难给出明确的经验法则。通常,由于实际上必须打开光栅才能获得其像素值,因此您需要选择大小类似的光栅,可能比矢量地块大一点,这样,在最坏的情况下,您只需为与之相交的每个矢量多边形打开4个光栅。归根结底,光栅与矢量大小的最佳比例是一个复杂的统计问题,但从新闻组的帖子中可以看出,直觉上,较小的光栅大小比较大的光栅大小表现得更好。我建议您尝试将光栅图的大小减小一点


解释的输出很难用空间数据来理解,因为成本本质上是从磁盘中提取数据的成本的度量,并且不考虑底层空间操作的成本,如相交和相交。explain输出表明未使用空间索引,这可能是尝试使用较小瓷砖大小的另一个原因。另外,将主键添加到enum_districts,如果尚未添加主键,请运行analyze更新统计信息,然后重试解释。有时候,解释哪些复杂的空间查询可能不会有太大的变化,所以我仍然建议您尝试运行查询,看看它是否会更快。

好的,所以我认为您可以做的最好的事情是使用ST_SummaryStats函数来提高速度

就我而言:

select (ST_SummaryStats(ST_UNION(rasters.rast))).mean, parcels.gid
from (select gid, "geomLocal" as geom from surfaceparcel where lnd_ac > 200) as parcels, rasters.shadow_48135 as rasters
where ST_Intersects(rasters.rast, geom)
group by parcels.gid
order by parcels.gid
3-4秒

旧职位:

这是更多的进一步讨论。正如前面提到的,在我的20多个测试中,小型汽车是最好的——注意,我加入了1英里区域。事实上,我在一些较小的尺寸上出现了错误,所以这似乎是明智的。至于其他加速的方法,我尝试了几种不同的方法

首先,确保数据库配置正确。这不是很全面,但很好:

第二,我试着把光栅缩小。您可能想尝试python,但我默认为R。您需要更改EPSG代码和文件名

系统'raster2pgsql-I-C-M-t auto-s 3663 slope.tif rasters.slopeBig | psql-d postgres' 图书馆光栅
我认为这是一个有趣的问题。表现如何?比你想象的更糟?你做过不同尺寸的实验吗?我对空间查询的一般经验是,您必须使用自己的数据进行测试,因为查询优化器帮不了什么忙,因为它涉及从磁盘获取数据的成本和索引使用,这与多边形/光栅交叉点的相对性能无关。到目前为止,我尝试将圣保罗大都会8.5k km2的霍尔(hole)枚举区与重叠的光栅数据的1x1度平铺合并,面积约为牙买加。它运行了几个小时,然后使我的机器崩溃,Unbantu 12.04 LTS,内存:7.8gb。我不知道索引是如何工作的,也不知道它是否在空间上是智能的,是否在层次上进行空间比较,等等。我现在将尝试在移动的边界框上循环,并在每个框内进行相交。还有,editsSao Paulo大都会区的tks,牙买加的大小,lol。好的,当你把explain放在你的查询前面时会发生什么?EXPLAINs:GroupAggregate cost=681295134.45..735325929.45 rows=16622486000 width=50。。。所以我不知道这7.35亿的花费在时间上意味着什么。我应该在导入光栅时使用-t来看看是否可以降低成本吗?这是我应该担心的成本吗?是的
我不明白为什么你的空间索引没有被使用。这基本上意味着没有索引,并且获取16622486000行。然后在顶部,你正在做聚合函数。我已经尝试了大量的尺寸,对1平方英里的面积和汽车进行了类似的分析,这些都是非常小的。也就是说,当我需要做1000个区域时,速度非常慢。如果我能想出如何将光栅存储为整数而不是双精度,我打赌这会有帮助…@ideamotor。这听起来是个不错的问题?遗憾的是,OP从未发布过他的解决方案,尽管我认为大家的共识是使用更小的光栅尺寸,正如你所说的。