我正在尝试使用PostgreSQL / PostGIS计算矢量层中每个多边形的栅格统计信息(最小值,最大值,平均值)。
这个GIS.SE答案描述了如何通过计算多边形和栅格之间的交点然后计算加权平均值来做到这一点:https : //gis.stackexchange.com/a/19858/12420
我正在使用以下查询(dem
我的栅格在哪里,topo_area_su_region
我的矢量在哪里,并且toid
是唯一的ID:
SELECT toid, Min((gv).val) As MinElevation, Max((gv).val) As MaxElevation, Sum(ST_Area((gv).geom) * (gv).val) / Sum(ST_Area((gv).geom)) as MeanElevation FROM (SELECT toid, ST_Intersection(rast, geom) AS gv FROM topo_area_su_region,dem WHERE ST_Intersects(rast, geom)) foo GROUP BY toid ORDER BY toid;
这可行,但是太慢了。我的矢量层2489k的特点,周围每个人服用90毫秒到过程-这将需要几天来处理整个层。如果仅计算最小值和最大值(这避免了对ST_Area的调用),则计算速度似乎并没有明显提高。
如果我使用Python(GDAL,NumPy和PIL)进行类似的计算,则可以显着减少处理数据所需的时间,而不是对栅格进行矢量化处理(使用ST_Intersection),可以对矢量进行栅格化。在此处查看代码:https : //gist.github.com/snorfalorpagus/7320167
我真的不需要加权平均值-“如果碰到就行了”的方法就足够了-而且我有把握地确定这是放慢速度的原因。
问题:有什么方法可以使PostGIS像这样运行?即从多边形所接触的栅格中返回所有像元的值,而不是返回精确的交集。
我是PostgreSQL / PostGIS的新手,所以也许还有其他我做不正确的事情。我正在Windows 7(2.9GHz i7,8GB RAM)上运行PostgreSQL 9.3.1和PostGIS 2.1,并按照此处的建议调整了数据库配置:http : //postgis.net/workshops/postgis-intro/tuning.html