เลือกขอบเขตของกล่องโดยใช้ postGIS


36

ฉันต้องการสร้างแบบสอบถามเพื่อเลือกวิธีการทั้งหมดและโหนดของพวกเขาที่มีอยู่ภายในกล่องขอบเขตโดยใช้ postGIS กล่อง bounding จะต้องมีรายละเอียดทั้งหมดตามคำสั่ง osmosis "--bounding-box" จะดึงคำสั่ง

มีวิธีใดที่จะทำเช่นนั้น?

คำตอบ:


36

สำหรับเอกสาร osmosis ฉันเห็นตัวเลือกคำสั่ง :

--bounding-box top=49.5138 left=10.9351 bottom=49.3866 right=11.201

สำหรับ PostGIS คุณสามารถใช้ST_MakeEnvelope (ซ้าย, ล่าง, ขวา, บน, srid)เพื่อสร้าง box bounding จากนั้น&&ผู้ประกอบการ box boundingจะค้นหาตำแหน่งที่กล่อง bounding ตัดกัน:

SELECT *
FROM mytable
WHERE mytable.geom && ST_MakeEnvelope(10.9351, 49.3866, 11.201, 49.5138, 4326);

SRID 4326 สำหรับ WGS84 Lat / Long และจำเป็นสำหรับ PostGIS 1.5 เท่านั้น สามารถละเว้นได้สำหรับรุ่นที่ใหม่กว่า


ขอบคุณ ฟังก์ชัน ST_MakeEnvelope ต้องการพารามิเตอร์อีกหนึ่งตัวคือ srid ฉันไม่รู้ว่าจะใส่อะไร .. ความคิดใด?
uriel

1
ดูเหมือนว่าคุณกำลังใช้ PostGIS 1.5 ซึ่งต้องการพารามิเตอร์นั้น ฉันคิดว่า SRID นั้นถูกละเว้นดังนั้นค่าใด ๆ ที่อาจให้ผลลัพธ์เดียวกัน หากคุณมีข้อมูล lat / long โดยทั่วไปให้ใช้ SRID ที่ 4326
Mike T

1
เครื่องมือส่วนใหญ่ในปัจจุบันให้คุณเลือก SRID สำหรับข้อมูล OSM เมื่อคุณโหลด ค่าเริ่มต้นของ OSM SRID คือ 3857 (ปรอททรงกลม) SRID เริ่มต้นสำหรับข้อมูล lat / lon ส่วนใหญ่คือ SRID 4326 (Lat / Lon AKA WGS84) ตัวอย่างเช่นหากคุณโหลดข้อมูลด้วย SRID 3857 คุณจะต้องทำการแปลงจาก LAT / LON WGS84 เป็น 3857: ST_Transform (ST_MakeEnvelope (LON1, LAT1, LON2, LAT2, 4326), 3857) เครื่องมือบางอย่าง (เช่น imposm3) สนับสนุนเฉพาะ SRID 3857
Justin Swanhart

โปรดสังเกตว่าตัวดำเนินการ && จะไม่แปลง SRID ให้คุณ ต้องแน่ใจว่าซองจดหมายที่คุณสร้างนั้นอยู่ใน SRID เดียวกันกับรูปทรงเรขาคณิตของการทดสอบ trac.osgeo.org/postgis/ticket/2320
Nelson

1
&& โอเปอเรเตอร์คำนวณได้ช้ากว่า ST_Intersects
caiohamamura

8

ฉันคิดว่ามันจะเป็นแบบนี้: กล่องขอบเขตใน PostGIS สร้างขึ้นโดย

ST_GeomFromText('POLYGON((ulx uly, urx ury, llx llr, lrx lry, ulx uly))', <srid>)

แบบสอบถามจะใช้ ST_Intersection พร้อมแบบสอบถามย่อย

SELECT bbox_nodes.id, bbox_nodes.tag, nodes_geom 
FROM (SELECT nodes.id, nodes.tag, 
   ST_Intersection(nodes.the_geom, 
      ST_GeomFromText('POLYGON((ulx uly, urx ury, llx llr, lrx lry, ulx uly))', <srid> )).geom AS nodes_geom
   FROM nodes 
   WHERE ST_Intersects(nodes.the_geom, 
      ST_GeomFromText('POLYGON((ulx uly, urx ury, llx llr, lrx lry, ulx uly))', <srid> )) AS bbox_nodes
WHERE ST_Dimension(bbox_nodes.nodes_geom)=0;

ฉันทำสิ่งนี้มากขึ้นหรือน้อยลงจากหน้าความช่วยเหลือของ PostGIS
แบบสอบถามที่สองบนตารางวิธีออกแบบคล้ายกับข้างบน (แต่ด้วย ST_Dimension () = 1) ควรได้รับวิธี

HTH, Micha


สวัสดีขอบคุณ! srid อะไร ฉันต้องใส่อะไรลงไปใน <srid> และ ".geom" (บรรทัด 4) ดูเหมือนว่าไม่ถูกต้องควรมีหรือไม่
uriel

ขออภัยฉันพลาดความเห็นของคุณไปเมื่อสัปดาห์ที่แล้ว srid เป็นรหัสระบบพิกัดอ้างอิง เช่น 2039 สำหรับอิสราเอล นอกจากนี้ .geom สารสกัดจากส่วนเรขาคณิตของ "GeometryCollection คุณอาจจะมีสิทธิ์ว่ามันไม่จำเป็นต้องที่นี่..
ปาสเตอร์

4

มีหัวข้อที่คล้ายกับคำถามของคุณที่นี่ ...

ST_Intersection - (T) ส่งคืนเรขาคณิตที่แสดงถึงส่วนที่ใช้ร่วมกันของ geomA และ geomB การนำภูมิศาสตร์ไปใช้จะแปลงเป็นเรขาคณิตเพื่อทำสี่แยกจากนั้นแปลงกลับเป็น WGS84

1. คุณสามารถรับข้อมูลบางอย่างได้ที่นี่เกี่ยวกับฟังก์ชั่นการสร้างรูปทรงเรขาคณิต

SELECT ST_AsText(ST_Intersection(
  ST_Buffer('POINT(0 0)', 2),
  ST_Buffer('POINT(3 0)', 2)
));

การตัด

2. ข้อมูลอื่นที่นี่เกี่ยวกับ Intersects Intersection: PostGIS - ST_Intersects, ST_Intersection ...

SELECT b.the_geom As bgeom, p.the_geom As pgeom, 
        ST_Intersection(b.the_geom, p.the_geom) As intersect_bp
    FROM buildings b INNER JOIN parcels p ON ST_Intersection(b,p)
    WHERE ST_Overlaps(b.the_geom, p.the_geom)
    LIMIT 1;

การตัด

ฉันหวังว่ามันจะช่วยคุณ ...


0

นี่คือความคิดเห็นเกี่ยวกับรหัส @ Micha ของ

คู่พิกัดสำหรับPOLYGONควรเป็นไปตามคำสั่งตามเข็มนาฬิกา (หรือตามเข็มนาฬิกาตามลำดับ): ซ้ายบน, ขวาบน, ขวาล่าง, ซ้ายล่าง, ซ้ายบน

ดังนั้นตามเข็มนาฬิกาการเรียกใช้ฟังก์ชันควรเป็น:

ST_GeomFromText('POLYGON((ulx uly, urx ury, lrx lry, llx llr, ulx uly))', <srid>)

หรือทวนเข็มนาฬิกา:

ST_GeomFromText('POLYGON((ulx uly, llx llr, lrx lry, urx ury, ulx uly))', <srid>)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.