Chcemy wyświetlić kilka znaczników na mapie statycznej i chcemy obliczyć optymalny poziom powiększenia, tak jak robi to Google Maps. Obliczyliśmy już prostokąt obwiedni i punkt środkowy mapy, ale teraz mamy trudności z obliczeniem prawidłowego poziomu powiększenia, aby wyświetlić cały prostokąt obwiedni. Czy ktoś może skierować nas w dobrym kierunku?
google-maps
openstreetmap
tiles
extents
Tobias Schwarz
źródło
źródło
Odpowiedzi:
Aby uzyskać poziom powiększenia, musisz znać wymiary w pikselach mapy. Musisz także wykonać matematykę w sferycznych współrzędnych merkatora.
źródło
Oto kod C #, którego używam w Maperitive :
mapArea
: obwiednia w długich / długich współrzędnych (x = długi, y = lat)paddingFactor
: można tego użyć, aby uzyskać efekt „120%”, o którym mówi ThomM. Wartość 1,2 da ci 120%.Zauważ, że w moim przypadku
zoom
może być liczbą rzeczywistą. W przypadku map internetowych potrzebna jest całkowita wartość powiększenia, więc powinieneś użyć czegoś takiego jak(int)Math.Floor(zoom)
to.Oczywiście ten kod dotyczy tylko projekcji Web Mercator.
źródło
GeometryUtils
służy tutaj do konwersji stopni na radiany i odwrotnie, jest to prosta formuła matematyczna.Bounds2
jest po prostu strukturą prostokąta. Ten kod został dostarczony bardziej jako pseudokod niż coś, co można bezpośrednio skopiować.Jeśli używasz OpenLayers
Map.getZoomForExtent
, obliczy najwyższy poziom powiększenia, który może zmieścić się w całym zakresie na mapie. Żeextent
musi być w projekcji mapy. Możesz także użyć a,fill_factor
aby uniknąć wyświetlania punktów na krawędzi mapy imax_zoom
ograniczyć możliwy zoom:źródło