멋진 웹 인터페이스로 두 개의 맵을 비교하십니까?


16

Leaflet 또는 OpenLayers에서 두 맵을 막대와 비교하여 두 맵 사이를 슬라이드 할 수 있습니까?

예를 들면 다음과 같습니다.

나는 그것이 가능하다는 것을 알고 있지만 어떻게 해야할지 모르겠다. 누구든지 아이디어가 있습니까? 예?


1
허리케인 샌디 링크는 이제 죽었을 것 같습니다. 가 아이디어를 보여주기 위해 더 나은 링크?
Stephen Lead

작동합니다. 다른 링크 @StephenLead를 교체하겠습니다
Alex Leith

답변:


12

하고 싶은 것을 보통 '스 와이프'도구라고합니다.

OpenLayers이에 대한 붙박이 도구 또는 컨트롤이 없다,하지만 다행히도, 여기 예를 들어이 : 구글과 출근 제어 및 OSM 사용자 정의 클래스에 기반.

JavaScript 파일을 응용 프로그램에 포함 하면 됩니다.

온라인에서 본 대부분의 스 와이프 도구 / 컨트롤은 간단한 CSS 클립을 기반으로합니다. 외부 패치 없이도 이러한 종류의 Control을 응용 프로그램에 통합하는 것은 매우 간단합니다.


누구든지 Leaflet으로 그것을 본 적이 있습니까?
Alex Leith


8

망고 는 리플릿과 함께합니다. 예를 확인 하십시오 .

물론 직접 코딩하는 시간을 절약하고 망고를 사용하여 무료로지도를 만들 수 있습니다.


멋진 인터페이스입니다! 그러나 재사용 가능한 코드는 없습니다 ... 조직 내부의 무언가를 원하며 이미 데이터를 스타일링하고 호스팅하기위한 인프라를 갖추고 있습니다.
Alex Leith

3

이것은 두 개의 WMS 레이어와 전단지 0.5를 사용하는 작동하는 전단지 예제입니다. 패닝하는 동안 레이어가 잘리지 않는 등 약간의 조정이 필요합니다. 그러나 그것은 꽤 잘 작동합니다.

여기를 참조하십시오 : https://github.com/gccgisteam/leaflet-examples/blob/master/leafletSwipe.html


나는 당신이 저자인지 모르겠지만 두 가지 제안을 할 것입니다. 먼저 MoveEnd 이벤트 대신 Move 이벤트를 사용하면 실시간으로 스 와이프하고 두 번째로, 이것이 도구가되어야하는 방식과 반대되는 방법이라고 생각합니다 익숙한. 지도를 드래그하는 대신 슬라이더를 드래그해야합니다.
Devdatta Tengshe

나는 실제로 하단에 슬라이더와 마우스를 움직이는 것을 좋아합니다. 즉, 마우스를 사용하면 항상 작동하게되고 터치를 사용하면 여전히 마우스를 사용할 수 있습니다. 나는 단지 그것을 함께 얻었다, 그것은 단지 개념의 증거이다. 많은 옵션이 있다고 확신합니다.
Alex Leith

2

전단지 용 WMS 분할 을 살펴보십시오 .


1

전단지로 가능합니다. 여기 전단지 및 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 
        );
    }); 

완전한 예를 얻었습니까? 스 와이프하도록 두 개의지도를 어떻게 설정하나요?
Alex Leith

두 개의 맵이 필요하지 않습니다. 필요한 것은 $ ( ". leaflet-layer : nth-child (3)"). css ( "clip", "rect ("+ coordLeft + ") "); $ ( ". leaflet-layer : nth-child (2)"). css ( "clip", "rect ("+ coordRight + ")");
khousuylong

좋아, (2)와 (3)은 맵에 추가하기 위해 레이어 2와 3을 참조합니까?
Alex Leith

위의 코드가 시작되어 실행 중입니다. 먼저 필요한 것은 맵을 만들고 두 개의 레이어를 추가하는 것입니다 .jquery를 사용하면 최상위 레이어와 두 번째 최상위 레이어의 컨테이너를 얻을 수 있습니다. "css"클립을 사용하여 그에 따라 두 개의 컨테이너를
자릅니다

좋아, 그래서 순진한 구현이 있습니다 : jsfiddle.net/Ah6Bx 무엇이 빠졌습니까?
Alex Leith


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.