Daha fazla müşteri tarafı özelliğini destekleyen OpenLayers alternatifleri [kapalı]


14

Nokta özellikleri için ideal olarak istemci tarafı oluşturma kullanacak ve eklentisiz olması gereken bir sistem için farklı mimariler düşünüyorum. Bu soruya yanıt olarak geliştirilen bu uygulamayı kullanarak (oldukça yetenekli - dört çekirdekli 2.6 ghz cpu, 4 gb bellek, başka bir yük altında değil, Firefox 8) test etmek için OpenLayers'da farklı sayıda puan ve 500'de belirgin bir şekilde gecikiyor ve 1.000'in üzerinde mücadele etmeye başlıyor. Rastgele oluşturulan özellikler herhangi bir olay işleyiciye sahip gibi görünmüyor ve hepsi aynı sembolojiyi kullanıyor.

Tıklama ve fareyle üzerine gelme işleyicileri ve daha az yetenekli platformlarda 10 adede kadar farklı simgeyle 1000'e kadar özellik göstermeyi umuyorum.

Özellikle bu GIS Cloud örneğini gördükten sonra daha iyi müşteri tarafı performansı bekliyordum - Farklı çalıştığını biliyorum (HTML5 tuval ve SVG) ama performans farkı gerçekten çarpıcı.

Anahtar sorularım (eğer çok nazik olursanız):

  1. Rastgele nokta üreten uygulama, yazdığınız / kullandığınız diğer OpenLayers uygulamalarındaki performansı temsil ediyor mu?
  2. WMS hizmetlerini destekleyen (kullanmam gereken) kanıtlanmış ve ücretsiz bir alternatif web eşleme API'si var mı ve Flash / Silverlight / diğer eklentileri kullanmadan istemci tarafı özelliklerle daha hızlı mı?
  3. Neyi araştırmam gerektiğine dair başka önerileriniz var mı?

Öncelikle sunucu tarafı oluşturma işlemine güvenmek bir seçenektir, ancak hem ben hem de istemci, kullanıcı numaralarını arttırma ve kullanıcı arayüzünün yanıt verme konusundaki endişeler nedeniyle bundan kaçınmak isteriz.


Firefox 8'de bu uygulamayı kullanan 5 yaşındaki çift çekirdekli 3 gb RAM masaüstümde (1 gb Linux dağıtım ISO'sunu indirirken) 1.000 puan hemen anında çekiliyor, mücadele yok ... 10.000 yaklaşık 1.5 saniye sürüyor.
user2856

@LukePinner, hızlı bir şekilde çizim * yapmak ve düzgünce kaydırma / yakınlaştırma yapmak mı? Verileri almak ve özellikleri çizmek benim için de iyi, ancak sorun harita etkileşimi.
tomfumb

Sadece ipad2 benim app denedim ve çok iyi 1000 puan ele. 10K puanla, başlangıçta işlemek birkaç saniye alır, ancak daha sonra oldukça iyi baş eder. İsterseniz, OL Vector katman sınıfını her zaman alt sınıflandırabilir ve özel bir sınıf uygulayabilirsiniz. Sizi bir örneğe yönlendirebilirim.
unicoletti

Evet, kaydırma / yakınlaştırma sorunları yok. 1K puan 1.6ghz Atom netbook'umda biraz yavaşlıyor :)
user2856

Yanıtlar:


23

İlk sorunun cevabı Evet . OL'u oldukça yaygın bir yapılandırma ile kullanıyorsunuz. Performansı artırmak için kullanabileceğiniz hileler var, daha sonra buna ulaşacağım.

Soru 2'nin cevabı belki (özellikle haslık açısından). Bu siteyi alternatiflerin bir listesini arayabilirsiniz (şu anda akla gelen bir broşür Leaflet'dir ).

3. soruya cevap: Ölçme ile başlayın:

Uygulamanın yerel bir kopyasını düzenledim, böylece oluşturucu Vector katmanı için seçenek listesinde açıkça belirtilecek. Testler sırasında Canvas oluşturucusunu atladım ve ardından sayfayı deneyi farklı bir tane ile yeniden yükleyeceğim:

var pts = new OpenLayers.Layer.Vector("Points", {renderers: ["Canvas", "SVG", "VML"]});

Yeniden çizim işlevine bir zamanlayıcı ekledim, böylece çizimde ne kadar zaman harcadığını yazdı :

