คำสั่งของจุดยอดรูปหลายเหลี่ยมโดยทั่วไป GIS: ตามเข็มนาฬิกาหรือทวนเข็มนาฬิกา


23

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

แต่ตอนนี้คำถามของฉันกว้างขึ้นและฉันไม่รู้ว่ามันมีคำตอบเฉพาะหรือไม่ การสั่งซื้อตามเข็มนาฬิกาเป็นเพียงสำหรับรูปร่าง ESRI หรือรูปแบบ GIS ทั่วไปหรือไม่ และสิ่งที่เกี่ยวกับการเป็นตัวแทนภายในสำหรับซอฟต์แวร์ GIS? ตัวอย่างเช่นถ้าฉันใช้ QGIS และฉันอ่าน * .shp ที่มีรูปหลายเหลี่ยมฉันคิดว่าการแทนค่าภายในของขอบเขตด้านนอกเป็นตามเข็มนาฬิกาเหมือนกับในไฟล์ดั้งเดิมดั้งเดิม แต่สิ่งที่เกี่ยวข้องกับรูปแบบไฟล์ทั้งหมดที่สนับสนุนโดย QGIS? และสำหรับ ArcGIS? และในกรณีที่มีรูปแบบไฟล์ที่มีรูปหลายเหลี่ยมเก็บไว้ในทวนเข็มนาฬิกาถ้าไฟล์เหล่านี้ถูกโหลดใน QGIS, ArcGIS ฯลฯ จะมีการวางแนวการเปลี่ยนแปลงภายในดังนั้นถ้าฉันอ่านข้อมูลโดยใช้ PyQGIS ตัวอย่างเช่นรูปหลายเหลี่ยมเป็นตามเข็มนาฬิกา สั่งซื้อ?

จุดประสงค์ของฉันคือการเขียนปลั๊กอินสำหรับ QGIS แต่แหล่งข้อมูลอาจเป็นไฟล์รูปร่าง ESRI หรือรูปแบบอื่น ๆ ในขณะที่ฉันต้องการตรวจสอบมุมระหว่างด้านรูปหลายเหลี่ยมที่ต่อเนื่องกันโดยใช้ azimuths ของพวกเขาฉันจำเป็นต้องรู้ถ้าคำสั่งนั้นเป็นตามเข็มนาฬิกา ทางออกหนึ่งคือการคำนวณพื้นที่ของรูปหลายเหลี่ยมแต่ละรูปและถ้าฉันจำได้อย่างถูกต้องถ้ามันเป็นบวกคำสั่งนั้นคือทวนเข็มนาฬิกาและถ้าลบคำสั่งนั้นคือทวนเข็มนาฬิกา

การคำนวณพื้นที่ไม่ใช่งานที่เข้มข้นดังนั้นมันจะไม่ทำให้ปลั๊กอินช้าลงมากนัก แต่ในกรณีพิเศษของ QGIS ไม่มีใครรู้ว่ามันเก็บรูปหลายเหลี่ยมตามเข็มนาฬิกาหรือทวนเข็มนาฬิกาโดยไม่คำนึงถึงลำดับในแหล่งต้นฉบับหรือไม่? ตอนนี้ฉันกำลังทำงานกับ ESRI shapefiles และพิกัดใน layer.getFeatures (). geometry (). asPolygon () จะถูกเก็บไว้ตามเข็มนาฬิกาสำหรับขอบด้านนอกและทวนเข็มนาฬิกาสำหรับหลุมเช่นในต้นฉบับ * .shp


ขึ้นอยู่กับวิธีการจัดเก็บข้อมูล Oracle คือ Anti-Clockwise gis.stackexchange.com/questions/20817/…
Mapperz

@Mapperz ลิงก์ของคุณนำไปสู่docs.oracle.com/cd/B10501_01/appdev.920/a96630/…ซึ่งระบุอย่างชัดเจนPolygons are oriented correctly. (Exterior ring boundaries must be oriented counterclockwise, and interior ring boundaries must be oriented clockwise.)ซึ่งหมายความว่า Oracle เป็นทวนเข็มนาฬิกา
user30184

คำตอบ:


27

