1. Einleitung In vielen Fällen kann die Anzahl der Features in einem Punkt-Feature-Layer Hunderte oder Tausende betragen. Wenn sie ohne jegliche Verarbeitung direkt auf die Karte geladen werden, verschlechtert sich nicht nur das visuelle Erlebnis des Benutzers, sondern es kommt auch dazu, dass die Kartenoberfläche einfriert. Der folgende Code erstellt <!DOCTYPE html> <html> <Kopf> <meta http-equiv="Inhaltstyp" content="text/html; charset=utf-8" /> <meta charset="utf-8" /> <Titel>OpenLayers</Titel> <Stil> html, Text, #map { Breite: 100 %; Höhe: 100%; Rand: 0; Polsterung: 0; } </Stil> <link href="libs/ol/ol.css" rel="stylesheet" /> <script src="libs/ol/ol.js"></script> </Kopf> <Text> <div id="Karte"></div> <Skript> // 1000 zufällige Funktionen erstellen var source = new ol.source.Vector(); für (var i = 1; i <= 200; i++) { var Koordinaten = [120,00 + Math.random(), 30,00 + Math.random()]; var feature = neues ol.Feature(neues ol.geom.Point(Koordinaten)); Quelle.AddFeature(Feature); } für (var i = 1; i <= 200; i++) { var Koordinaten = [120,01 + Math.random(), 30,01 + Math.random()]; var feature = neues ol.Feature(neues ol.geom.Point(Koordinaten)); Quelle.AddFeature(Feature); } für (var i = 1; i <= 200; i++) { var Koordinaten = [120,02 + Math.random(), 30,02 + Math.random()]; var feature = neues ol.Feature(neues ol.geom.Point(Koordinaten)); Quelle.AddFeature(Feature); } für (var i = 1; i <= 200; i++) { var Koordinaten = [120,03 + Math.random(), 30,03 + Math.random()]; var feature = neues ol.Feature(neues ol.geom.Point(Koordinaten)); Quelle.AddFeature(Feature); } für (var i = 1; i <= 200; i++) { var Koordinaten = [120,04 + Math.random(), 30,04 + Math.random()]; var feature = neues ol.Feature(neues ol.geom.Point(Koordinaten)); Quelle.AddFeature(Feature); } // Eine Ebene erstellen var layer = new ol.layer.Vector({ Quelle: Quelle, Stil: Funktion (Merkmal, Auflösung) { var Stil = neuer ol.Stil.Stil({ Bild: neues ol.style.Icon({ Quelle: „img/location.png“ }) }) Rückgabestil; } }); // Eine Karte erstellen var map = new ol.Map({ Ziel: 'Karte', Schichten: neue ol.layer.Tile({ Quelle: neue ol.source.OSM() }), Schicht ], Ansicht: neue ol.View({ Projektion: 'EPSG:4326', Mitte: [120, 30], Zoom: 10, minZoom: 5, maxZoom: 14 }) }); </Skript> </body> </html> Die Laufergebnisse sind in der folgenden Abbildung dargestellt: Ist es nicht abstoßend, so viele Punkte so dicht beieinander zu sehen? Wenn ein Punkt-Feature-Layer eine große Anzahl von Punkten enthält, verarbeiten wir ihn im Allgemeinen durch 2. Aggregation von Punkt-Feature-Layern In
Der Layer-Aggregationscode lautet wie folgt: <!DOCTYPE html> <html> <Kopf> <meta http-equiv="Inhaltstyp" content="text/html; charset=utf-8" /> <meta charset="utf-8" /> <Titel>OpenLayers</Titel> <Stil> html, Text, #map { Breite: 100 %; Höhe: 100%; Rand: 0; Polsterung: 0; } </Stil> <link href="libs/ol/ol.css" rel="stylesheet" /> <script src="libs/ol/ol.js"></script> </Kopf> <Text> <div id="Karte"></div> <Skript> // 1000 zufällige Funktionen erstellen var source = new ol.source.Vector(); für (var i = 1; i <= 200; i++) { var Koordinaten = [120,00 + Math.random(), 30,00 + Math.random()]; var feature = neues ol.Feature(neues ol.geom.Point(Koordinaten)); Quelle.AddFeature(Feature); } für (var i = 1; i <= 200; i++) { var Koordinaten = [120,01 + Math.random(), 30,01 + Math.random()]; var feature = neues ol.Feature(neues ol.geom.Point(Koordinaten)); Quelle.AddFeature(Feature); } für (var i = 1; i <= 200; i++) { var Koordinaten = [120,02 + Math.random(), 30,02 + Math.random()]; var feature = neues ol.Feature(neues ol.geom.Point(Koordinaten)); Quelle.AddFeature(Feature); } für (var i = 1; i <= 200; i++) { var Koordinaten = [120,03 + Math.random(), 30,03 + Math.random()]; var feature = neues ol.Feature(neues ol.geom.Point(Koordinaten)); Quelle.AddFeature(Feature); } für (var i = 1; i <= 200; i++) { var Koordinaten = [120,04 + Math.random(), 30,04 + Math.random()]; var feature = neues ol.Feature(neues ol.geom.Point(Koordinaten)); Quelle.AddFeature(Feature); } // Aggregationsvar cluster = new ol.source.Cluster({ Quelle: Quelle, Entfernung: 100 }) // Eine Ebene erstellen var layer = new ol.layer.Vector({ Quelle: Cluster, Stil: Funktion (Merkmal, Auflösung) { var Größe = Feature.get('Features').Länge; var Stil = neuer ol.Stil.Stil({ Bild: neuer ol.style.Circle({ Radius: 30, Strich: neuer ol.style.Stroke({ Farbe: 'weiß' }), füllen: neues ol.style.Fill({ Farbe: 'blau' }) }), Text: neuer ol.style.Text({ Text: size.toString(), füllen: neues ol.style.Fill({ Farbe: 'weiß' }) }) }) Rückgabestil; } }); // Eine Karte erstellen var map = new ol.Map({ Ziel: 'Karte', Schichten: neue ol.layer.Tile({ Quelle: neue ol.source.OSM() }), Schicht ], Ansicht: neue ol.View({ Projektion: 'EPSG:4326', Mitte: [120, 30], Zoom: 10, minZoom: 5, maxZoom: 14 }) }); </Skript> </body> </html> Die Laufergebnisse sind in der folgenden Abbildung dargestellt: 3. Spezielle Behandlung der Polymerisation Obwohl der obige Code die Aggregation von Punkt-Feature-Layern realisiert, gibt es tatsächlich ein Problem: Generell gilt: <!DOCTYPE html> <html> <Kopf> <meta http-equiv="Inhaltstyp" content="text/html; charset=utf-8" /> <meta charset="utf-8" /> <Titel>OpenLayers</Titel> <Stil> html, Text, #map { Breite: 100 %; Höhe: 100%; Rand: 0; Polsterung: 0; } </Stil> <link href="libs/ol/ol.css" rel="stylesheet" /> <script src="libs/ol/ol.js"></script> </Kopf> <Text> <div id="Karte"></div> <Skript> // 1000 zufällige Funktionen erstellen var source = new ol.source.Vector(); für (var i = 1; i <= 200; i++) { var Koordinaten = [120,00 + Math.random(), 30,00 + Math.random()]; var feature = neues ol.Feature(neues ol.geom.Point(Koordinaten)); Quelle.AddFeature(Feature); } für (var i = 1; i <= 200; i++) { var Koordinaten = [120,01 + Math.random(), 30,01 + Math.random()]; var feature = neues ol.Feature(neues ol.geom.Point(Koordinaten)); Quelle.AddFeature(Feature); } für (var i = 1; i <= 200; i++) { var Koordinaten = [120,02 + Math.random(), 30,02 + Math.random()]; var feature = neues ol.Feature(neues ol.geom.Point(Koordinaten)); Quelle.AddFeature(Feature); } für (var i = 1; i <= 200; i++) { var Koordinaten = [120,03 + Math.random(), 30,03 + Math.random()]; var feature = neues ol.Feature(neues ol.geom.Point(Koordinaten)); Quelle.AddFeature(Feature); } für (var i = 1; i <= 200; i++) { var Koordinaten = [120,04 + Math.random(), 30,04 + Math.random()]; var feature = neues ol.Feature(neues ol.geom.Point(Koordinaten)); Quelle.AddFeature(Feature); } // Aggregationsvar cluster = new ol.source.Cluster({ Quelle: Quelle, Entfernung: 100 }) // Eine Ebene erstellen var layer = new ol.layer.Vector({ Quelle: Cluster, Stil: Funktion (Merkmal, Auflösung) { var Größe = Feature.get('Features').Länge; wenn (Größe == 1) { gib neuen ol.style.Style zurück({ Bild: neues ol.style.Icon({ Quelle: „img/location.png“ }) }) } anders { gib neuen ol.style.Style zurück({ Bild: neuer ol.style.Circle({ Radius: 30, Strich: neuer ol.style.Stroke({ Farbe: 'weiß' }), füllen: neues ol.style.Fill({ Farbe: 'blau' }) }), Text: neuer ol.style.Text({ Text: size.toString(), füllen: neues ol.style.Fill({ Farbe: 'weiß' }) }) }) } } }); // Eine Karte erstellen var map = new ol.Map({ Ziel: 'Karte', Schichten: neue ol.layer.Tile({ Quelle: neue ol.source.OSM() }), Schicht ], Ansicht: neue ol.View({ Projektion: 'EPSG:4326', Mitte: [120, 30], Zoom: 10, minZoom: 5, maxZoom: 14 }) }); </Skript> </body> </html> Die Laufergebnisse sind in der folgenden Abbildung dargestellt: Tatsächlich ist dieser Effekt sehr einfach zu implementieren. Der Kerncode lautet: 4. Spezielle Behandlung der Polymerisation 2 Im obigen Code habe ich die maximale Zoomstufe der Karte auf <!DOCTYPE html> <html> <Kopf> <meta http-equiv="Inhaltstyp" content="text/html; charset=utf-8" /> <meta charset="utf-8" /> <Titel>OpenLayers</Titel> <Stil> html, Text, #map { Breite: 100 %; Höhe: 100%; Rand: 0; Polsterung: 0; } </Stil> <link href="libs/ol/ol.css" rel="stylesheet" /> <script src="libs/ol/ol.js"></script> </Kopf> <Text> <div id="Karte"></div> <Skript> // 1000 zufällige Funktionen erstellen var source = new ol.source.Vector(); für (var i = 1; i <= 200; i++) { var Koordinaten = [120,00 + Math.random(), 30,00 + Math.random()]; var feature = neues ol.Feature(neues ol.geom.Point(Koordinaten)); Quelle.AddFeature(Feature); } für (var i = 1; i <= 200; i++) { var Koordinaten = [120,01 + Math.random(), 30,01 + Math.random()]; var feature = neues ol.Feature(neues ol.geom.Point(Koordinaten)); Quelle.AddFeature(Feature); } für (var i = 1; i <= 200; i++) { var Koordinaten = [120,02 + Math.random(), 30,02 + Math.random()]; var feature = neues ol.Feature(neues ol.geom.Point(Koordinaten)); Quelle.AddFeature(Feature); } für (var i = 1; i <= 200; i++) { var Koordinaten = [120,03 + Math.random(), 30,03 + Math.random()]; var feature = neues ol.Feature(neues ol.geom.Point(Koordinaten)); Quelle.AddFeature(Feature); } für (var i = 1; i <= 200; i++) { var Koordinaten = [120,04 + Math.random(), 30,04 + Math.random()]; var feature = neues ol.Feature(neues ol.geom.Point(Koordinaten)); Quelle.AddFeature(Feature); } // Aggregationsvar cluster = new ol.source.Cluster({ Quelle: Quelle, Entfernung: 100 }) // Eine Ebene erstellen var layer = new ol.layer.Vector({ Quelle: Cluster, Stil: Funktion (Merkmal, Auflösung) { var Größe = Feature.get('Features').Länge; wenn (Größe == 1) { gib neuen ol.style.Style zurück({ Bild: neues ol.style.Icon({ Quelle: „img/location.png“ }) }) } anders { gib neuen ol.style.Style zurück({ Bild: neuer ol.style.Circle({ Radius: 30, Strich: neuer ol.style.Stroke({ Farbe: 'weiß' }), füllen: neues ol.style.Fill({ Farbe: 'blau' }) }), Text: neuer ol.style.Text({ Text: size.toString(), füllen: neues ol.style.Fill({ Farbe: 'weiß' }) }) }) } } }); // Eine Karte erstellen var map = new ol.Map({ Ziel: 'Karte', Schichten: neue ol.layer.Tile({ Quelle: neue ol.source.OSM() }), Schicht ], Ansicht: neue ol.View({ Projektion: 'EPSG:4326', Mitte: [120, 30], Zoom: 10, minZoom: 5, maxZoom: 14 }) }); // Auf Ereignisse zur Änderung der Kartenauflösung warten map.getView().on('change:resolution', function (event) { wenn (map.getView().getZoom() == map.getView().getMaxZoom()) { cluster.setDistance(0); } anders { cluster.setDistance(100); } }) </Skript> </body> </html> Die Laufergebnisse sind in der folgenden Abbildung dargestellt: Die Implementierung dieses Effekts ist ebenfalls sehr einfach. Sie müssen nur auf das Ereignis zur Änderung der Auflösung der aktuellen Karte hören. Wenn die aktuelle Zoomstufe bereits die maximale Stufe ist, setzen Sie die Aggregationsdistanz auf 5. Fazit Bei einer großen Anzahl von Elementen sollten wir eine Zusammenlegung in Betracht ziehen. Dadurch wird nicht nur das Benutzererlebnis verbessert, sondern auch ein Einfrieren der Benutzeroberfläche vermieden. Tatsächlich habe ich im obigen Code auf map.on('moveend', Funktion (Ereignis) { wenn (map.getView().getZoom() == map.getView().getMaxZoom()) { cluster.setDistance(0); } anders { cluster.setDistance(100); } }); Derselbe Effekt lässt sich durch Abhören des Dies ist das Ende dieses Artikels über die Implementierung der aggregierten Anzeige von Punkt-Feature-Layern in OpenLayers. Weitere Inhalte zur aggregierten Anzeige von Punkt-Feature-Layern in OpenLayers finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen! Das könnte Sie auch interessieren:
|
<<: Lösung für Ubuntu 20.04 Firefox kann keine Videos abspielen (Flash-Plug-In fehlt)
>>: Äußerst detaillierte Freigabe der MySQL-Nutzungsspezifikation
Linux-Dateisystem In der Abbildung oben sind herk...
Inhaltsverzeichnis 1. Der Elefant, der nicht in d...
1. Richten Sie auf der virtuellen Maschine einen ...
Inhaltsverzeichnis Array-Deduplizierung 1. from()...
Inhaltsverzeichnis 1. Funktionsbindung 2. Mit Par...
Aus Erfahrung weiß man, dass es eine gute Angewoh...
◆Zu Favoriten hinzufügen veranschaulichen Klicken...
Inhaltsverzeichnis Überblick Methode 1: Parameter...
In diesem Artikelbeispiel wird der spezifische Co...
Inhaltsverzeichnis Vorwort Erstellungsschritte Er...
Einführung Das mysql-utilities-Toolset ist eine S...
Inhaltsverzeichnis V-Modell .sync Der Unterschied...
Im Folgenden werden die häufig verwendete Kopfstr...
Einige Befehlsunterschiede zwischen den Versionen...
Gute Datenbankspezifikationen tragen dazu bei, di...