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");
}

こんにちは、私は興味のあるベクターレイヤーまたはフィーチャをクリックしたときにのみクリックイベントを呼び出す必要があります。上記のサンプルはベクターレイヤーだけでなく、マップ全体でクリックイベントハンドラーをキャプチャして呼び出すと思います。ありがとう、ヴィッシュ
ヴィッシュ

@Vish:その場合、ティム・シャウブの答えと上記の私の編集を参照してください。
シモ

ねえ、simo、getCoordinatesメソッドの「e」はどこから来るのですか?
ヴィッシュ

eがあるイベント。関数getCoordinates(e)の宣言に追加しました。機能を渡すことができると確信していますが、イベントについてはわかりません。テストを行います。
シモ

@ simo、onSelectはイベントではなく機能で呼び出されることを想定していると言います:dev.openlayers.org/docs/files/OpenLayers/Control/…–
クリス

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'));
});

これは、次のような座標を取得するためにv3.8.2でどのように計算したかです。UK
[-1.1645507812500016, 53.2257684357902]
をクリックしたとき。


これが最も簡単で簡単な方法です。v5.3でも動作することを確認できます。
Raidok

0

を使用できますfeature.getBounds().getCenterLonLat()。ポイント/ライン/ポリゴンタイプの機能に使用できます。そして、あなたはそれがすべてのために働くので、それが何であるかを知る必要はありません。


こんにちは、Vadim、クリックの座標が必要です。中央ではなく、そこにバブルを固定したいからです。ありがとう、
Vish

0

私はこの時間(3.20.0)でOpenLayersを最新のリリースでは、行ったように、この古い質問にわたる場合の誰もつまずくでは、使用してクリックした位置を取得することができます 選択したイベントです。e.mapBrowserEvent.coordinatee

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.