ในข้อกำหนด OGC ซึ่งสามารถดาวน์โหลดได้ [ที่นี่], ( http://www.opengeospatial.org/standards/sfs ) พวกเขาระบุว่า:

"มาตรฐานนี้ไม่ได้กำหนดการหมุนรูปหลายเหลี่ยมการหมุนรูปหลายเหลี่ยมจริงอาจอยู่ในทิศทางตามเข็มนาฬิกาหรือทวนเข็มนาฬิกา"

ในเอกสารของ Oracleมีการระบุไว้อย่างชัดเจนว่าขอบเขตวงแหวนรอบนอกเป็นแบบทวนเข็มนาฬิกาและขอบวงแหวนภายในตามเข็มนาฬิกา ในทำนองเดียวกันใน SQL Server Spatial ประเภทข้อมูลภูมิศาสตร์เป็นไปตามกฎทวนเข็มนาฬิกาสำหรับวงแหวนด้านนอกและตามเข็มนาฬิกาสำหรับวงแหวนภายใน - ดูไมโครบล็อกนี้สำหรับรายละเอียดเพิ่มเติม PostGIS ดูเหมือนว่าจะอนุญาตให้ทางใดทางหนึ่งสำหรับรูปทรงเรขาคณิตและมีฟังก์ชั่นที่จะบังคับให้รูปทรงเรขาคณิตของรูปหลายเหลี่ยมที่จะปฏิบัติตามอย่างใดอย่างหนึ่งหรือขวากฎมือซ้ายดูST_ForceRHRและForceLHR JTS / Geos ดูเหมือนจะทำตามกฎมือขวาคือการวางแนวตามเข็มนาฬิกาของวงแหวนรอบนอกดังนั้นมันค่อนข้างชัดเจนเลยทีเดียว

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


จากความคิดเห็นโดย @mxfh: OpenGIS Simple Features Access (ISO 19125-1) ของ OGC ระบุทิศทางทวนเข็มนาฬิกาสำหรับวงแหวนรอบนอกตามเอกสาร 1.2.1 เวอร์ชัน [OGC 06-103r4] 6.1.11.1/page 26 จากopengeospatial.org / มาตรฐาน / SFA การเปลี่ยนแปลงได้รับการแนะนำระหว่างเวอร์ชัน 1.1.0 และ 1.2.0 ในปี 2549 ล่าสุด เชิงอรรถที่คุณอ้างถึงยังไม่ได้รับการอัปเดตตั้งแต่ปี 2005


คำตอบที่ดีจอห์น ฉันไม่แน่ใจว่าการใช้การเรียงลำดับของโหนดเพื่อระบุวงแหวนภายในและภายนอกเป็นวิธีเดียวที่รูปแบบข้อมูลเวกเตอร์สามารถทำได้ ฉันจะเห็นด้วยกับคุณแม้ว่าจะต้องมีกลไกบางอย่างในสถานที่ ตัวอย่างเช่นกับ GeoJSON รายการแรกของโหนดจะถูกกำหนดให้เป็นรูปภายนอกและรายการที่ตามมาทั้งหมดจะเป็นรูภายใน ที่ทำงานเป็น (ถ้าไม่มากกว่า) ได้อย่างมีประสิทธิภาพ
WhiteboxDev

ใช่นี่เป็นความจริงของ WKT สำหรับรูปทรงเรขาคณิตด้วย สำหรับพื้นที่ภูมิศาสตร์นั้นมีความสำคัญมากกว่าอย่างชัดเจน
John Powell

เป็นเรื่องจริงมาก;)
WhiteboxDev

@ WhiteboxDev เหตุผลที่คดเคี้ยวคำสั่งของวงซ้อนกันเป็นทางเลือกคือการคำนวณพื้นที่ด้วยวิธี Shoelace คำนวณพื้นที่ที่ลงนามขึ้นอยู่กับทิศทางแหวน โดยทั่วไปวงแหวนซ้อนของคำสั่งแรกถือว่าเป็นรูและมีทิศทางสำรองของวงแหวนรอบนอก มูลค่าพื้นที่ที่สนับสนุนของพวกเขาเป็นค่าลบ เมื่อวงแหวนรอบนอกเป็นค่าบวก ดังนั้นแหวนซ้อนกันของคำสั่งที่เป็นคู่ ดังนั้นพื้นที่โดยรวมของคุณสมบัติวงแหวนทั้งหมดคือผลรวมของพื้นที่ที่ลงชื่อทั้งหมด
mxfh

