Zwei Karten mit schönem Webinterface vergleichen?


16

Ist es in Leaflet oder OpenLayers möglich, zwei Karten mit einem Balken zu vergleichen, um zwischen den beiden zu gleiten?

Beispiele beinhalten:

Ich weiß, dass es möglich ist, aber ich weiß nicht, wie ich es machen soll. Hat jemand irgendwelche Ideen? Beispiele?


1
Die Hurricane Sandy-Verbindung scheint jetzt tot zu sein. Ist dies ein besserer Link, um die Idee zu demonstrieren?
Stephen Lead

Das funktioniert, ich ersetze den anderen Link @StephenLead
Alex Leith

Antworten:


12

Was Sie tun möchten, wird normalerweise als "Swipe" -Tool bezeichnet.

In OpenLayers gibt es hierfür kein integriertes Tool oder Steuerelement. Zum Glück gibt es hier ein Beispiel: Swipe Control mit Google und OSM basierend auf einer benutzerdefinierten Klasse.

Sie müssen nur diese JavaScript-Datei in Ihre Anwendung aufnehmen.

Die meisten Swipe Tools / Steuerelemente, die ich online gesehen habe, basieren auf dem einfachen CSS-Clip. Es ist sehr einfach, diese Art von Control auch ohne externe Patches in Ihre Anwendung zu integrieren.


Gesehen, wie jemand es mit Leaflet gemacht hat?
Alex Leith


8

Mango macht es mit Leaflet. Schauen Sie sich hier ein Beispiel an .

Sie können sich natürlich auch die Zeit sparen, um es selbst zu codieren und die Karte mit Mango kostenlos zu erstellen.


Das ist eine gut aussehende Oberfläche! Aber es gibt dort keinen wiederverwendbaren Code ... Ich möchte etwas unternehmensinternes, und ich habe bereits eine Infrastruktur für das Stylen und Hosten von Daten.
Alex Leith

3

Dies ist ein funktionierendes Flugblattbeispiel mit zwei WMS-Ebenen und Flugblatt 0.5. Es muss ein wenig optimiert werden, zum Beispiel, dass die Ebenen beim Schwenken nicht abgeschnitten werden. Aber es funktioniert ziemlich gut.

Siehe hier: https://github.com/gccgisteam/leaflet-examples/blob/master/leafletSwipe.html


Ich weiß nicht, ob Sie der Autor sind, aber ich gebe Ihnen zwei Vorschläge: Erstens ermöglicht die Verwendung des Move-Ereignisses anstelle des MoveEnd-Ereignisses das Durchwischen in Echtzeit, und zweitens ist dies meines Erachtens der umgekehrte Weg, wie ein Werkzeug sein sollte benutzt. Anstatt die Karte zu ziehen, sollte der Schieberegler gezogen werden.
Devdatta Tengshe

Eigentlich mag ich es, wenn sich sowohl der Schieberegler unten als auch die Maus bewegen. Dies bedeutet, dass Sie mit einer Maus die ganze Zeit arbeiten müssen und mit der Berührung immer noch arbeiten können. Ich habe es gerade erst zusammengebracht, es ist nur ein Proof of Concept. Ich bin sicher, dass es viele Möglichkeiten gibt.
Alex Leith


1

es ist mit Flugblatt möglich. hier was ich gemacht habe die swipe map mit leaflet und jquery.

$(document).ready(function() {
        var currentX = $("#viewport").width() / 2;
        var resetPosition = function(x){
            var pos = $(".leaflet-map-pane").position(),
            coordLeft = ( - pos.top ) + "px, " + ( x - pos.left + 3 ) + "px, " + ( $("#viewport").height() - pos.top ) + "px, " + -pos.left + "px",
            coordRight = ( - pos.top ) + "px, " + ( $("#viewport").width() - pos.left ) + "px, " + ( $("#viewport").height() - pos.top ) + "px, " + ( x - pos.left + 3 ) + "px";
            $(".leaflet-layer:nth-child(3)").css("clip", "rect(" + coordLeft + ")");
            $(".leaflet-layer:nth-child(2)").css("clip", "rect(" + coordRight + ")");
        };
        resetPosition(currentX);
        map.on("move", function(){
            resetPosition(currentX);
        })
        map.on("zoomend", function(){
            resetPosition(currentX);
        });
        if( $.browser.msie && parseInt($.browser.version) < 9 ){
            $("#vbar-divider").draggable({
                drag: function(e){
                    currentX = $("#vbar-divider").position().left;
                    resetPosition(currentX);
                },
                axis: "x"
            });
        }else{
            $("#vbar-divider").draggable({
                drag: function(e){
                    currentX = $("#vbar-divider").position().left;
                    resetPosition(currentX);
                    $("#vbar-divider div").hide();
                },
                stop: function(){
                    $("#vbar-divider div").show();
                },
                axis: "x",
                containment: "parent"
            });
        }
        $('#vbar-divider').animate({
                left: currentX,
            }, 
            500 
        );
    }); 

Haben Sie ein vollständiges Beispiel? Wie richten Sie die beiden Karten ein, zwischen denen Sie wischen möchten?
Alex Leith

Sie benötigen keine zwei Karten. Sie benötigen lediglich eine Karte mit zwei Ebenen ($ (". leaflet-layer: nth-child (3)"). css ("clip", "rect (" + coordLeft + ") "); $ (". leaflet-layer: n-child (2)"). css ("clip", "rect (" + coordRight + ")");
Khousuylong

Ok, wo (2) und (3) beziehen sich auf Layer 2 und 3 in der Reihenfolge des Hinzufügens zur Karte?
Alex Leith

Der obige Code ist in Betrieb. Zuerst müssen Sie eine Karte erstellen und zwei Ebenen hinzufügen. Dann können Sie mit jquery den Container mit der obersten Ebene und der zweiten obersten Ebene abrufen. mit "CSS" clip dementsprechend die beiden Behälter zu befestigen
khousuylong

Ok, also ich habe hier eine naive Implementierung: jsfiddle.net/Ah6Bx was fehlt?
Alex Leith


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.