ฉันจะรับพิกัดของการคลิกที่คุณสมบัติ / เลเยอร์เวกเตอร์ใน 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
Vish

@Vish: ในกรณีนี้ดูคำตอบของ Tim Schaub และการแก้ไขของฉันด้านบน
simo

สวัสดี simo, 'e' ในเมธอด getCoordinates มาจากไหน?
Vish

E เป็นเหตุการณ์ ผมเพิ่มไปยังประกาศของฟังก์ชันgetCoordinates (จ) ฉันแน่ใจว่าคุณสามารถส่งผ่านคุณสมบัติ แต่ฉันไม่แน่ใจเกี่ยวกับเหตุการณ์ ทำการทดสอบ
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

ฉันสามารถรับ lat lat ของเหตุการณ์คลิกโดยใช้สิ่งต่อไปนี้:

ภายใน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") ออกจากโค้ด
Matthew Lock

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

นี่คือวิธีที่ฉันคิดใน v3.8.2 เพื่อให้ได้พิกัดดังนี้:
[-1.1645507812500016, 53.2257684357902]
เมื่อฉันคลิกไปที่สหราชอาณาจักร


นี่เป็นวิธีที่ง่ายที่สุดและง่ายที่สุด สามารถยืนยันได้ว่าใช้งานได้กับ v5.3
Raidok

0

feature.getBounds().getCenterLonLat()คุณสามารถใช้ ใช้งานได้กับคุณสมบัติประเภทจุด / บรรทัด / รูปหลายเหลี่ยม และคุณไม่ต้องรู้ว่ามันคืออะไรเพราะมันใช้ได้กับทุกคน


สวัสดี Vadim ฉันต้องการพิกัดคลิกเนื่องจากฉันต้องการยึดฟองไว้ที่นั่นไม่ใช่ตรงกลาง ขอขอบคุณ
Vish

0

ในกรณีที่ทุกคนสะดุดคำถามเก่านี้เหมือนที่ฉันทำใน OpenLayers รุ่นล่าสุดในเวลานี้ (3.20.0) คุณสามารถรับตำแหน่งe.mapBrowserEvent.coordinateที่eถูกคลิกโดยใช้ ซึ่งเป็นเหตุการณ์ที่เลือก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.