1
@mxfh: พูดอย่างเคร่งครัด "คำสั่งที่คดเคี้ยวของแหวนที่ซ้อนกัน" เป็นที่สงสัยสำหรับ OCG (และอื่น ๆ อีกมากมาย) รูปหลายเหลี่ยม .... เพราะมันไม่ได้รับอนุญาต วิธีที่จะแสดงรูปหลายเหลี่ยมที่ซ้อนกันภายใน "หลุม" ของอีกรูปแบบหนึ่งคือการใช้ MultiPolygon ... ซึ่งในกรณีนี้รูปหลายเหลี่ยมที่เป็นองค์ประกอบแต่ละตัวจะเป็นไปตามกฎการม้วนเดิม ตกลง, ตกลง: นี่คือtantamountเพื่อสลับการวนของ "LinearRings ที่ซ้อนกัน" ... แต่เพียงแค่ชี้ให้เห็นว่ามันไม่ได้เป็นรูปหลายเหลี่ยม - ต่อ se - ที่อนุญาตสิ่งนี้ แต่นิยามของ MultiPolygon
Dan H

23

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

นี่คือภาพรวมเกี่ยวกับทิศทางวงแหวนรอบนอกของรูปหลายเหลี่ยมในรูปแบบต่างๆตามข้อกำหนด:

ภาพประกอบการเรียงลำดับของ Shapefiles และ Simple Features

  • Simple Feature Access (ISO 19125-1) ยังใช้ในการปรับใช้ WKT / GML / KML และ SQL ที่หลากหลาย:

    • วงแหวนภายนอก: ทวนเข็มนาฬิกา
    • วงแหวนภายใน (รู): ทิศทางตามเข็มนาฬิกา

    รูปหลายเหลี่ยมเป็นพื้นผิวระนาบที่กำหนดโดย 1 ขอบเขตภายนอกและ 0 หรือมากกว่าภายในเขต ขอบเขตภายในแต่ละเส้นจะกำหนดช่องในรูปหลายเหลี่ยม [ ... ]

    LinearRing ขอบด้านนอกกำหนด“ ด้านบน” ของพื้นผิวซึ่งเป็นด้านข้างของพื้นผิวที่ขอบด้านนอกปรากฏขึ้นเพื่อสำรวจขอบเขตในทิศทางตามเข็มนาฬิกา ภายใน LinearRings จะมีการวางแนวทางตรงข้ามและปรากฏเป็นเข็มนาฬิกาเมื่อมองจาก“ด้านบน” ... ง่ายคุณสมบัติรายละเอียดการเข้าถึง

    ในการนำไปใช้งานส่วนใหญ่ลำดับของวงแหวนใน POLYGON เป็นสิ่งสำคัญ (ซึ่งต่างจากรูปร่างของไฟล์)

    สำหรับรูปหลายเหลี่ยมที่มีรูองค์ประกอบย่อยตัวแรกของมันคือวงแหวนด้านนอกส่วนย่อยที่สองคือวงแหวนภายในตัวแรกส่วนย่อยที่สามคือวงแหวนภายในที่สองและอื่น ๆ Oracle Spatial

    การสร้างรังแบบลึกหรือที่รู้จักกันในชื่อเกาะในทะเลสาบที่อยู่บนเกาะ ...ต้องแสดงเป็น MultiPolygons ( ดูรูปที่ 2.10 (4) ) เนื่องจากมีเส้นขอบด้านนอกเพียงด้านเดียวและมีรังที่ลึกกว่าวงแหวนภายใน ไม่ได้กำหนดไว้

  • ESRI Shapefiles / SHP :

    • วงแหวนด้านนอก: ตามเข็มนาฬิกา
    • แหวนภายใน: ทวนเข็มนาฬิกา

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

    ลำดับของวงแหวนในอาร์เรย์คะแนนไม่สำคัญ รายงาน ESRI

    เนื่องจากขอบเขตด้านนอกหลายจุดอนุญาตให้ใช้การกำหนดค่าแบบเกาะในทะเลสาบได้ด้วยคำจำกัดความรูปหลายเหลี่ยมนี้ ทอพอโลยีเกาะในทะเลสาบจะเป็นวงแหวนรอบนอกตามเข็มนาฬิกาอีกอันหนึ่ง อย่างมีประสิทธิภาพทำให้ESRI Shapefile Polygon เป็น Simple Feature MultiPolygon

    หากคุณไม่เรียงลำดับคะแนนอย่างถูกต้องคุณจะมีรูปหลายเหลี่ยมซ้อนทับกันอยู่ pyshp

  • GeoJSON (RFC7946) :

    หมายเหตุ: ข้อมูลจำเพาะ GeoJSON 2008ต้นฉบับไม่มีการบังคับใช้คำสั่งที่ม้วน

    • ลำดับการหมุน: วงแหวนภายนอกคือทวนเข็มนาฬิกา (กฎมือขวา)
    • วงแหวนภายในมีตามเข็มนาฬิกา
    • คำสั่งของแหวนเป็นสิ่งสำคัญ:

      สำหรับรูปหลายเหลี่ยมที่มีวงแหวนหลายวงวงแรกจะต้องเป็นวงแหวนภายนอกและวงอื่น ๆ จะต้องเป็นวงแหวนหรือรูภายใน ข้อมูลจำเพาะ GeoJSON

  • TopoJSON : บังคับให้วงแหวนด้านนอกตามเข็มนาฬิกาตามค่าเริ่มต้น

