สามารถจัดกลุ่มตามเรขาคณิตใน PostGIS ได้ไหม


17

ตกลงกับเรขาคณิตหรือไม่?

เราทำการนับจำนวนจุดด้วยรูปหลายเหลี่ยมซึ่งเกี่ยวข้องกับการตัดข้อมูลก่อนเพื่อนับอินสแตนซ์ของนักเรียน โดยขอบเขตโรงเรียนกลุ่มบล็อก ฯลฯ :

SELECT
  n.nbhd_id
  , count(*) AS count_burglaries
FROM denver.crime AS c
  JOIN denver.neighborhoods AS n
    ON ST_Intersects(c.geom, n.geom)

WHERE c.offense_ty LIKE 'BURG%'
GROUP BY n.nbhd_id

ขั้นตอนที่สองคือการตัดคำในแบบสอบถามย่อยเพื่อเข้าร่วมเรขาคณิตจากตารางรูปหลายเหลี่ยมกลับไปที่แบบสอบถามแบบนับ:

SELECT

count.*
, n.nbhd_name
, n.geom
FROM (
SELECT
n.nbhd_id
, count(*) AS count_burglaries
FROM denver.crime AS c
JOIN denver.neighborhoods AS n
ON ST_Intersects(c.geom, n.geom)

WHERE c.offense_ty LIKE 'BURG%'
GROUP BY n.nbhd_id

) AS count

JOIN denver.neighborhoods AS n
ON count.nbhd_id = n.nbhd_id

แต่ดูเหมือนว่าคุณสามารถใช้รูปทรงเรขาคณิตใน GROUP BY:

SELECT
n.nbhd_id
, n.nbhd_name
, n.geom

, count(*) AS count_burglaries
FROM denver.crime AS c
JOIN denver.neighborhoods AS n
ON ST_Intersects(c.geom, n.geom)

WHERE c.offense_ty LIKE 'BURG%'
GROUP BY n.nbhd_id, nbhd_name, n.geom

การรวมเรขาคณิตใน GROUP BY เป็นวิธีที่ถูกต้องหรือไม่?


สิ่งที่ไม่GROUP BYได้รับคุณ? มันไม่สามารถเข้าร่วมได้ด้วยกุญแจที่เป็นเอกลักษณ์nbhd_idหรือ? คุณกำลังจัดเรียงให้กว้างขึ้นซึ่งจะเพิ่มเวลาใช้งานซึ่งอาจมากกว่าการเข้าร่วมครั้งต่อไป
วินซ์

1
มันช่วยให้ฉันไม่ต้องพันคิวการค้นหาเป็นคิวย่อยย่อยเพื่อเข้าร่วมใน nbhd_id - ถ้ามันเพิ่ม runtime ให้กับกลุ่มโดยเรขาคณิตนั่นเป็นเหตุผลที่เป็นไปได้ที่จะไม่ทำเช่นนี้คุณจะไม่พูดเหรอ?
DPSSpatial

คำตอบ:


18

ในกรณีนี้แทบจะไม่มีอะไรผิดปกติในการจัดกลุ่มตามเรขาคณิตเนื่องจากคุณได้จัดกลุ่มด้วย ID ที่ไม่ซ้ำกันแล้ว ( nbhd_id) และในขณะที่คุณชี้ให้เห็นมันจะช่วยให้คุณเข้าร่วมและทำให้แบบสอบถามสะอาดขึ้น

สิ่งสำคัญคือต้องรู้ว่าGROUP BY geomประโยคใน PostGIS 2.3 และก่อนหน้านี้จริง ๆ แล้วจัดกลุ่มแถวตามความเสมอภาคของกล่องขอบเขตไม่ใช่ความเท่าเทียมกันทางเรขาคณิต ด้วยข้อมูลจริงที่ไม่ได้ถูกประดิษฐ์สิ่งนี้มักจะมีผลเช่นเดียวกับการจัดกลุ่มในความเท่าเทียมกันทางเรขาคณิต (และเร็วกว่ามาก) แต่อาจไม่ได้ผลลัพธ์ที่คาดหวังเมื่อรูปหลายเหลี่ยมที่แตกต่างกันมีกล่องขอบเขตเดียวกัน การเริ่มต้นใน PostGIS 2.4 GROUP BYดำเนินการตามคำจำกัดความที่เข้มงวดของความเท่าเทียมกันทางเรขาคณิตโดยคำนึงถึงจุดเริ่มต้นและการวางแนวของรูปทรงเรขาคณิต

เนื่องจากคุณจัดกลุ่มอยู่nbhd_idแล้วคุณจะยังคงเห็นแถวแยกกันแม้ว่ารูปหลายเหลี่ยมของเพื่อนบ้านที่ต่างกันสองแห่งจะแชร์กล่องขอบเขต


บทความนี้จากเปาโลมีการเปลี่ยนแปลงคำตอบนี้หรือไม่? blog.cleverelephant.ca/2017/09/postgis-operators.html
DPSSpatial
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.