Wie verwendet man Leaflet, um Teile eines massiven Datensatzes effizient anzuzeigen?


13

Ich sehe immer wieder Nicht-GIS-Webentwickler, die auf dieses Problem stoßen, und ich bin mir nicht sicher, welche Lösung das ist.

  1. Es gibt einen Datensatz mit Tausenden von Elementen.
  2. Wir möchten dem Benutzer eine Karte anzeigen, von der die sichtbare Teilmenge als interaktive, anklickbare Elemente angezeigt wird.

Welche Methoden gibt es dafür?

Ich kann mir diese vorstellen, aber sie sind nicht sehr zufriedenstellend, also frage ich mich, was es sonst noch gibt:

  1. Speichern Sie alle Daten in einer GeoJSON-Datei, übertragen Sie sie an den Browser und lassen Sie die Broschüre anzeigen. Problem: Funktioniert nicht wirklich mit großen Datenmengen. TopoJSON erhöht das Limit ein wenig. Es verursacht auch eine große Verzögerung beim Laden der Seite.

  2. Verwenden Sie Mapbox, speichern Sie alle Daten in einer interaktiven Ebene in Mapbox und verwenden Sie Mapbox.js, um sie anzuzeigen. Funktioniert hervorragend, kostet aber Geld und kann nicht selbst gehostet werden.

  3. Verwenden Sie GeoServer, um auf eine PostGIS-Datenbank zuzugreifen, und verwenden Sie das WFS-Geojson-Broschüren-Plugin, um von dort aus auf die Daten zuzugreifen. Es funktioniert wahrscheinlich, aber das WFS-Geojson Leaflet-Plugin scheint nicht mehr gepflegt zu sein.

  4. Verwenden Sie CartoDB, speichern Sie alle Daten in einer CartoDB-Tabelle und zeigen Sie sie mit CartoDB.js an. Funktioniert super, kann aber sehr teuer werden. Es ist möglich, es selbst zu hosten, aber die Installation von CartoDB ist nicht trivial.

All dies lässt mich denken, dass es einen viel besseren, freien Weg geben muss, auf dem ich vermisse. Was ist es?

BEARBEITEN

Vielleicht habe ich das WFS-Geojson-Plugin zu einfach abgeschrieben. Es gibt eine Gabel, die noch Aktivität aufweist (vor 4 Monaten): https://github.com/johanlahti/azgs-leaflet


1
einfach den geoserver wfs nach json fragen?
Ian Turton

Nun, wenn ich das richtig verstehe, sagen Sie, wenn Sie eine Anfrage für JSON fest codieren, im Wesentlichen nur, dass Sie die gesamte Datenmenge als ein einziges JSON-Blob übertragen sollen - genau wie bei Lösung 1. Sie benötigen tatsächliches WFS, um Anfragen zu erhalten, die begrenzt sind zum aktuellen Ansichtsfenster, nein?
Steve Bennett

WFS-Anfrage nach Kartengrenzen filtern (Wird das nicht automatisch in einer Broschüre angezeigt?)
Ian Turton

Um das zu tun, müsste man WFS sprechen, nein? Und afaik das gibt es nur im (nicht gepflegten) WFS-Geojson Plugin?
Steve Bennett

1
WFS ist nicht so schwer - vielleicht ist Flugblatt das Thema>
Ian Turton

Antworten:


4

Ok, meine Annahmen in 2 waren falsch. Sie können mapbox.js verwenden. Ich glaube, das Endergebnis wird ein wenig anders ausfallen - die Marker selbst werden eine statische Rasterebene sein, aber sie können angeklickt werden.

Die Spezifikation, die Interaktivität in großem Maßstab ermöglicht, lautet https://github.com/mapbox/utfgrid-spec

Es ist clientseitig in https://github.com/danzel/Leaflet.utfgrid ( Leaflet- Plugin) und auch in mapbox.js implementiert.

