2016-03-30 30 views
4

Geniş bir coğrafi veri kümesine sahibim (yaklaşık 22 000 puan, ancak gelecekte daha fazla olabilirim) ve Voronoï diyagramlarını hesaplamalıyım. İlk önce puanları (lat,lng)'dan (x,y)'a (Leaflet'ten latLngToLayerPoint() kullanarak) projelendirin ve ardından Javascript implementation of Fortune's algorithm'a dayanarak diyagramı hesaplayın. Ben sırasıyla edilerek, her bir diyagramların hücrelerini ya da daha doğrusu va ve vb kurtarmak:Voronoï diyagramını çok yakın noktaların büyük bir veri kümesi üzerinde hesaplayın

"(solda Voronoi sitesine göre) başlangıç ​​ noktasını tanımlayan bir x ve bir y özelliğine sahip bir Voronoi.Vertex nesnesi Bu Voronoi.Edge nesnesinin. "

ve

"bir x ve bu Voronoi.Edge nesnesi (solda Voronoi sitesine göre) uç noktasının tanımlanması y özelliği olan bir Voronoi.Vertex nesnesi."

(bakınız Belgeleri)

Son olarak, broşür kullanarak diyagramı görüntülemek için bu puan geri çıkıntı. Diyagramı hesaplamak için her noktanın benzersiz olması gerektiğini biliyorum, bu yüzden diyagramı hesaplamadan önce kopyalardan kurtulurum.

enter image description here

yakın çekim

enter image description here

ben şemada delikleri var: Ama şey (non-düğümlüye kavşaklar, kompleks çokgenler) oldukça kötü bir sonuçla sona olduğunu ve neden emin değilim. Puanlar ev adresidir, yani bazıları eşit olmasalar bile, gerçekten (gerçekten) yakınlardır. Ve sorun projeksiyondan gelmiyor mu merak ediyorum ((lat1,lng1) ve (lat2,lng2) hemen hemen eşittir, (x1,y1) ve (x2,y2) eşittir?). Ben kuvvetle konu nereden geldiğini yani şüpheli ama geçici çözüm için nasıl bilmiyorum

Düzenleme (bir eşik kurmak?): Bu konuda değil yani, projeksiyon sonra çiftleri silmek ben kesin izdüşümün kesinliği, ancak iki nokta birbirinden ayrıysa ne olur?

+0

Lat/long değerlerini mi yoksa x/y değerlerini mi siliyorsunuz? "Yaklaşmaya yeterli" ye dayalı ayrıştırmaya gelince, sizin için çalışan bir değer bulmanız gerekir. Adreslerle çalıştığını söylemiştin, bu yüzden bence, eğer iki puan birbirinin 10 fitindeyse, ben onları tekrarlarım. –

+0

"Yeterince yakın" olan – kwn

cevap

0

Sorunumu çözdüğümde, bir harita üzerinde bir Voronoï diyagramını Broşür ve çim kullanarak hesaplamak zorunda kaldığında gönderiyorum ve Fortune algoritmasını (turf-voronoi çalışıncaya kadar) uygulamakta zorlanıyor. Other sources of how to compute a Voronoï diagram on map can be found (but using d3)

sorun ama hücreleri kurtarıldı nasıl tarafından, veri kümesinin boyutu veya noktaları yakınındaki yüzünden olmadı (ben d3 de Fortune dergisinin algoritmasının bu Javascript uygulamasını kullanmak düşünüyorum).

Yani diyagramı hesaplamak, (lat,lng) den (latLngToLayerPoint() kullanarak) (x,y) için noktayı proje ilk gerekir: (sitelerinizi benzersiz olması gerektiğini unutmayın) voronoi.compute(sites,bbox), siteler bu [ {x: 200, y: 200}, {x: 50, y: 250}, {x: 400, y: 100} /* , ... */ ] gibi görünen noktalar ve Eğer diyagramı bilgisayarlı kez

var xl = 0, 
    xr = $(document).width(), 
    yt = 0, 
    yb = $(document).height(); 

, sadece hücreleri (eğer doğru çokgenler isterseniz kenarları ihtiyaç carfull olmak kurtarmak: Eğer BBOX juste kullanımı olmak üzere geçerli zum için ekranın çerçevesini istiyorsanız saat yönünün tersine sırayla (ya da saat yönünde sipariş edilen, ancak o rdered), minnetle algoritma verilen bir Voronoï.Vertex saatin tersi yönde yarım kenarlarını sağlar. Nihayet

diagram.cells.forEach(function (c) { 
    var edges=[]; 

    var size = c.halfedges.length; 
    for (var i = 0; i < size; i++) { 

     var pt = c.halfedges[i].getEndpoint(); 
     edges.push(map.layerPointToLatLng(L.point(pt.x,pt.y))); 

    }; 

    voronoi_cells.push(L.polygon(edges)); 
}); 

(layerPointToLatLng() kullanarak) (x,y) den (lat,lng) onları geri yansıtmak unutmadan getStartpoint() veya getEndpoint() kullanabilirsiniz her bir hücrenin köşe kurtarmak için, diyagramı görüntülemek için bir FeatureCollection kullanmak zorunda:

enter image description here

0

Kendinize bir Voronoi tesselation algoritması uygulamıyorsunuz ve bunun yerine https://github.com/Turfjs/turf-voronoi kullanın.

+0

'u önlemek için x/y değerlerini kaybediyorum. Öncelikle planladığım şey buydu ama kullanım için hazır olmadığı anlaşılıyor (ve yapı başarısız oluyor) – kwn

İlgili konular