Làm cách nào để có được tọa độ của một lần nhấp vào tính năng / lớp vectơ trong OpenLayers?


15

Tôi cần lấy tọa độ của nhấp chuột khi người dùng nhấp vào tính năng vectơ trên bản đồ OpenLayers. SelectControl chỉ cung cấp tính năng được nhấp chứ không phải tọa độ của lần nhấp. Dù sao để có được tại tọa độ của nhấp chuột vào một vectơ? Tôi cần hiển thị AnchoredBubble tại điểm nhấp của người dùng.

Câu trả lời:


16

Trên thực tế, mẫu sự kiện click cung cấp cho bạn những gì bạn muốn.

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

        });

Nếu cần, bạn có thể chuyển đổi tọa độ thành pixel để hiển thị cửa sổ bật lên.

Chỉnh sửa - để chỉ tọa độ khi chọn tính năng :

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

Xin chào simo, tôi chỉ cần gọi sự kiện nhấp khi nhấp vào lớp vectơ hoặc tính năng tôi quan tâm. Tôi nghĩ rằng mẫu ở trên chụp và gọi trình xử lý sự kiện nhấp trên toàn bộ bản đồ chứ không chỉ các lớp vectơ. Cảm ơn, Vish
Vish

@Vish: trong trường hợp đó, hãy xem câu trả lời của Tim Schaub và chỉnh sửa của tôi ở trên.
simo

Này simo, 'e' trong phương thức getCoordLS đến từ đâu?
Vish

e là sự kiện . Tôi đã thêm nó vào khai báo của hàm getCoordins (e) . Tôi chắc chắn bạn có thể vượt qua tính năng này, nhưng tôi không chắc về sự kiện này. Làm một bài kiểm tra.
simo

@simo, nó nói rằng onSelect sẽ được gọi với một tính năng, không phải là một sự kiện: dev.openlayers.org/docs/files/OpenLayers/Control/ trộm
Chris

6

API không cung cấp cách lấy vị trí nhấp chuột từ SelectFeatuređiều khiển - nhưng nó nên. Nó sẽ là một bổ sung tầm thường (đã xybao gồm trong featureselectedsự kiện này). Nếu bạn đặt vé này, nó sẽ là bước đầu tiên để thực hiện nó.

Trong thời gian chờ đợi, bạn có thể truy cập sự kiện chuột trên trình xử lý tính năng được sử dụng bởi SelectFeatuređiều khiển. Vì vậy, bạn có thể có một người nghe trông giống như thế này:

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

Điều này giả định (rõ ràng) rằng bạn có một tham chiếu đến SelectFeatuređiều khiển và bản đồ của bạn.


3

Tôi đã có thể nhận được lat lon của sự kiện nhấp bằng cách sau:

Bên trong clickFeaturexử lý

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

nơi selectFeatureReferencelà tham chiếu đến SelectFeaturemà bạn đã tạo.


Điều này đã làm việc, nhưng tôi đã phải xóa Ext.getCmp ("coreRef"). Phụ huynh khỏi mã
Matthew Lock

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

Đây là cách tôi tìm ra nó trong phiên bản 3.2.2 để có được tọa độ như sau:
[-1.1645507812500016, 53.2257684357902]
khi tôi nhấp xung quanh Vương quốc Anh.


Đây là cách đơn giản và dễ dàng nhất. Có thể xác nhận nó cũng hoạt động với v5.3.
Raidok

0

Bạn có thể sử dụng feature.getBounds().getCenterLonLat(). Hoạt động cho các tính năng loại điểm / đường / đa giác. Và bạn không cần phải biết nó là gì, vì nó hoạt động cho tất cả.


Xin chào, tôi cần tọa độ của nhấp chuột vì tôi muốn neo bong bóng của mình ở đó và không phải ở trung tâm. Cảm ơn bạn,
Vish

0

Trong trường hợp tình cờ ai qua câu hỏi cũ này như tôi đã làm, trong phiên bản mới nhất của OpenLayers vào thời điểm này (3.20.0), bạn có thể có được vị trí nhấp vào bằng e.mapBrowserEvent.coordinatenơi elà Chọn sự kiện.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.