Bagaimana cara mendapatkan koordinat klik pada fitur vektor / lapisan di OpenLayers?

15

Saya perlu mendapatkan koordinat klik ketika pengguna mengklik fitur vektor pada peta OpenLayers. SelectControl hanya memberikan fitur yang diklik dan bukan koordinat klik. Pokoknya untuk mendapatkan koordinat klik pada vektor? Saya perlu menunjukkan AnchoredBubble pada titik klik pengguna.

Vish
sumber

Jawaban:

16

Sebenarnya, sampel acara klik memberi Anda apa yang Anda inginkan.

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

        });

Jika perlu Anda dapat mengonversi koordinat ke piksel untuk menampilkan sembulan.

Edit - untuk mendapatkan koordinat hanya pada fitur pemilihan :

   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
sumber
Halo, saya perlu event klik untuk dipanggil hanya ketika mengklik pada layer vektor atau fitur yang saya tertarik. Saya pikir sampel di atas menangkap dan memanggil event click handler pada seluruh peta dan bukan hanya layer vektor. Terima kasih, Vish
Vish
@Vish: dalam hal ini, lihat jawaban Tim Schaub dan hasil edit saya di atas.
Simo
Hai simo, dari mana 'e' dalam metode getCoordinates berasal?
Vish
e adalah acara tersebut . Saya menambahkannya ke deklarasi fungsi getCoordinates (e) . Saya yakin Anda dapat melewati fitur ini, tetapi saya tidak yakin tentang acara tersebut. Lakukan tes.
simo
@simo, dikatakan bahwa onSelect harus diharapkan dipanggil dengan fitur, bukan acara: dev.openlayers.org/docs/files/OpenLayers/Control/…
Chris
6

API tidak menyediakan cara untuk mendapatkan lokasi klik dari SelectFeaturekontrol - tetapi seharusnya. Itu akan menjadi tambahan sepele (untuk xydimasukkan dalam featureselectedacara). Jika Anda memberi tiket ini, itu akan menjadi langkah pertama untuk mewujudkannya.

Sementara itu, Anda dapat mengakses acara mouse pada penangan fitur yang digunakan oleh SelectFeaturekontrol. Jadi, Anda mungkin memiliki pendengar yang terlihat seperti ini:

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

Ini mengasumsikan (jelas) bahwa Anda memiliki referensi ke SelectFeaturekontrol dan peta Anda.

Tim Schaub
sumber
3

Saya bisa mendapatkan lat lon acara klik menggunakan yang berikut:

Di dalam clickFeaturepawang

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

di mana selectFeatureReferencereferensi ke SelectFeatureyang Anda buat.

Chris
sumber
Ini berhasil, tetapi saya harus menghapus Ext.getCmp ("coreRef"). Induk dari kode
Matthew Lock
3
map.on('click', function(evt){
    console.log(ol.proj.transform(evt.coordinate, 'EPSG:3857', 'EPSG:4326'));
});

Ini adalah bagaimana saya menemukan jawabannya di v3.8.2 untuk mendapatkan koordinat seperti berikut:
[-1.1645507812500016, 53.2257684357902]
ketika saya mengklik di Inggris.

khandaniel
sumber
Ini adalah cara termudah dan termudah. Dapat mengonfirmasinya juga berfungsi dengan v5.3.
Raidok
0

Anda bisa menggunakannya feature.getBounds().getCenterLonLat(). Bekerja untuk fitur tipe titik / garis / poligon. Dan Anda tidak perlu tahu apa itu, karena itu bekerja untuk semua.

Vadim
sumber
Halo Vadim, saya perlu koordinat klik karena saya ingin meletakkan gelembung saya di sana dan bukan di tengah. Terima kasih,
Vish
0

Jika ada orang yang menemukan pertanyaan lama ini seperti yang saya lakukan, dalam rilis terbaru OpenLayers saat ini (3.20.0) Anda bisa mendapatkan posisi yang diklik menggunakan di e.mapBrowserEvent.coordinatemana eadalah acara Select.

Adam Franco
sumber