การพิจารณาว่ารูปหลายเหลี่ยมสองรูปซ้อนกันใน Google แผนที่หรือไม่


12

ฉันทำงานกับแผนที่ Google และรูปหลายเหลี่ยม แต่ฉันต้องตรวจสอบว่ารูปหลายเหลี่ยมไม่ทับซ้อนกัน

ฉันมีฟังก์ชั่นที่คืนค่า TRUE เมื่อจุด (lat, lng) อยู่ในรูปหลายเหลี่ยม แต่ไม่เพียงพอที่จะพิจารณาว่าจุดของรูปหลายเหลี่ยมนั้นอยู่ในรูปหลายเหลี่ยมอีกรูปหรือไม่

ข้อเสนอแนะใด ๆ


1
ผมใช้เวลาประมาณ 10 วินาทีเพื่อหาgithub.com/tparkin/Google-Maps-Point-in-Polygon คุณลองทำอะไรบ้าง?
John Powell

4
เขาเขียนว่า "ฉันมีฟังก์ชั่นที่คืนค่า TRUE เมื่อจุด (lat, lng) อยู่ในรูปหลายเหลี่ยม" ฉันคิดว่ามันเป็นการทดลองที่ดี แต่ไม่ตอบถ้ารูปเหลี่ยมทั้งหมดอยู่ในอีกรูปแบบหนึ่ง
user30184

1
ฉันจะเพิ่มห้องสมุด Javascript Topology Suiteให้กับโครงการของคุณและใช้ประโยชน์จากตัวดำเนินการเชิงพื้นที่สำหรับการเปรียบเทียบประเภทนี้ ฉันมีให้คำตอบในคำถามที่คล้ายกันแสดงวิธีการรวมห้องสมุด jsts ในโครงการและดำเนินการละลาย / สหภาพสองรูปทรงเรขาคณิตรูปหลายเหลี่ยม คุณอาจพบว่ามีประโยชน์ หากฉันมีโอกาสฉันจะดูว่าฉันสามารถค้นหาหรือสร้างตัวอย่างที่ทดสอบการแยกสองรูปทรงเรขาคณิต - รูปหลายเหลี่ยมเส้นหรือจุดจะไม่สำคัญพวกเขาอาจตัดกันหรือไม่ :)
elrobis

คำตอบ:


8

ตัวอย่าง JSFiddle

ฉันได้สร้างJSFiddle เพื่อแสดงวิธีแก้ปัญหาของคุณโดยใช้ไลบรารีJavaScript Topology Suite (JSTS) (JSTS)

ชี้แจง

วิธีนี้มีสองขั้นตอน ขั้นตอนแรกแปลงรูปทรงเรขาคณิตของ Google ของคุณให้เป็นนิพจน์ทางเรขาคณิตWellKnownText (WKT)ซึ่งเป็นรูปแบบที่ได้รับการสนับสนุนอย่างกว้างขวาง ขั้นตอนที่สองใช้ JSTS เพื่อทำการgeometry.intersects()เปรียบเทียบJSTS ของรูปทรง WKT สองรูปแบบ

หากต้องการทำความเข้าใจกับสิ่งนี้คุณจะต้องมีความเข้าใจพื้นฐานของ WKT เนื่องจากรูปหลายเหลี่ยมรูปเรขาคณิตใน Google แผนที่ของคุณไม่รองรับรูปแบบที่กว้างขวางฉันจึงแปลงเป็นรูปแบบ WKT ทันทีเพื่อที่เราจะได้ทำงานกับพวกมันใน JSTS

การทำเช่นนี้ได้อย่างง่ายดายผมใช้ห้องสมุดประตู แน่นอนคุณสามารถม้วนวิธี Google-Polygon-to-WKT ของคุณเองหรือคุณยินดีที่จะใช้วิธีการที่ฉันเขียนครั้งละครั้งหรือคุณสามารถใช้โซลูชันอื่นที่คุณอาจพบ โดยส่วนตัวแล้ววันนี้ฉันแค่ใช้ Wicket ซึ่งตามที่คุณเห็นมันเป็นเรื่องง่าย - ชั่วร้าย:

// Pass in two Google Polygon objects.
// It returns two WellKnownText (WKT) geometry expressions.
// 
function UseWicketToGoFromGooglePolysToWKT( poly1, poly2 )
{
    var wicket = new Wkt.Wkt();

    wicket.fromObject(poly1);
    var wkt1 = wicket.write();

    wicket.fromObject(poly2);
    var wkt2 = wicket.write();

    return [wkt1, wkt2];
}

ถัดไปคือเนื้อและมันฝรั่ง - ใช้ JSTS เพื่อใช้รูปทรง WKT สองรูปแบบและทดสอบว่าพวกมันตัดกันหรือไม่ อีกครั้งที่พึ่งพาไลบรารีมีไม่มาก:

// Pass in two WKT geometry expressions.
// It performs a JSTS intersects() comparison.
// 
function UseJstsToTestForIntersection( wkt1, wkt2 )
{
    // Instantiate JSTS WKTReader and get two JSTS geometry objects
    var wktReader = new jsts.io.WKTReader();
    var geom1 = wktReader.read(wkt1);
    var geom2 = wktReader.read(wkt2);

    if (geom2.intersects(geom1)) {
      alert('intersection confirmed!');
    } else {
      alert('..no intersection.');
    }
}

ฉันจะเชื่อมโยงห้องสมุดต่าง ๆ ใน Fiddle ได้อย่างไร

ซอเชื่อมโยงด้านบนและโซลูชันที่ฉันแสดงให้เห็นต้องเพิ่มห้องสมุดบุคคลที่สามสองแห่งในโครงการของคุณ - JSTS และประตู การรับรหัสจาก Github ที่เกี่ยวข้องและรวมเข้ากับโครงการของคุณเป็นแบบฝึกหัดที่แตกต่างกัน แต่สำหรับไวโอลินที่ฉันเชื่อมโยงกับห้องสมุดเหล่านั้นโดยการอ้างอิงถึงพวกเขาในการเป็นตัวอย่างที่มีอยู่ JSTSผมพบว่าโพสต์โดยคริสแมนนิ่งเช่นเดียวกับหน้าสาธิตเองประตูของ โดยทั่วไปฉันเปิดหน้าเลือก "View Source" และดึงการอ้างอิงที่เกี่ยวข้องไปยังไลบรารีทั้งสอง นี่เป็นจุดสิ้นสุดของห้องสมุดที่แน่นอนที่ฉันใช้:

http://arthur-e.github.io/Wicket/wicket.js
http://arthur-e.github.io/Wicket/wicket-gmap3.js
http://bl.ocks.org/christophermanning/raw/4450188/javascript.util.min.js
http://bl.ocks.org/christophermanning/raw/4450188/jsts.min.js

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