Serverseitig ist es in https://github.com/mapbox/tilelive.js und damit in TileMill implementiert, zB: http://tilemill-server/tile/projectname/7/115/78.grid.json

Es ist auch in TileStache implementiert, jedoch nicht in tilestream oder mbtiles-server. Die UTFgrid-Daten scheinen von TileMill in der Datei mbtiles gespeichert worden zu sein, werden jedoch von diesen ignoriert.

Sie brauchen also nicht nur mapbox.com, sondern auch mapbox.js nicht. Mapbox.js scheint die Dinge aus Bequemlichkeitsgründen meistens zusammenzufügen: Ein einzelner Aufruf, der eine Karte instanziiert, Kacheln abruft und Interaktivität hinzufügt.

Wenn Sie jedoch "mapbox.js" verwenden, fehlt ein Teil des Puzzles, und das ist "tilejson". Sie geben mapbox.json die Ihrer Karte entsprechende Kacheldatei.



0

Wenn Sie die Lösung noch nicht gefunden haben, finden Sie hier eine: http://gis.xyz/leaflet.html#

 var owsrootUrl = 'http://217.8.255.188:8080/geoserver/opengeo/ows';

 var defaultParameters = {
     service : 'WFS',
     version : '2.0',
     request : 'GetFeature',
     typeName : 'opengeo:evernote_geom',
     outputFormat : 'text/javascript',
     format_options : 'callback:getJson',
     SrsName : 'EPSG:4326'
};

var parameters = L.Util.extend(defaultParameters);
var URL = owsrootUrl + L.Util.getParamString(parameters);

var WFSLayer = null;
var ajax = $.ajax({
    url : URL,
    dataType : 'jsonp',
    jsonpCallback : 'getJson',
    success : function (response) {
       WFSLayer = L.geoJson(response, {
            style: function (feature) {
                return {
                    stroke: false,
                    fillColor: 'FFFFFF',
                    fillOpacity: 0
                };
            },
            onEachFeature: function (feature, layer) {
                popupOptions = {maxWidth: 600};
                layer.bindPopup('<h4>'+feature.properties.url+'</h4><br>'+feature.properties.title
                    ,popupOptions);
            }
        }).addTo(map);
    }
});

Ich sehe nicht, wie dies die Anfrage auf das aktuelle Ansichtsfenster beschränkt.
Buchstabensuppe

0

Der schnellste Weg, dies zu tun, ist https://mangomap.com . Sie sollten in der Lage sein, das Ganze in ungefähr 10 Minuten einzurichten, ohne eine einzige Codezeile zu schreiben.


1
Interessant, ich hatte noch nie davon gehört. Aber mit 29 USD / Monat liegt das definitiv außerhalb der Preisspanne des Bastlers oder der meisten kleinen Forschungsprojekte.
Steve Bennett

4
Dies beantwortet die Frage nicht wirklich und liest sich wie eine Werbung. Es scheint, als wolle der Fragesteller eine Methode, die eine effiziente Anzeige großer Datensätze ermöglicht. Es reicht nicht aus, Ihrem Produkt nur zu erklären, warum es effizienter ist.
Conor

1
Das OP stellte ein Problem dar, ich stellte eine mögliche Lösung vor. Alle Lösungen für dieses Problem kosten Zeit oder Geld.
ChrisInCambo

@Conor Obwohl dieser Beitrag die Frage zu beantworten scheint und die Art der Lösung und die Verbindung des Posters mit dem Produkt von vornherein klar ist, wäre es hilfreich, herauszufinden, warum er empfohlen werden könnte.
Whuber

0

In der folgenden Präsentation erfahren Sie, wie Sie mithilfe von Node.js und PostgreSQL mit PostGIS Online-Web-Mapping durchführen.


Könnten Sie vielleicht die relevanten Punkte extrahieren, um daraus eine vollständige Antwort zu machen?
Steve Bennett
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.