กล่องกระโดดสำหรับตาราง PostGIS


19

มีวิธีง่ายๆในการรับกล่อง bounding สำหรับทั้งตารางใน PostGIS หรือไม่

คำตอบ:


26

ST_Exentควรทำการหลอกลวง

ST_Extent - ฟังก์ชั่นรวมที่ส่งกลับกล่องขอบเขตที่ล้อมรอบแถวของรูปทรงเรขาคณิต

ใช้แบบนี้:

SELECT ST_Extent(the_geom) as table_extent FROM your_table;

13

ในฐานะที่เป็น@underdark ตอบ , ST_Extentจะทำผลงานได้ แต่เก็บไว้ในใจว่ามันไม่ได้กลับมาเป็นรูปทรงเรขาคณิต box2dแต่ หากคุณต้องการประเภทรูปทรงเรขาคณิตคุณควรใช้สิ่งที่ชอบ

SELECT ST_SetSRID(ST_Extent(the_geom), THE_SRID) as table_extent FROM your_table;

นอกจากนี้หากสิ่งที่คุณต้องการคือรับกล่องขอบเขตของแต่ละแถวคุณสามารถใช้ST_Extentและของปลอม GROUP BYเช่นนี้:

SELECT ST_SetSRID(ST_Extent(the_geom),THE_SRID) as table_extent FROM your_table GROUP BY gid;

สมมติว่า gid เป็นคีย์หลักของตาราง

แต่ST_Envelopeจะทำงานได้ดีขึ้นตามที่ @ bugmenot123 ระบุไว้ในความคิดเห็น

SELECT ST_Envelope(geom) FROM your_table ;

1
หากคุณต้องการกล่องขอบเขตสำหรับแต่ละแถวโดยไม่มีการรวมเพียงใช้ST_Envelope! นั่นไม่ใช่สิ่งที่ถูกถาม
bugmenot123

1
คุณพูดถูกเกี่ยวกับ st_envelope ฉันจะอัพเดตคำตอบ เกี่ยวกับ "ไม่ถามหา" บางครั้งการพยายามให้คำตอบที่เกี่ยวข้องเพราะสำหรับคนที่พูดภาษาอังกฤษไม่ดี (เช่นฉัน) นั้นยากที่จะเลือกข้อความค้นหาที่ถูกต้องเพื่อค้นหาคำตอบ อาจฉันตกอยู่ในคำถามนี้ค้นหาคำตอบสำหรับหัวข้อที่สอง
Francisco Puga

4

ความเป็นไปได้อีกอย่างคือการใช้ST_Envelopeฟังก์ชันซึ่งคืนค่าเรขาคณิตด้วย SRID

ST_Envelope - ส่งกลับรูปทรงเรขาคณิตที่เป็นตัวแทนของกล่องขอบเขตของรูปทรงเรขาคณิตที่ให้มา

พร้อมกับฟังก์ชั่นรวมที่ST_Unionจะได้รับการรวมกันของรูปทรงเรขาคณิตทั้งหมด (หรือสหภาพของซองจดหมายที่เกี่ยวข้อง) ดังนี้

SELECT ST_Envelope(ST_Union(geom)) AS table_extent FROM your_table

หรือ

SELECT ST_Envelope(ST_Union(ST_Envelope(geom))) AS table_extent FROM your_table

ตัวเลือกที่สองควรเร็วขึ้นเนื่องจากช่วยให้การดำเนินการสหภาพง่ายขึ้นโดยใช้ซองจดหมายของรูปทรงเรขาคณิตแต่ละแบบ

ดูแหล่งที่มา


1
วิธี ST_Extent นั้นมีขนาดที่เร็วขึ้นเนื่องจากสามารถทำงานกับตัวเลขได้อย่างหมดจดและไม่ต้องทำการคำนวณทางเรขาคณิตที่ซับซ้อน หลีกเลี่ยง ST_Union ทุกครั้งที่ทำได้
bugmenot123

2

การไม่บังคับใช้การรวมตัวเชิงพื้นที่ควรเป็นวิธีที่เร็วกว่า:

select
  min(ST_XMin(geom)) as l,
  min(ST_YMin(geom)) as b,
  max(ST_XMax(geom)) as r,
  max(ST_YMax(geom)) as t
from x

1
ST_Extent ยังไม่ต้องทำอะไรเชิงพื้นที่ เร็วกว่าวิธีของคุณสำหรับข้อมูลของฉัน 2-3 เท่า (รูปหลายเหลี่ยม 400k) อาจเป็นเพราะมันสามารถทำได้ทั้งหมดในครั้งเดียวในขณะที่วิธีการของคุณต้องดูหลายแง่มุมของแต่ละ geom แล้วรวมกันในตอนท้าย
bugmenot123
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.