Tcl

Tk

Tcl/Tk

Статьи

Преобразование географических координат в координаты тайла

Единая страна

Преобразование географических координат в координаты тайла

Преобразование географических координат в координаты тайла - doro.poltava.ua

Преобразование географических координат в координаты тайла

Если вы решите разрабатывать приложение с использованием географических карт, предоставляемых некоторыми 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]
}




Главная
Программные продукты
Freesource программные продукты
Статьи
Контакт
GPSMTA - GPS трекер / GPS мониторинг для Android
GPSM - программно-аппаратный комплекс GPS мониторинга
MapTour - GPS навигация для Туристов
MapSurfing - просмотрщик географических карт
DGraf - визуализация графов
ViCer - домашняя система видеонаблюдения
FPS - бесплатная система GPS мониторинга
Jeans - Финансово-складской учёт
Cerber - Финансовый учёт игорного зала
Visimap - Визуальная карта
BIB - Картотека книг
2DO - Учёт рабочего времени
Выписка - склад
Расчёт зарплаты
Krp - визуализатор связанных структур
Xboat - проэктировщик малых судов
XSQLite - visualisator DB SQLite
Текстовый редактор XEdJ
Copyright © Эдуард Зозуля
Проверка PR и ТИЦ