[英]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)
)
我想要:
添加兩個新列:
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.