|
![]() |
Преобразование географических координат в координаты тайла |
![]() |
|
| Главная | Программные продукты | 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 © Эдуард Зозуля | ||||||||
|
|
||||||||