OpenLayers에서 벡터 피처 / 레이어 클릭의 좌표는 어떻게 얻습니까?


15

사용자가 OpenLayers 맵에서 벡터 기능을 클릭 할 때 클릭 좌표를 가져와야합니다. SelectControl은 클릭 한 기능 만 제공하며 클릭 좌표는 제공하지 않습니다. 어쨌든 벡터 클릭의 좌표를 얻으려면? 사용자 클릭 시점에 AnchoredBubble을 표시해야합니다.

답변:


16

실제로 클릭 이벤트 샘플 은 원하는 것을 제공합니다.

OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, {                
            defaultHandlerOptions: {
                'single': true,
                'double': false,
                'pixelTolerance': 0,
                'stopSingle': false,
                'stopDouble': false
            },

            initialize: function(options) {
                this.handlerOptions = OpenLayers.Util.extend(
                    {}, this.defaultHandlerOptions
                );
                OpenLayers.Control.prototype.initialize.apply(
                    this, arguments
                ); 
                this.handler = new OpenLayers.Handler.Click(
                    this, {
                        'click': this.trigger
                    }, this.handlerOptions
                );
            }, 

            trigger: function(e) {
                var lonlat = map.getLonLatFromViewPortPx(e.xy);
                alert("You clicked near " + lonlat.lat + " N, " +
                                          + lonlat.lon + " E");
            }

        });

필요한 경우 좌표를 픽셀로 변환 하여 팝업을 표시 할 수 있습니다 .

편집-피처 선택시에만 좌표를 가져옵니다 .

   var options = {
    onSelect: getCoordinates,
};

var selectEt = new OpenLayers.Control.SelectFeature(mylayer, options);
map.addControl(selectEt);

function getCoordinates(e) {
 // this should work
 var lonlat = map.getLonLatFromViewPortPx(e.xy);
 alert("You clicked near " + lonlat.lat + " N, " +
                                          + lonlat.lon + " E");
}

안녕하세요 simo, 관심이있는 벡터 레이어 나 기능을 클릭 할 때만 클릭 이벤트를 호출해야합니다. 위 샘플은 벡터 레이어가 아닌 전체지도에서 클릭 이벤트 핸들러를 캡처하고 호출한다고 생각합니다. 감사합니다, 비쉬
비슈

@Vish :이 경우 Tim Schaub의 답변과 위의 편집 내용을 참조하십시오.
simo

안녕, simo getCoordinates 메소드의 'e'는 어디에서 오는가?
Vish

e는 이벤트 입니다. getCoordinates (e) 함수 선언에 추가했습니다 . 이 기능을 전달할 수 있지만 이벤트에 대해서는 잘 모르겠습니다. 테스트하십시오.
simo

@simo, onSelect는 이벤트가 아닌 기능으로 호출되어야합니다. dev.openlayers.org/docs/files/OpenLayers/Control/…
Chris

6

API는 SelectFeature컨트롤 에서 클릭 위치를 가져 오는 방법을 제공하지 않지만 반드시 클릭 해야합니다. 사소한 추가가 될 것입니다 ( 이벤트에 xy포함 featureselected). 이 티켓을 발권하면 첫 번째 단계가됩니다.

그 동안 SelectFeature컨트롤에서 사용하는 기능 처리기에서 마우스 이벤트에 액세스 할 수 있습니다 . 따라서 다음과 같은 리스너가있을 수 있습니다.

layer.events.on({featureselected: function(event) {
    // should be event.xy, but it's not available currently
    var pixel = control.handlers.feature.evt.xy;
    var location = map.getLonLatFromPixel(pixel);
    alert("You clicked near " + location);
});

이것은 SelectFeature컨트롤과 맵에 대한 참조가 있다고 가정합니다 .


3

다음을 사용하여 클릭 이벤트의 위도를 얻을 수있었습니다.

clickFeature핸들러 내부

var clickedlonlat = 
    Ext.getCmp("coreRef").parent.map.getLonLatFromPixel(
        new OpenLayers.Pixel(
            selectFeatureReference.handlers.feature.evt.layerX,
            selectFeatureReference.handlers.feature.evt.layerY
        ));

어디에 당신이 만든 selectFeatureReference참조 SelectFeature입니다.


이것은 효과가 있었지만 코드에서 Ext.getCmp ( "coreRef"). parent를 제거해야했습니다
Matthew Lock

3
map.on('click', function(evt){
    console.log(ol.proj.transform(evt.coordinate, 'EPSG:3857', 'EPSG:4326'));
});

이것은
[-1.1645507812500016, 53.2257684357902]
영국을 클릭 할 때 다음과 같은 좌표를 얻기 위해 v3.8.2에서 알아 냈습니다 .


가장 간단하고 쉬운 방법입니다. v5.3에서도 작동하는지 확인할 수 있습니다.
Raidok

0

사용할 수 있습니다 feature.getBounds().getCenterLonLat(). 점 / 선 / 다각형 유형 기능에 사용됩니다. 그리고 그것이 모두 작동하기 때문에 그것이 무엇인지 알 필요가 없습니다.


안녕하세요 Vadim, 거품이 중심이 아닌 거기에 고정 시키려면 클릭 좌표가 필요합니다. , 감사합니다
Vish

0

내가했던 것처럼이 오래된 질문을 우연히 발견 한 경우, 이번 OpenLayers 최신 릴리스 (3.20.0) 에서 Select 이벤트는 e.mapBrowserEvent.coordinate어디 에서 클릭 위치를 얻을 수 있습니다 e.

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