【问题标题】:PostGIS: Spatial Joins Summing using Lats/LngsPostGIS:使用 Lats/Lngs 进行空间连接求和
【发布时间】:2015-07-26 03:12:44
【问题描述】:

我有一个名为 pets 的表格,其中包含 lats 和 lng 坐标和变量,还有一个通过上传名为 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 上的任何指针或资源。谢谢!

【问题讨论】:

    标签: postgis


    【解决方案1】:

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

    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;
    

    【讨论】:

    • 谢谢!这很有意义!我有一个问题,/我修复了 update 查询以包含 lats 和 longs 的双精度类型。但是,当我运行这些查询时:UPDATE voters_map_data SET geom=ST_SetSRID(ST_MakePoint(lng::double precision, lat::double precision), 4326) PostGIS 返回错误 cannot recognize input for type double precision,有什么想法吗?
    猜你喜欢
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    • 2017-10-03
    • 1970-01-01
    • 2020-09-10
    相关资源
    最近更新 更多