GeoJSON çok hantal - ne yapmalı?


20

Web kullanıcılarının bir bölge seçmesine izin vermek için leaflet.js kullanıyorum . Geçerli bölgeler ABD eyaletleri, Kanada kuruluşları ve dünya ülkeleridir (ABD ve Kanada hariç). Qgis kullanarak kendime bir şekil dosyası oluşturdum ve bunu geojson olarak sakladım. Geometrileri olabildiğince basitleştirdim.

Ortaya çıkan şekil dosyası 400 kb'dir, ancak geojson bir megabaytın üzerindedir. Bu istediğimden daha büyük. Bu bilgilerin aktarılmasıyla ilgili ağ ek yükünü azaltmam gerekiyor.

Bunu yapmanın doğru yolu nedir? Hayal edebileceğim seçenekler:

  1. Geojson dosyasını gzip ile sıkıştırın, istemciden açın.
  2. İstemcideki şekil dosyasını coğrafi olarak ayrıştırın
  3. Şekil dosyasından kendi karolarımı oluştur ve bunlara hizmet et

Herkes bana hangi seçenek en iyi (ya da yukarıdakilerin hiçbiri) söyleyebilirdi ben takdir ediyorum!


Geometriyi basitleştirmeye çalıştığınızı söylemişsinizdir, ancak bir CBS basitleştirme algoritması kullanmayı ve sonuçları kontrol etmeyi denediniz mi? JSON'un hangi bölümünün en fazla yer kapladığına bakmak da yardımcı olabilir.
BradHards

1
GeoJSON'un güzel basılmadığından emin olun, gereksiz tüm beyaz alanların çıkarılması dosyayı daha küçük hale getirmeye yardımcı olacaktır - mutlaka büyük miktarda değil ama hepsi yardımcı olur!
CHenderson

Yanıtlar:


14

Mapshaper.org , bir geojson dosyasını yüklemenizi, bir harita olarak görüntülemenizi ve ardından bir kaydırıcıyla gücünü ayarlayabileceğiniz üç basitleştirme alogrithiminden birini seçmenizi sağlayan kullanışlı ve ücretsiz bir çevrimiçi araçtır.

İki bölge arasındaki çakışma gibi bütünlük kaybının olduğu her yerde haritayı günceller ve vurguları kırmızı renkte gösterir. Bu tür sorunları genellikle (ancak her zaman değil) düzelten bir 'düzelt' düğmesi vardır.

Kabul edilebilir bir basitleştirme düzeyi bulabilir ve yeni basitleştirilmiş geojson dosyasını dışa aktarabilirsiniz.

Açıkçası bu, ihtiyacınız olan ayrıntı düzeyine bağlıdır, ancak sonuçlar etkileyici olabilir. Örneğin, 40mb geojson dosyasından İskoçya'nın haritası:

resim açıklamasını buraya girin

% 99 uygulama, çakışma ve bu yakınlaştırma düzeyinde görünmeyen ayrıntı kaybı olmadan 441 kb'lik bir dosyaya indirir:

resim açıklamasını buraya girin

% 99,95'lik bir uygulama (29kb'ye kadar) ne tür bir yol sadeleştirmenin uygulandığını gösterir (ve yine de çakışmalardan kaçınmayı başarır ve ulusal düzey kloroplet gibi kullanımlar için mükemmel şekilde uygundur):

resim açıklamasını buraya girin


Bu aracı her zaman kullanıyorum. Bu mükemmel!
Mike Furlender

1
Sen bir hayat kurtarıcısın!!
Khizar

13

Daha zahmetli yollara gitmeden önce, en basit seçenek geometriyi azaltmaktır. Kaynak veri kümeleriniz neler? Onları nasıl basitleştirdiniz? Bu, geojson dosya boyutunu ne kadar azalttı?

Yukarıdakileri yapabildiğinizden eminseniz, seçeneklerinizin en düşük asılı meyvesi

  1. Geojson dosyasını gzip ile sıkıştırın, istemciden açın.

Tüm modern tarayıcılar gzip ile sıkıştırılmış verilerin paketini otomatik olarak açar, bu nedenle web sunucunuzu göndermeden önce verileri paketleyecek şekilde kurmanız yeterlidir. Bu normalde nispeten düz bir ileri, Apache , IIS veya Nginx için çok fazla malzeme var

