Mehr

Abrufen/Definieren der Ausdehnung von ol.source.tile xyz

Abrufen/Definieren der Ausdehnung von ol.source.tile xyz


Ich habe eine Reihe von Kachelquellen, die verschiedenen Kartenanbietern bei bestimmten Auflösungen entsprechen, und möchte eine Ausdehnung so einstellen, dass bei Auswahl des entsprechenden Layers die Karte auf die Ausdehnung der Kacheln geschwenkt und gezoomt wird.

Nach diesem Beispiel habe ich die Ausdehnung für jede Quelle festgelegt. Ich kann auch die Ausdehnung des ausgewählten Layers mit diesem Code in meinem Layerswitcher-Steuerelement abrufen:

curExtent = map.getView().calculateExtent(map.getSize()); if (Extent != null) { Extent = Layer[s].getExtent(); aufrechtzuerhalten. Sonst { Ausdehnung = map.getView().calculateExtent(map.getSize()); } SchichtZoom = Schichten[s].getProperties().minZoom; map.getView().fit(extent, map.getSize()); Schichten[s].setVisible(true);

Ich kann an dieser Stelle die Auflösung/Zoom abrufen, bin mir jedoch nicht sicher, wie die Ansicht auf die minResolution/Zoom-Eigenschaft jeder Quelle eingestellt wird. Kann jemand bitte helfen?

Darüber hinaus kann ich die Karte jetzt schwenken und zoomen, aber die Ebenenkacheln werden nicht angezeigt. Ich dachte, es sei ein Projektionsproblem, aber ich bin am richtigen Ort und zoome. Muss ich das Laden der Kacheln vielleicht verzögern?

Hier der geänderte Code:

var curExtent = map.getView().calculateExtent(map.getSize()); if (title == selectedValue) { if (extent != []) { extension = layer[s].getExtent(); } Else { Extent = curExtent; } Konsole.log (Ausdehnung); SchichtZoom = Schichten[s].getProperties().minZoom; var sourceCentre = ol.extent.getCenter(extent); console.log(sourceCenter); console.log(layerZoom); console.log(curExtent); Konsole.log (Ausdehnung); map.getView().setCenter(sourceCenter); map.getView().setZoom(layerZoom); Schichten[s].setVisible(true); } Else { Schichten[s].setVisible(false); }

Ich habe eine einfache Geige eingerichtet, die jetzt zu funktionieren scheint, obwohl ich Schwierigkeiten habe, den Umfang der anderen Standardkartenebenen zu erhalten, und die Funktionalität nach der ersten erfolgreichen Aktion zu brechen scheint.


Die Lösung, die ich dafür gefunden habe, bestand darin, eine Überprüfung für einen anderen Wert auf der Ebene hinzuzufügen. In diesem Fall der Wert von 'sub'. Dadurch konnte ich überprüfen, ob die Layerquelle eine definierte Ausdehnung hat. Wenn die Ausdehnung gefunden wurde, habe ich den minZoom-Wert nachgeschlagen, die Zentrumskoordinate der Ausdehnung ermittelt und dann die Ansicht darauf eingestellt.

Die Funktionalität schien zu brechen, wenn ich die Extent-Eigenschaft einer nicht definierten Quelle überprüfte, sodass die Überprüfung der 'sub'-Eigenschaft dies negierte. Es war ein langer Weg, um eine Quadkey-Funktion zu finden, herauszufinden, wie man diese auf eine benutzerdefinierte xyz-URL anwendet, um herauszufinden, wie man die Projektion der Ausdehnung transformiert, dann den Zoom nachzuschlagen und eine neue Ansicht einzustellen. Ganz zu schweigen von der Erstellung eines Auswahlmenüs aus den Ebenen, aber der Aufwand hat sich definitiv gelohnt.

Ich bin mir sicher, dass mein Code für die meisten Leute ein wenig kompliziert aussieht und ich werde die Gelegenheit haben, ihn später zu verfeinern, aber danke an alle, die dabei geholfen haben. @AlvinLindstam, @JonatasWalker und @Pavlos haben mir alle geholfen, besser zu verstehen, wie das alles zusammenpasst. Für alle, die etwas Ähnliches machen möchten, poste ich den Code unten und hier ist ein Link zur Geige.

var sub = schichten[s].get('sub'); // wobei Layer[s] das Ergebnis einer Layersuche ist var Extent; if (title == selectedValue) { if (sub == undefined) {layer[s].setVisible(true); aufrechtzuerhalten. Wenn (sub == 'Premium') {var Dauer = 2000; var start = +neues Datum(); var-Ansicht = map.getView(); var pan = ol.animation.pan({ Dauer: Dauer, //easing: eval(ol.easing.inAndOut), source: (view.getCenter()), start: start }); var Bounce = ol.animation.bounce({ Dauer: Dauer, Auflösung: 4 * view.getResolution(), Start: Start }); // Animation zur Render-Pipeline hinzufügen map.beforeRender(pan, bounce); Ausdehnung = Schichten[s].getExtent(); Konsole.log (Ausdehnung); SchichtZoom = Schichten[s].getProperties().minZoom; var sourceCentre = ol.extent.getCenter(extent); view.setCenter(sourceCenter); view.setZoom(layerZoom); Schichten[s].setVisible(true); }

Sie können diese Frage aktivieren, um das GetExtent-Problem zu lösen.


Schau das Video: QGIS Add Basemaps and Map Tiles