Broşür: Konteyner koordinatları mı, Katman koordinatları mı?


17

Harita kapsayıcı koordinatları ile katman koordinatları arasındaki fark nedir ?

Topladığımdan, harita kapsayıcı koordinatları her zaman harita görünümüne göreli ve katman koordinatları her zaman kapsayıcı koordinatlarıyla aynı değerlerle başlarken , harita kaydırıldıktan sonra değişir.

Koordinatları / noktayı referans alan API'lar:

Yanıtlar:


21

Kısa cevap

ContainerPoint yöntemleri 2012'deki bir özellik isteğinden başlar ve bugün biraz kafa karıştırıcıdır.

En iyi cevap Leaflet sürdürücü Vladimir Agafonkin'in açıklaması:

"layerPoint aslında dış harita kapsayıcı değil, harita katmanına (fayans ve işaretçileri içeren div) göre bir noktadır. İhtiyacınız olan şey map.layerPointToContainerPoint. Ama bunu hemen almak için uygun bir yöntem olmadığını kabul ediyorum, bu yüzden bunu planlamak sonraki sürüm için. "

Uzun cevap

Daha ayrıntılı olarak:

Nadiren uygulama geliştiricileri tarafından kullanılan her ne kadar broşürü çekirdek halka dönüşüm yöntemleri, vardır L.Map.project(latlng [, zoom])ve L.Map.unproject(point [, zoom]).

Web haritaları, her biri aynı sayıda piksele sahip bir karo ızgarasına bölünür. Daha yüksek yakınlaştırma seviyelerinde, harita karşılık gelen daha fazla sayıda pikselle daha fazla sayıda karoya bölünür. Böylece haritanın piksel boyutu yakınlaştırma düzeyine bağlıdır.

Bu, tarayıcınızda bir Leaflet demo penceresi ile uğraşıyorsanız, belirli bir latlng için L.Map.project` çıktısının yalnızca yakınlaştırma ve uzaklaştırma yaptığınızda değişeceği anlamına gelir.

Leaflet'in (0.7.3) son sürümünden itibaren L.Map.latLngToLayerPointokumaların tanımı :

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

Aksine, şunu L.Map.latLngToContainerPointokur:

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

ile L.Map.layerPointToContainerPointtanımlanmış:

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

Özel harita yöntemi , geçerli harita konumu ile ilk oluşturulduğu konum arasındaki sapma değerini_getMapPanePos() döndürür . Bu yalnızca bir harita kaydırma sırasında değişir (yakınlaştırma sırasında değil), bu nedenle belirli bir latlng'e karşılık gelen layerPoint ve containerPoint arasındaki fark, layerPoint'in harita kapsayıcısındaki haritanın başlangıç ​​konumunda bulunduğu latmanın konumu olmasıdır . containerPoint, harita kapsayıcısındaki latlng'in geçerli konumudur .<div> <div>


1
Adamım - eğer oy verebilseydim, 100 kez oy verirsin.
Saad Malik

0

EDIT: yanlış olduğumu ortaya çıkıyor. Kap koordinatları görünür çerçeve için görünürken, katman koordinatları görünür olandan daha büyük bir alan içindir. Bu sorunun cevap verebilmesi için benden daha bilgili birine ihtiyacı var.


1
Alex - Bunun doğru olduğuna inanmıyorum. Kap koordinatları ve katman koordinatlarının her ikisi de, kabın başlangıç ​​noktasından (sol üst) piksel olarak belirtilir. Ancak, haritayı kaydırmaya başladığımda, bir işaretçinin katman koordinatı / noktası aynı kalırken, bir işaretçinin harita koordinatı / noktası sol üst başlangıç ​​noktasına göre güncellenir.
Saad Malik

Merhaba @ SimFox3, haklısın. Ve bir şey söylemeden önce test etmeliydim! Artık katman noktasının, tutulan bir tür 'pencere'ye göre tanımlanan, ekrandan daha büyük bir koordinat olduğu bir şey. Bu, ekrandan daha biyokütle olan önbelleğe alınmış bir görünüm gibi. Bu nedenle katman noktası koordinatları değişmez, ancak sık sık değişmez ve yalnızca 'pencere' hareket ettirildiğinde. Kapsayıcı nokta koordinatları her zaman görünür görünüme göre koordinatlarla sınırlı görünmektedir. Tüm bunları söyledikten sonra, senden daha fazlasını bilmediğim açıktır, bu yüzden bir Leaflet dev. çip olabilir!
Alex Leith
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.