PostGIS:使用 Lats/Lngs 进行空间连接求和

PostGIS: Spatial Joins Summing using Lats/Lngs

我有一个 table,名为 pets,带有 lats 和 lng 坐标和变量,以及一个通过上传形状文件创建的 table,名为 city , 列 left, right, top, bottom, lat, lng,geom.

    lat    lng   cats  dogs
   -99.4   42.1   2     0
   -98.1   44.3   1     1
   -99.7   43.6   0     3 
   -99.8   42.0   2     1

我想知道如何构建一个查询来汇总每个边界内的猫和狗的数量。通常我会在 QGIS 中进行空间连接,但我的数据集太大并且在成功连接两者之前崩溃了。

我对 QGIS 和 Postgres 非常熟悉,但对 PostGIS 还是很陌生。我构建了一个查询但未能获得我需要的答案:

select sum(pets.dogs)
from pets, city
WHERE ST_Within(pets.dogs, city.geom);

非常感谢为新手编写的有关 PostGIS 的任何指示或资源。谢谢!

pets table 需要一个 GeometryColumn 代表 lat/lng。像这样添加:

psql> SELECT AddGeometryColumn ('my_schema','pets','geom',4326,'POINT',2);
psql> UPDATE pets SET geom=ST_SetSRID(ST_MakePoint(lng, lat), 4326);

对于大型数据集,建议在列中添加一个spatial index

psql> CREATE INDEX geom_idx ON pets USING GIST (geom);

这应该允许像这样的快速查询:

psql> SELECT sum(pets.dogs)
      FROM pets, city 
      WHERE ST_Within(pets.geom, city.geom);

这将给出任何城市几何图形中所有狗的单一计数。按城市名称(或 ID)分组以按城市获取计数:

psql> SELECT city.id, city.name, sum(pets.dogs)
      FROM pets, city 
      WHERE ST_Within(pets.geom, city.geom)
      GROUP BY city.id;