เลือกจุดทั้งหมดภายในกรอบ


11

ฉันเคยเห็นคำถามนี้ถามมาก่อน แต่คำตอบที่ฉันพยายามไม่ทำงาน

ฉันกำลังค้นหาวิธี OSM ทั้งหมดที่อยู่ในกล่องขอบเขต ข้อมูล OSM ถูกนำเข้าด้วย Mercator ทรงกลมเริ่มต้น ฉันกำลังสอบถามโดยใช้ LAT / LON ดังนั้นการแปลง

SELECT *
FROM planet_osm_ways
WHERE ST_Transform(
  ST_MakeEnvelope(37.808264, 37.804339, -122.275244, -122.271189, 
  4326),3857
);

เมื่อฉันเรียกใช้สิ่งนี้ฉันได้รับข้อผิดพลาดต่อไปนี้:

ข้อผิดพลาด: อาร์กิวเมนต์ของ WHERE ต้องเป็นชนิดบูลีนไม่พิมพ์เรขาคณิตบรรทัดที่ 3: WHERE ST_Transform (ST_MakeEnvelope (37.808264, 37.804339, -12 ...


1
ให้ลิงก์ไปยังคำถามเก่า ๆ ที่คุณได้อ่านและใช้ในการสร้างคำถามของคุณ
user30184

คำสั่งซื้อพิกัดของคุณใน ST_MakeEnvelope () ดูไม่เหมือนที่อยู่ในรูปแบบนี้, xmin, ymin, xmax, ymax
artwork21

@ artwork21 ฉันใช้ lat / long ใน ST_MakeEnvelope มันผิดหรือเปล่า? ฉันต้องแปลงเป็นรูปแบบอื่นหรือไม่ ผมคิดว่าสิ่งที่กำลังทำอยู่ ST_Transform
theartofbeing

1
ขออภัยผมต้องอ่านคู่มือที่ดีรวมทั้งเอกสารสคีมาอีกครั้งwiki.openstreetmap.org/wiki/Osm2pgsql/schema#planet_osm_ways Planet_osm_ways ไม่มีรูปทรงเรขาคณิตและค่อนข้างไร้ประโยชน์สำหรับผู้ใช้ปลายทาง มันมีไว้สำหรับระบบ ไม่มีโอกาสสร้างการสืบค้นกล่องขอบเขตจากตารางนั้น ด้วยตารางเช่น planet_osm_roads จึงเป็นไปได้ ยังคงเป็น planet_osm_roads.geom เพราะอย่างที่คุณเห็นจากสคีมามันมีชื่อว่า planet_osm_roads.way
user30184

1
ไม่ฉันว่าคุณไม่สามารถทำการสืบค้นกล่องจาก bounded_osm_ways เพราะตารางนั้นไม่มีรูปทรงเรขาคณิตใด ๆ โปรดดู: id, โหนด, แท็ก, รอดำเนินการ - ไม่มีรายการใดที่มีรูปทรงเรขาคณิต ตาราง _line, _point, _polygon และ _roads นั้นโอเค และฉันพยายามที่จะเน้นคอลัมน์รูปทรงเรขาคณิตในตารางรูปทรงเรขาคณิตทั้งหมดที่มีชื่อว่าเป็น "วิธี" ไม่เป็น "รูปทรงเรขาคณิต" หรือสิ่งอื่นใด
30184

คำตอบ:


14

คุณมีสามปัญหากับคำสั่งของคุณแม้ว่าข้อความแสดงข้อผิดพลาดจะบอกใบ้เพียงบางส่วนของมัน ... "WHERE ต้องเป็นบูลีนประเภท" ซึ่งหมายความว่าข้อมูลที่คุณให้ไว้ในตำแหน่งที่ไม่ได้ประเมินผลบูลีน

  1. ST_MakeEnvelopexmin, ymin, xmax, ymax, sridถามสำหรับพารามิเตอร์ในลำดับนี้:

    ymax, ymin, xmax, xmin, sridคุณไม่ถูกต้องผ่าน

  2. ที่ซึ่งต้องประเมินเป็นบูลีน:

    ในการพิจารณาว่ารูปทรงเรขาคณิตและซองจดหมายมีองค์ประกอบใด ๆ ที่เหมือนกันควรจะสร้าง WHERE แบบนี้WHERE geom && envelope_geomหรือไม่คุณสามารถใช้ST_Contains

    ในการตรวจสอบว่ามีเรขาคณิตอยู่ภายในซองจดหมายหรือไม่: `WHERE ST_Contains (envelope_geom, geom)

    คุณไม่ได้จัดหาวิธีการใด ๆ WHEREของการเปรียบเทียบสำหรับ

  3. ตาราง 'planet_osm_ways' ไม่มีคอลัมน์รูปทรงเรขาคณิตใด ๆ แม้ว่า 'planet_osm_roads' จะมีคอลัมน์รูปทรงเรขาคณิตที่ชื่อว่า 'วิธี'

    คุณสามารถสร้างคอลัมน์รูปทรงเรขาคณิตในตาราง 'planet_osm_ways' จาก planet_osm_nodes.lat และ planet_osm_nodes.lon ที่เกี่ยวข้อง

เมื่อใช้ 'planet_osm_roads' จะแสดงวิธีใช้กล่องขอบกับตารางที่มีคอลัมน์รูปทรงเรขาคณิต:

SELECT *
FROM planet_osm_roads
WHERE planet_osm_roads.way && ST_Transform(
  ST_MakeEnvelope(-122.271189, 37.804339, -122.275244, 37.808264, 
  4326),3857
);

หรือเปลี่ยนเป็น:

SELECT *
FROM planet_osm_roads
WHERE ST_Contains(
    ST_Transform(
        ST_MakeEnvelope(-122.271189, 37.804339, -122.275244, 37.808264, 
        4326)
        ,3857)
    ,planet_osm_roads.way);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.