Преобразование географических координат в координаты тайла |
||||
Главная | Программные продукты | Freesource программные продукты | Статьи по Tcl/Tk | Статьи | Контакт | Карта сайта | |||
|
Преобразование географических координат в координаты тайлаЕсли вы решите разрабатывать приложение с использованием географических карт, предоставляемых некоторыми WEB-сервисами, Вам потребуются функции преобразования географических координат в номера тайлов. Практически все картографические сервисы отдают карту как набор графических картинок определённого размера. В этой статье я приведу функции прямого и обратного преобразования. Функции написаны не мной, когда-то раздобыл их на просторах инета. Я лишь транслировал их в синтаксис тикла. Функции прямого преобразования: Для Google, OpenStreetMap, и практически всех остальных поставщиков тайлов: # Входные параметры: широта, долгота, уровень proc Geo:LatLon2XY { lat lon z } { set pi 3.1415926535897932 set latrad [expr { $lat*$pi/180.0 }] set lonrad [expr { $lon*$pi/180.0 }] set bm0 [expr { 256 * 2**$z/2 }] set flatX [expr { int($bm0 * (1 + $lonrad/$pi)) }] set flatY [expr { int($bm0 * (1 - 0.5*log((1+sin($latrad))/(1-sin($latrad)))/$pi)) }] set tilesX [expr { int($flatX/256) }] set tilesY [expr { int($flatY/256) }] set picX [expr { $flatX % 256 }] set picY [expr { $flatY % 256 }] # Выходные параметры: # номера тайлов по X и Y # координаты точки в тайле # координаты точки в плоскости проэкции Земли return [list $tilesX $tilesY $picX $picY $flatX $flatY] } Для Yandex: # Входные параметры: широта, долгота, уровень proc Geo:LatLon2XY { lat lon z } { set pi 3.1415926535897932 set latrad [expr { $lat*$pi/180.0 }] set lonrad [expr { $lon*$pi/180.0 }] set a 6378137.0 set k 0.0818191908426 set f [expr { tan($pi / 4 + $latrad / 2)/(tan($pi / 4 + asin($k * sin($latrad)) / 2)) ** $k }] set flatX [expr { int((20037508.342789 + $a * $lonrad) * 53.5865938 / 2 ** (23 - $z)) }] set flatY [expr { int((20037508.342789 - $a * log($f)) * 53.5865938 / 2 ** (23 - $z)) }] set tilesX [expr { int($flatX/256) }] set tilesY [expr { int($flatY/256) }] set picX [expr { $flatX % 256 }] set picY [expr { $flatY % 256 }] # Выходные параметры: # номера тайлов по X и Y # координаты точки в тайле # координаты точки в плоскости проэкции Земли return [list $tilesX $tilesY $picX $picY $flatX $flatY] } Функции обратного преобразования: Для Google, OpenStreetMap, и практически всех остальных поставщиков тайлов: # Входные параметры: номер тайла по X и Y, координаты точки на тайле, уровень proc Geo:XY2LatLon { tilesX tilesY picX picY z } { set e 2.7182818284590452 set pi 3.1415926535897932 set bm0 [expr { 256 * 2**$z/2 }] set flatX [expr { $tilesX * 256 + $picX }] set flatY [expr { $tilesY * 256 + $picY }] set lonrad [expr { $pi * ($flatX - $bm0) / $bm0 }] set c1 [expr { 2 * $pi * ($bm0 - $flatY) / $bm0 }] set latrad [expr { asin(($e**$c1 - 1) / ($e**$c1 + 1)) }] set lat [expr { 180*$latrad/$pi }] set lon [expr { 180*$lonrad/$pi }] # Выходные параметры: широта, долгота return [list $lat $lon] } Для Yandex: # Входные параметры: номер тайла по X и Y, координаты точки на тайле, уровень proc Geo:XY2LatLon { tilesX tilesY picX picY z } { set e 2.7182818284590452 set pi 3.1415926535897932 set a 6378137.0 set c1 0.00335655146887969 set c2 0.00000657187271079536 set c3 0.00000001764564338702 set c4 0.00000000005328478445 set flatX [expr { $tilesX * 256 + $picX }] set flatY [expr { $tilesY * 256 + $picY }] set mercX [expr ($flatX * 2 ** (23 - $z)) / 53.5865938 - 20037508.342789] set mercY [expr { 20037508.342789 - ($flatY * 2 ** (23 - $z)) / 53.5865938 }] set g [expr { $pi/2 - 2 * atan(1.0 / exp($mercY / $a)) }] set f [expr { $g + $c1 * sin(2 * $g) + $c2 * sin(4 * $g) + $c3 * sin(6 * $g) + $c4 * sin(8 * $g) }] set lat [expr { $f * 180.0 / $pi }] set lon [expr { $mercX / $a * 180.0 / $pi }] # Выходные параметры: широта, долгота return [list $lat $lon] } |
|||||||
Copyright © Эдуард Зозуля | ||||||||