Benim tavsiyem önce bunu denemek, test etmek, sonra gecikme / yanıt / veri boyutu kabul edilebilir değilse, diğer seçeneklere geçmek olacaktır. Ben de zamanından önce optimize etmeye çalışırken dikkatli olurum, veri boyutunu neden azaltmanız gerektiğini belirlemeye çalışıyordum ve bunu yapmak için zor nedenleriniz (ve sayılarınız) olduğunda, değişiklikleri tekrarlamak ve test etmek için tekrar tekrar uygulamak elde ettiğiniz kazançlar.


6

Bu cevapta bulunan ve GeoJSON'u topojson ile sıkıştırmaktan bahseden sıkıştırmadan yararlanıp yararlanamayacağınızı merak ediyorum .

Leaflet hala GeoJSON - denemek için bir şey okumak mümkün olacak bilmiyorum =)

Topojson hakkında daha fazla bilgi: https://github.com/mbostock/topojson/


Leaflet.GeoJSON ark verilerini ayrıştırmaz, bu nedenle bu yaklaşım işe yaramaz
smcphill

Leaflet yerel olarak yapamaz, ancak bunu yapmak için istemci tarafında topojson kullanabilirsiniz, broşürde topojson örneği , ancak bu örnek onu oluşturmak için d3 kullanır.
Calvin

1
27mb geoJson dosyam vardı. Mapshaper.org'a gittim ve basitleştirdikten (% 1.0) ve topojson ihracatından sonra 122kb oldu. Bundan sonra github.com/shramov/leaflet-plugins/blob/master/layer/vector/… 'dan topoJson Leaflet kodunu uygulamama ekledim ve şunları yaptım: new L.TOPOJSON ("myExported.topojson"). ToGeoJson ().
StackUnder

3

Geometrinizi basitleştirme konusunda yukarıdaki @Kelso ile hemfikirim.

Verilerinizi gzip ile kolayca deflate etmek için sunucunuza erişiminiz yoksa , geoJSON'unuzu ikili verilere serileştirmek için MessagePack kütüphanesine bakabilirsiniz ( MongoDB gibi şeyler tarafından kullanılan BSON spesifikasyonunun bir uygulaması olduğuna inanıyorum . veri depolamak, ama yanlış olabilir) . Python ve javascript'te (diğerlerinin yanı sıra) verileri serileştirmek / serisini kaldırmak için kullanabileceğiniz kütüphaneler vardır .


2
MessagePack, BSON ile ilgili değildir (pek çok durumda stackoverflow.com/questions/6355497/… 'e göre daha iyidir . Messagepack ve özellikle geojson hakkında daha ilginç bilgiler nelsonslog.wordpress.com/2012/06/22/checking adresinde bulunabilir. -kasa-msgpack .
Kelso

Bunun için teşekkürler @Kelso - cevabı güncelledi. Ve iyi bir makale!
om_henners

1

Sadece kendi Leaflet Polygon nesnelerini oluşturmanızı öneririm. GeoJSON'un çok büyük olmasına katılıyorum. Nesne anahtarı adları çok açıklayıcıdır, ancak gereksiz yere de uzun olabilir. Bu tür şeyler yaparım:

objects = [];
objects.push( new L.polygon([[1,1],[1,2],[3,4]],options );
objects.push( new L.polygon([[4,7],[8,27],[35,66]],options );
objects.push( new L.polygon([[3,5],[56,24],[13,49]],options );
objects.push( new L.polygon([[13,7],[7,68],[23,9]],options );
layerGroup = L.layerGroup(objects).addTo(map);

Çok basit. GeoJSON'dan çok daha hafif:

{ "type": "FeatureCollection",
  "features": [
    { "type": "Feature",
      "geometry": {"type": "Polygon",
      "coordinates": [1,1],[1,2],[3,4]},
      },

    //etc...

Ve her çokgen için tekrarlayın ... ugh ... çok şişmiş imo. JS'nize çok sayıda bayt ekler. Dediğim gibi, anahtar isimleri güzel ve açıklayıcı ... ama uzun ve JS'nize çok fazla gereksiz byes ekliyorlar.

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.