Google Haritalar'da iki çokgenin çakışıp çakışmadığını belirleme?


12

Ben google haritalar ve çokgenler ile çalışıyorum, ama çokgenler birbiriyle örtüşmediğini doğrulamak zorunda.

Bir nokta (lat, lng) bir çokgenin içindeyse TRUE döndüren bir işlevim var, ancak çokgenin her noktasının başka bir çokgenin içinde olup olmadığını belirlemek için yeterli değil.

Herhangi bir öneri?


1
Github.com/tparkin/Google-Maps-Point-in-Polygon bulmak için yaklaşık 10 saniye sürdü . Bir şey denedin mi?
John Powell

4
"Çokgen içinde bir nokta (lat, lng) olduğunda TRUE döndüren bir fonksiyonum var" yazdı. Bence bu iyi bir deneme ama tüm poligonun bir başkasının içindeyse cevap vermiyor.
user30184

1
Projenize Javascript Topology Suite kütüphanesini ekler ve bu tür karşılaştırma için uzamsal operatörlerinden yararlanırım. Benzer bir soruya jsts kütüphanesinin bir projeye nasıl dahil edileceğini ve iki çokgen geometrisinde bir çözünme / birleşme gerçekleştirileceğini gösteren bir cevap verdim . Bunu yararlı bulabilirsiniz. Eğer bir şansım varsa, iki geometrinin kesişme testlerini - poligon, çizgi veya nokta farketmeyecek bir örnek bulup bulamayacağımı görüp göremeyeceğim, ya kesişiyorlar ya da kesmiyorlar. :)
elrobis

LatLngBounds sınıfının kesişim yöntemine bir göz atın
Gruff Bunny

Yanıtlar:


8

JSFiddle Örneği

JavaScript Topology Suite (JSTS) (JSTS) kitaplığını kullanarak sorununuza bir çözüm gösteren bir JSFiddle oluşturdum .

Açıklama

Bu yaklaşımın iki adımı vardır. İlk adım, Google geometrilerinizi , yaygın olarak desteklenen bir biçim olan WellKnownText (WKT) geometri ifadelerine dönüştürür. İkinci adım geometry.intersects(), iki WKT geometrisinin bir JSTS karşılaştırmasını gerçekleştirmek için JSTS kullanır .

Bunu gerçekten anlamak için WKT hakkında temel bir anlayışa sahip olmanız gerekir. Google Haritanızdaki çokgen geometrileri geniş çapta desteklenmediğinden, JSTS'de onlarla çalışabilmemiz için hemen WKT geometrilerine dönüştürüyorum.

Bunu kolayca yapmak için Wicket kütüphanesini kullandım . Tabii ki her zaman kendi Google-Polygon-WKT yönteminizi evde yuvarlayabilir veya bir kerede yazdığım bir yöntemi kullanabilir veya bulabileceğiniz başka bir çözüm kullanabilirsiniz. Şahsen, bu günlerde gördüğünüz gibi kötü basit olan Wicket kullanıyorum:

// 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];
}

Sıradaki et ve patates - iki WKT geometrisi almak ve kesişip kesişmediklerini test etmek için JSTS kullanmak. Bir kez daha, kütüphaneye dayanarak, çok fazla şey yok:

// 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'daki kütüphaneleri nasıl bağladım

Yukarıda bağlantılı olan keman ve gösterdiğim çözüm, projenize iki adet 3. parti kitaplık eklemenizi gerektirir - JSTS ve Wicket. Kodu ilgili Github'larından almak ve projenize dahil etmek farklı bir alıştırmadır. Ama keman için ben onları başvurarak bu kütüphanelere bağlantılı varolan JSTS örnek ben tarafından gönderildi bulundu Christopher Manning yanı sıra Wicket kendi tanıtım sayfasında . Temelde sayfaları açtım, "Kaynağı Görüntüle" yi seçtim ve iki kütüphaneye ilgili referansları kopardım. Bunlar kullandığım kesin kütüphane uç noktalarıydı:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.