![](/img/trans.png)
[英]How to convert Geom object from PostGis in R in latitude and longitude?
[英]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 的所有范圍(見下圖)。 重疊區域被計數兩次、三次或事件四次。 每個事件的房屋計數正確,但我無法總結結果。 有沒有辦法糾正這些重疊,以便我可以在所有選定的事件中獲得正確的房屋總數?
編輯:示例
只是一個非常簡單的例子:事件 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.