簡體   English   中英

如何避免 Postgis 中重疊區域的重復計數?

[英]How can I avoid double counts from overlapping areas in Postgis?

我想使用 Postgis 計算城鎮中事件的影響。 我有一個包含事件點位置 (event_count_2019_geo) 的表和一個包含鎮 (utrecht_2020) 以及點位置的所有建築物的表。 我數了一下事件周圍200米范圍內的所有房屋,並計算了有人居住的房屋數量。 請參閱下面的代碼。

-- In a range of ~200 meters
UPDATE event_count_2019_geo
SET gw200 = temp.aantal_woningen
FROM (SELECT locatie, count(event_count_2019_geo.locatie) AS aantal_woningen
      FROM event_count_2019_geo
           INNER JOIN utrecht_2020 AS bag ON (ST_DWithin(bag.geo_lokatie, event_count_2019_geo.geo_lokatie, 0.002))  
      WHERE  bag.verblijfsobjectgebruiksdoel LIKE '%woonfunctie%'
      GROUP BY locatie
     ) AS temp
WHERE event_count_2019_geo.locatie = temp.locatie;

問題是我最終有太多的房屋受到該事件的影響。 我繪制了每個事件周圍 200m 的所有范圍(見下圖)。 重疊區域被計數兩次、三次或事件四次。 每個事件的房屋計數正確,但我無法總結結果。 有沒有辦法糾正這些重疊,以便我可以在所有選定的事件中獲得正確的房屋總數?

每個事件周圍 200 米范圍

編輯:示例

只是一個非常簡單的例子:事件 1 的查詢產生房屋 A、B、D; 事件 2 = C、D、E。每個事件的計數為 3,它們的總和為 6(這確實是正確的行為),而我希望看到的是 5,因為 D 被計算雙倍。

感謝@JimJones 的建議,我找到了解決方案。 我定義了兩種視圖:一種使用舊方式查找所有房屋 (find_houses_all),另一種僅返回唯一房屋 (find_houses_unique)。

-- Find all houses within a radius of ~200m of an event
DROP VIEW IF EXISTS find_houses_all;

CREATE VIEW find_houses_all AS 
    SELECT bag.openbareruimte, bag.huisnummer, bag.huisletter, bag.huisnummertoevoeging,
           event_count_2019_geo.locatie
    FROM event_count_2019_geo
         INNER JOIN utrecht_2020 AS bag ON (ST_DWithin(bag.geo_lokatie, event_count_2019_geo.geo_lokatie, 0.002));  

-- Find all *unique* houses within a radius of ~200m of an event 
-- Each house is uniquely identiefied by openbareruimte, huisnummer, huisletter
-- and huisnummertoevoeging, so these are the columns to apply DISTINCT ON
DROP VIEW IF EXISTS find_houses_unique;

CREATE VIEW find_houses_unique AS 
    SELECT DISTINCT ON(bag.openbareruimte, bag.huisnummer, bag.huisletter, bag.huisnummertoevoeging) 
           bag.openbareruimte, bag.huisnummer, bag.huisletter, bag.huisnummertoevoeging,
           event_count_2019_geo.locatie
    FROM event_count_2019_geo
         INNER JOIN utrecht_2020 AS bag ON (ST_DWithin(bag.geo_lokatie, event_count_2019_geo.geo_lokatie, 0.002));

我運行了這兩個腳本並且確實得到了我預期的輸出。

SELECT locatie, COUNT (locatie)
FROM find_houses_all -- find_houses_unique
GROUP BY locatie
ORDER BY locatie;

find_houses_all 的輸出在所有情況下都大於或等於 find_houses_unique 的輸出。 電子表格中的示例輸出和減法如下:

Locatie         All Unique  All - Unique
achter st.-ptr. 617 222     395
berlijnplein    87   87       0
boothstraat     653 175     478
breedstraat    1057 564     493
buurkerkhof     914 163     751
catharijnesngl. 134  38      96
domplein        842 149     693
 ...
Total         35399 13196   22203

負數表示錯誤。

偉大的數據科學家之一。 我在學習! 在這個問題中,作為傳統的統計學家,我會使用集合論算法來獲得受影響案例(房屋)的唯一計數,即 n(AUB) = n(A) + n(B) -n(A-intersection-B)

暫無
暫無

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

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