Leaflet: Koordinat kontainer vs Koordinat layer?

17

Apa perbedaan antara koordinat wadah peta dan koordinat lapisan ?

Dari apa yang saya kumpulkan, koordinat wadah peta selalu relatif terhadap viewport peta, dan sementara koordinat lapisan selalu dimulai dengan nilai yang sama dengan koordinat wadah , mereka berubah setelah peta digeser.

API yang merujuk ke koordinat / titik:

Saad Malik
sumber

Jawaban:

21

Jawaban singkat

Metode metode containerPoint berasal dari permintaan fitur pada tahun 2012 , dan hari ini, mereka agak membingungkan.

Jawaban terbaik adalah deskripsi pengelola Leaflet, Vladimir Agafonkin:

"layerPoint sebenarnya adalah titik relatif terhadap lapisan peta (div yang berisi petak dan marker), bukan wadah peta luar. Yang Anda butuhkan adalah map.layerPointToContainerPoint. Tapi saya setuju tidak ada metode yang mudah untuk segera mendapatkannya, jadi jadwalkan ini untuk versi selanjutnya. "

Jawaban panjang

Lebih detail:

Metode konversi publik inti di Leaflet, meskipun jarang digunakan oleh pengembang aplikasi, adalah L.Map.project(latlng [, zoom])dan L.Map.unproject(point [, zoom]).

Peta web dibagi menjadi beberapa kotak ubin, masing-masing dengan jumlah piksel yang sama. Pada tingkat zoom yang lebih tinggi, peta dibagi menjadi jumlah ubin yang lebih besar, dengan jumlah piksel yang lebih besar. Dengan demikian ukuran piksel peta tergantung pada tingkat pembesaran.

Ini berarti bahwa jika Anda bermain-main dengan jendela demo Leaflet di browser Anda, output dari L.Map.project` untuk latlng yang diberikan hanya akan berubah jika Anda memperbesar dan memperkecil.

Pada versi terbaru Leaflet (0.7.3), definisi L.Map.latLngToLayerPointbacaan:

latLngToLayerPoint: function (latlng) {
    var projectedPoint = this.project(L.latLng(latlng))._round();
    return projectedPoint._subtract(this.getPixelOrigin());
}

Sebaliknya, L.Map.latLngToContainerPointberbunyi:

latLngToContainerPoint: function (latlng) {
    return this.layerPointToContainerPoint(this.latLngToLayerPoint(L.latLng(latlng)));
}

dengan L.Map.layerPointToContainerPointdidefinisikan sebagai:

layerPointToContainerPoint: function (point) { 
    return L.point(point).add(this._getMapPanePos());
}

Metode peta pribadi _getMapPanePos()mengembalikan offset antara posisi peta saat ini dan posisinya saat pertama kali dibuat. Ini hanya berubah selama panel peta (bukan saat zoom), jadi perbedaan antara layerPoint dan containerPoint yang terkait dengan latlng yang diberikan adalah bahwa layerPoint adalah posisi latlng dalam wadah peta <div> dengan peta di posisi awalnya , sedangkan containerPoint adalah posisi latlng saat ini dalam wadah peta <div>.

Justin Manley
sumber
1
Sobat - jika saya bisa mendapatkan suara positif, Anda akan di-upgrade 100 kali.
Saad Malik
0

EDIT: ternyata saya salah. Koordinat kontainer tampaknya untuk bingkai yang terlihat sementara koordinat lapisan untuk area yang lebih besar daripada yang terlihat. Pertanyaan ini membutuhkan seseorang yang lebih berpengetahuan daripada saya untuk menjawabnya.

Alex Leith
sumber
1
Alex - Saya tidak percaya itu benar. Koordinat wadah dan koordinat lapisan keduanya ditentukan dalam piksel dari asal (kiri-atas) wadah. Namun, ketika saya mulai menggeser peta, layer koordinat / titik dari marker tetap sama sedangkan koordinat peta / titik untuk marker diperbarui masing-masing ke titik asal kiri-atas.
Saad Malik
Hai @ SimFox3, Anda benar. Dan saya harus mengujinya sebelum mengatakan sesuatu! Saya sekarang hal bahwa titik lapisan adalah koordinat yang didefinisikan relatif terhadap semacam 'jendela' yang diadakan, yang lebih besar dari layar. Ini seperti tampilan cache yang biogger dari layar. Karena itulah koordinat titik layer berubah, tetapi tidak sering, dan hanya ketika 'jendela' dipindahkan. Koordinat titik kontainer tampaknya selalu terbatas pada koordinat relatif terhadap tampilan yang terlihat. Setelah mengatakan semua itu, jelas aku tidak tahu apa-apa selain dirimu, jadi alangkah baiknya jika seorang Leaflet dev. bisa masuk!
Alex Leith