ค้นหาจุดที่อยู่ในชุดพิกัด


9

ฉันมีฐานข้อมูล PostGIS และฉันต้องการค้นหาคะแนนที่อยู่ในบางภูมิภาค (กล่องที่มีขอบเขต) ฉันมีพิกัดสองชุดซึ่งฉันจะได้รับทั้งสี่จุดสี่เหลี่ยมผืนผ้าที่เกิดขึ้นในกล่อง (ถ้าจำเป็น) คอลัมน์ข้อมูลของฉันเป็นชื่อ 'จุด' และเป็นจุดพิมพ์ด้วย

  • อย่างไรก็ตามมีการระบุพิกัดสี่ชุด (ละติจูด / ลองจิจูด) และรับคะแนนทั้งหมดที่อยู่ในกล่อง
  • หรือระบุจุดสองจุดแล้วปล่อยให้ฐานข้อมูลจัดทำมุมของสี่เหลี่ยมและกลับจุดภายใน

ในกรณีที่ฉันไม่ชัดเจนว่าฉันต้องการบรรลุอะไร เทียบเท่ากับ 'วานิลลา' sql ถ้าฉันมีเขตละติจูดและลองจิจูดแทนจุดจะเป็น:

SELECT * FROM myTable where lat> xMin AND lat < xMax AND long > yMin and long < yMax

ปรับปรุงแก้ไข:

ฉันกำลังพยายามแก้ปัญหาของ underdark ตอนแรกฉันไม่มี ST_MakePoint constuctor (ตอนนี้ฉันทำ) และฉันยังคงได้รับข้อผิดพลาดที่คล้ายกันมาก

SELECT * FROM myTable WHERE ST_Within(ST_MakePoint(point),GeometryFromText('POLYGON((75 20,80 30,90 22,85 10,75 20))',4326))

และฉันได้รับข้อผิดพลาดนี้:

ERROR:  function st_makepoint(point) does not exist
LINE 1: SELECT * FROM triples WHERE ST_Within(ST_MakePoint(point),Ge...
                                          ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.


********** Error **********

ERROR: function st_makepoint(point) does not exist
SQL state: 42883
Hint: No function matches the given name and argument types. You might need to add explicit type casts.
Character: 39

แก้ไข:

ในระยะสั้นฉันสามารถแก้ไขได้ด้วย:

SELECT * FROM triples WHERE box '((point1),(point2))' @> point

แต่ฉันจะต้องคิดออกว่าทำไมไม่มีฟังก์ชั่น PostGIS ไม่ทำงานสำหรับฉัน


วิธีที่แนะนำคือการโพสต์ในที่เดียวเท่านั้น หากสถานที่นั้นไม่เหมาะสมหรือไม่ได้ผลก็สามารถโยกย้ายได้อย่างง่ายดาย ฉันจะไม่ดำเนินการใด ๆ เพราะ GIS เป็นที่ที่คำถามของคุณควรเป็น แต่ฉันอยากให้คุณลบ cross post บน SO
whuber

1
@ เมื่อไร .. เสร็จแล้ว
Ankur

ไม่ - เลือก GeometryFromText ('POLYGON ((75 20,80 30,90 22,85 10,75 20))', 4326) - ใช้งานได้หรือไม่
ฌอน

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

คอลัมน์ "จุด" ที่คุณอ้างอิงใน ST_MakePoint (จุด)
อะไร

คำตอบ:


9
SELECT * FROM myTable WHERE 
ST_Within(the_geom, GeometryFromText ('POLYGON((75 20,80 30,90 22,85 10,75 20))', 4326))

<- แทนที่พิกัดตามความจำเป็น


ขออภัยสำหรับคำถามที่โง่ แต่ 'the_geom' คืออะไร ... ฉันควรจะตั้งชื่อ * SELECT จากแบบสอบถาม myTable และค่านั้นกลายเป็น 'the_geom'
Ankur

ขออภัยแน่นอนมันเป็นคอลัมน์ที่ถูกค้นหา ฉันจะเรียกมันว่า db_column หรืออะไรทำนองนั้น แต่ postgis docs คิดเป็นอย่างอื่น ... มันสมเหตุสมผลเมื่อคุณรู้ว่ามันคืออะไร
Ankur

1
เมื่อฉันรันสิ่งนี้ฉันได้รับข้อผิดพลาดที่ระบุว่า GeometryFromText ไม่มีอยู่จริง ฉันใช้ postgis 2.0 ฉันลอง st_geomfromtext ด้วย
picardo

@underdark บางทีฉันผิด แต่ดูเหมือนว่าวงเล็บจะหายไป
Davide Pastore

3

ดูเหมือนว่าคุณต้องการ BBOX (Bounding Box) จากคะแนนของคุณดังนั้นST_Extentน่าจะดี

BBOX2D

http://www.bostongis.com/postgis_extent_expand_buffer_distance.snippet

จะให้หน้าhttp://postgis.net/docs/ST_Extent.htmแต่เซิร์ฟเวอร์กำลังมีปัญหา


Re: เซิร์ฟเวอร์ ... ฉันรู้ว่าฉันได้รับการพยายามที่จะดูที่สำเนาแคชของ Google :)
Ankur
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.