ST_PointOnSurface คำนวณอย่างไร


21

เอกสารประกอบของ PostGIS ระบุว่าST_PointOnSurface"POINT รับประกันว่าจะอยู่บนพื้นผิว" ดูเหมือนว่าฟังก์ชั่นนี้สามารถนำไปใช้งานได้เล็กน้อยเพื่อให้ได้ผลลัพธ์ที่ตรงตามเอกสาร แต่มียูทิลิตี้ในโลกแห่งความเป็นจริงเล็กน้อย แต่ฉันมั่นใจว่า PostGIS ให้การใช้งานที่ไม่น่ารำคาญ

การแนะนำ PostGISนี้ให้การเปรียบเทียบที่ดีและตรงกันข้ามST_CentroidกับST_PointOnSurfaceและกล่าวว่า "[ST_PointOnSurface] มีราคาแพงกว่าการคำนวณเซนทรอยอย่างมาก"

มีคำอธิบายที่ละเอียดยิ่งขึ้นเกี่ยวกับวิธีST_PointOnSurfaceคำนวณอย่างไร ฉันใช้ST_Centroidแต่พบกรณีขอบบางอย่างในข้อมูลของฉันที่เซนทรอยด์อยู่นอกเรขาคณิต ฉันเชื่อว่าST_PointOnSurfaceเป็นสิ่งที่ถูกต้อง แต่ชื่อฟังก์ชั่นและเอกสารออกจากห้องเพื่อความไม่แน่นอน

นอกจากนี้ค่าใช้จ่ายในการคำนวณที่ST_PointOnSurfaceเกิดขึ้นแม้ว่าเซนทรอยด์จะอยู่ในรูปทรงเรขาคณิตแล้วหรือไม่?


มันมีอยู่อย่างแม่นยำเนื่องจากเซนทรอยด์ของรูปหลายเหลี่ยมแบบนูนไม่รวมอยู่ในนั้นเสมอไป มันไม่มีส่วนเกี่ยวข้องกับความสูงและ DEM ถ้ามันเป็นส่วนที่สับสนของชื่อ ตรวจสอบรายละเอียดการใช้งานได้ดีที่สุดในรหัส แต่ฉันเชื่อว่าคุณจะได้รับคำตอบที่ดีกว่าใน GIS.se
lynxlynxlynx

ข้อดีของ GIS.se มีวิธีโยกย้ายคำถามนี้หรือไม่ ฉันเข้าใจว่าทำไมทั้งสองฟังก์ชั่นจึงมีอยู่ ฉันพบชื่อที่สับสนเพราะมีหลายจุดบนพื้นผิวของรูปหลายเหลี่ยม goemetries ที่ฉันทำงานด้วย อย่างไรก็ตามมีเพียงส่วนย่อยของคะแนนเหล่านี้ที่ทำหน้าที่จุดประสงค์ของฉัน ฉันต้องการทราบว่าฉันได้รับจุดที่เหมาะสมสำหรับวิธีที่ฉันต้องการใช้

คำตอบ:


24

จากการทดลองสองสามครั้งฉันคิดว่าใช้ST_PointOnSurface()งานได้ประมาณนี้ถ้ารูปเรขาคณิตเป็นรูปหลายเหลี่ยม:

  1. ตามรอยรัศมีตะวันออก - ตะวันตกซึ่งอยู่กึ่งกลางระหว่างเหนือและใต้ของรูปหลายเหลี่ยม
  2. ค้นหาส่วนที่ยาวที่สุดของรังสีที่ตัดกับรูปหลายเหลี่ยม
  3. ส่งคืนจุดที่อยู่ครึ่งทางตามส่วนดังกล่าว

นั่นอาจไม่สมเหตุสมผลดังนั้นภาพร่างของรูปหลายเหลี่ยมที่มีรังสีแบ่งออกเป็นส่วนเหนือและใต้:

             _
            / \             <-- northern extent
           /   \
          /     \
         /       \
        /         \      __
       /           \    /  \
      /_ _ _ P _ _ _\  / _ _\  P = point-on-surface
     /               \/      \
    /                         \
   /            C              \   C = centroid
  /                             \
 /                              /
/______________________________/  <-- southern extent

ดังนั้นST_PointOnSurface()และST_Centroid()มักจะเป็นจุดที่แตกต่างกันแม้ในรูปหลายเหลี่ยมนูน

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

ฉันจะยอมรับว่าคำอธิบายเพิ่มเติม (และการตั้งชื่อที่ดีขึ้น) จะมีประโยชน์และหวังว่าโปรแกรมเมอร์ GEOS อาจทำให้กระจ่างในเรื่องนี้มากขึ้น


3
ดูที่รหัส libgeosฉันเชื่อว่าคุณพูดถูก พบเส้นแบ่งครึ่งแนวนอนจากนั้นใช้จุดกึ่งกลางของจุดตัดที่กว้างที่สุด
mjobrien
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.