function redraw() {
var start = (new Date).getTime();
[...]
var diff = (new Date).getTime() - start;
console.log("redraw completed in "+diff+"ms");

Bundan sonra, OSX SL çizim 1000 ve 5000 özelliklerinde hem Chrome 17 hem de Firefox 8.0.1'de birkaç çalışmayı denedim. Şaşırtıcı bir şekilde, SVG oluşturucu Kanvas oluşturucudan ortalama% 20 daha hızlı! (Not: Windows js zamanında OSX'deki kadar kesin değildir, bu nedenle sonuçlar daha az tutarlı olabilir).

Bu ve sen söylüyorsun

sorun harita etkileşimi

, IMHO, sıcak noktanın Vector özelliklerinin işlenmesinde olduğunu söylüyor. Benim bir uygulama üzerinde çalışırken, son zamanlarda bir göz attım ve alt sınıf ve sonra basit noktalar için hiçbir faydası olmayan tüm karmaşık kod kurtulmak karar verdi. Kuşkusuz oldukça çıldırdım ve OpenLayers.Geometry.Point'e olan bağımlılığı bile kaldırdım ve sürümüm şimdi x, y özniteliklerine sahip basit js nesneleri üzerinde çalışıyor.

Seçenekleriniz, fayda / maliyet sırasıyla:

İlk seçenek, vektör katmanına aşağıdaki gibi bir strateji seçeneği yapılandırarak sunucu tarafındaki görünür noktaları filtrelemektir :

 strategies: [new OpenLayers.Strategy.Refresh({force:true}), new OpenLayers.Strategy.BBOX({ratio:2, resFactor: 3})],

Bu şekilde, istemci tarafına çizilen özelliklerin sayısını yakınlaştırdığınızda, hepsi yerine bu kapsamda görünür olanlarla sınırlı kalacaktır.

İkinci seçenek olarak , özelleştirilmiş bir Vector / Renderer yazmayı düşünebilirsiniz . Github sayfamda özel, soyulmuş, daha hızlı bir uygulama örneği var . Tüm kullanımlar için uygun olmasa da, önerdiğim şey hakkında kaba bir fikir vermek yeterli olmalıdır.

Kullanıcı tamamen uzaklaştırıldığında üçüncü seçenek , yakın noktaların tek bir noktada birleştirilmesi için bir tür sunucu tarafı özellik kümelemesini uygulamaktır, böylece tekrar çizilen özelliklerin sayısını azaltır.


Ayrıntılı ve kapsamlı yanıt için çok teşekkürler. Muhtemelen sunucu tarafı kümelemeye bakacağım, umarım önbellek stratejisiyle birlikte çalışacak, böylece işlem sadece gerektiğinde gerçekleşecek. Sunucu tarafı seçeneklerinden biri MapGuide'dir, bu nedenle noktaları alma ve kümeleme yaklaşımı tamamen özel olabilir. Ayrıca, ne fark yarattığını görmek için oluşturucu seçenekleriyle de bir oyun oynayacağım.
tomfumb

1
Bir projemde kullandığım örnek bir vektör / tuval ressamına bir bağlantı ekledim.
unicoletti

Vay be aşağı örnek büyük bir fark yaratıyor, bu gerçekten etkileyici. 1.000 özellikle uğraşmaktan 10.000 ile uçmaya gittim
tomfumb

İlk örneği (swingley.appspot.com) OL Canvas oluşturucuyu ve noktalar için sağlam bir dolgu kullanacak şekilde değiştirdim ve zoom ve pan performansı aslında TagCanvas & TagVector'ınıza çok benziyor. Ayrıca, karşılaştırmalı performansı test edebilmek için değişikliklerinizde kaldırdığınız hit test işlevini yeniden uyguladım - Tag * yaklaşımı, hangi özelliğin vurulduğunu belirleme konusunda yaklaşık% 20 daha hızlıydı (5000'den). Özel sınıfları yazma / güncelleme ve benzer performans (testlerimde) konusunda önemli çabalar göz önüne alındığında, vanilya
OL'un

Çünkü hit test tüm özellikleri başka bir tuvale yeniden çizer, böylece her yenileme ile iki kez çizilir .
Ocak'ta unicoletti

0

UTFGrid ve TileMill'i kullanarak oldukça iyi bir performansla sınırsız puan görüntüleyebilirsiniz. N rastgele noktanın görüntülenmesi, bu durumda veya GISCloud veya benzer bir sihirle işe yaramayacak türden bir örnek. bir sürü fayans.

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.