ภาพประกอบการเรียงลำดับของ Shapefiles และ Simple Features

Excursion:

เหตุผลทางคณิตศาสตร์เกี่ยวกับเหตุผลที่คดเคี้ยวคำสั่งของแหวนซ้อนกันสลับกันคือว่าการคำนวณพื้นที่ที่มีสูตรเชือกผูกรองเท้า ( คำอธิบายภาพ ) คำนวณพื้นที่ลงนามขึ้นอยู่กับทิศทางแหวน

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

ดังที่มีการใช้งานโดย ESRI เพื่อดูรายการฐานความรู้นี้: ArcGIS ใช้อัลกอริทึมใดเพื่อกำหนดพื้นที่ของรูปหลายเหลี่ยม?

ตัวช่วยจำที่เสนอ

ปลายเปิดของรูปแบบตัวอักษรตีความว่าเป็นลูกศร:

  • S hapefile: S →ᔑ→↻
  • Simple F e atur e s: e →ᘓ (ไขออกไปด้านนอก cc-wise) →↺
  • GeoJSON: G (ก้านของ G เป็นลูกศร) →↺

4

ฉันไม่ทราบว่าใครจะสามารถให้คำตอบที่ชัดเจนสำหรับคำถามของคุณเนื่องจากรูปแบบไฟล์เวกเตอร์แต่ละรูปแบบนั้นแตกต่างกันและแต่ละ GIS ในแง่ของวิธีที่พวกเขาจัดการข้อมูลภายในเหล่านี้ก็จะแตกต่างกันเช่นกัน แต่ฉันสามารถบอกคุณได้อย่างแน่นอนว่าการสั่งซื้อตามเข็มนาฬิกาไม่เพียง แต่สำหรับ ESRI Shapefiles มีรูปแบบอื่น ๆ ที่ใช้การเรียงลำดับตามเข็มนาฬิกาคล้ายกับวงแหวนภายนอกและทวนเข็มนาฬิกาสำหรับรูปหลายเหลี่ยมหลุมภายใน ตัวอย่างเช่นโครงสร้างรูปหลายเหลี่ยมเวกเตอร์ JTS ใช้รูปแบบที่คล้ายกัน ในความเป็นจริงมีการระบุไว้ที่นี่ว่าในอดีตนี้จะคล้ายกับวิธี ESRI ฉันสามารถพูดได้อย่างแน่นอนว่าไม่ไม่ใช่ทุกรูปแบบมีข้อกำหนดนี้ ตัวอย่างเช่นข้อกำหนดรูปแบบ GeoJSONทำให้ไม่มีข้อกำหนดดังกล่าวเกี่ยวกับการเรียงลำดับของจุดยอดในรูปแบบรูปหลายเหลี่ยม ข้อกำหนด KMLจริงรัฐ:

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

ดังนั้นจึงมีตัวเลือกมากมายและนำไปใช้งานที่นั่น มันเป็นโลกแห่งป่า!


1
โปรดทราบว่า "กฎมือขวา" ของ KML นั้นเป็นสิ่งที่ถูกเรียกตามแบบแผนว่า "กฎมือซ้าย" (เมื่อคุณเดินรอบนอกโดยยื่นแขนออกไปด้านซ้ายมือซ้ายของคุณจะอยู่ในรูป) Esri มีหลายวิธีเนื่องจาก shapefiles เป็นรูปแบบเดียวที่ใช้กฎมือขวา (ฐานข้อมูลองค์กรทางภูมิศาสตร์ใช้กฎมือซ้ายภายใน แต่ API 'C' จะช่วยให้คุณสามารถร้องขอได้ทั้งสองอย่าง) GML เพียงต้องการให้วงแหวนภายในอยู่ในลำดับที่ตรงกันข้ามกับวงแหวนภายนอกและวงแหวนแรกนั้นอยู่ด้านนอก
วินซ์

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