簡體   English   中英

PostGIS-計算多邊形中的點(並在邊界內平均其特征)

[英]PostGIS - Count Points in Polygons (and average their features within the boundaries)

我有一張桌子,上面有一些點代表建築物

CREATE TABLE buildings(
  pk serial NOT NULL,
  geom geometry(Point,4326),
  height double precision,
  area double precision,
  perimeter double precision
)

另一個帶有折線的表(其中大多數已關閉):

CREATE TABLE regions
(
  pk serial NOT NULL,
  geom geometry(Polygon,4326)
)

我想要:

  1. 計算每個區域內的點數 (buildings_n)
  2. 查找區域邊界 (area_avg) 中一個特征(例如面積)的平均值

添加兩個新列:

ALTER TABLE regions ADD COLUMN buildings_n integer;
ALTER TABLE regions ADD COLUMN area_avg double precision;

我該如何做這兩個查詢?

我已經針對第1點嘗試過此操作,但失敗了:

INSERT INTO  regions (buildings_n)
SELECT  count(b.geom) 
FROM  regions a, buildings b
WHERE st_contains(a.geom,b.geom); 

謝謝,

斯特凡諾

區域幾何

您遇到的第一個問題是帶有'polylines'或線串的ST_Contains僅找到完全在線串的幾何圖形上的點。 如果要在由線串表示的區域內的點將不起作用,特別是如果這些點未閉合。 在此處查看有效的ST_Contains關系的示例: http : //www.postgis.org/docs/ST_Contains.html

為了使空間關系正常工作,您必須事先或在查詢中即時將區域的幾何形狀轉換為多邊形。 例如:

ST_Contains(ST_MakePolygon(a.geom),b.geom)

有關更多信息,請參見此參考資料: http : //www.postgis.org/docs/ST_MakePolygon.html

計算合計值

第二個問題是要對建築物表的子集(而不是整個表)使用聚合函數計數或平均值,您需要將區域ID與每座建築物相關聯...

SELECT a.pk region_pk, b.pk building_pk, b.area
FROM regions a, buildings b
WHERE ST_Contains(ST_MakePolygon(a.geom),b.geom)

..然后按建築物所屬的區域將建築物數據分組:

SELECT region_pk, count(), avg(area) average
FROM joined_regions_and_buildings
GROUP BY region_pk;

更新新列

第三個問題是您正在使用INSERT將值添加到新創建的列。 INSERT用於將新記錄添加到表中,UPDATE用於更改表中現有記錄的值。

因此,以上所有點的組合將導致以下查詢:

WITH joined_regions_and_buildings AS (
    SELECT a.pk region_pk, b.pk building_pk, b.area
    FROM regions a, buildings b
    WHERE ST_Contains(ST_MakePolygon(a.geom),b.geom)
)
UPDATE regions a
SET buildings_n = b.count, area_avg = b.average
FROM (
    SELECT region_pk, count(), avg(area) average
    FROM joined_regions_and_buildings
    GROUP BY region_pk
    ) b
WHERE a.pk = b.region_pk;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM