Как преобразовать координаты в широту и долготу? - PullRequest
7 голосов
/ 04 марта 2009

Я занимаюсь разработкой приложения для визуализации транспорта. Мне нужно выяснить широту происхождения их подачи данных. В частности, что XY 0,0. Единственные формулы, которые я нашел, рассчитывают расстояние между двумя точками или местоположение направления / расстояния.

Они используют XY для отображения карты в очень унаследованном приложении. XY в футах.

У меня есть эти координаты:

47.70446615506108, -122.34469839507263: x=1268314, y=260622
47.774182540800616,-122.3412994737105:  x=1269649, y=286031
47.60024792289405, -122.32767331735774: x=1271767, y=222532
47.57012494413499, -122.29129609983679: x=1280532, y=211374

Мне нужно выяснить, что такое широта и долгота x=0, y=0 и какова формула, чтобы это выяснить.

У них есть две ленты данных, одна из которых более актуальна, чем другая. Лента с самыми последними данными НЕ включает широту, долготу, а только XY. Я пытаюсь экстраполировать на основе их менее текущей, но более информативной (включая широту, долготу) подачи данных, которая равна 0,0, чтобы я мог просто преобразовать координаты XY их (более текущей) подачи данных в широту и долготу.

Ответы [ 6 ]

9 голосов
/ 04 марта 2009

Если вы посмотрите на первые 2 строки данных и вычтите широту

47.7044 - 47.7741 = -0.06972 degrees

Есть 60 морских миль на градус широты и 6076 футов на морскую милю.

-.06972 * 60 * 6076 = 25,415 ft

Вычитание двух значений Y:

260662 - 286031 = 25,409 ft

Так что это действительно доказывает, что значения X и Y указаны в футах.

Если вы берете любое из значений Y и конвертируете обратно в градусы, например

260622 ft / ( 6076 ft/nm ) / ( 60 nm/degree ) = .71
286031 ft / 6076 / 60 = .78

Таким образом, вычитая эти значения из широт (47,70 и 47,77), вы получите очень близко к точному 47 градусам, что должно быть вашей точкой y = 0.

Для долготы градус составляет 60 морских миль на экваторе и 0 миль на полюсах. Таким образом, число миль на градус должно быть умножено на косинус широты, то есть приблизительно cos (47 градусов) или 0,68. Таким образом, вместо 6076 нм на градус, это около 4145 нм.

Так что для значений X,

1268314 ft / ( 4145 ft/nm ) / ( 60 nm/degree ) = 5.10 degrees
1269649 ft / 4145 / 60 = 5.10 degrees

Эти числа X увеличиваются с увеличением широты (менее отрицательно), поэтому я считаю, что вы должны добавить 5,1 градуса, что означает, что базовая точка X составляет примерно

-122.3 + 5.1 = 117.2 West longitude for your x=0 point.

Это примерно позиция Спокана В.А.

Итак, учитывая X = 1280532, Y = 211374

Lat = 47 + ( 211374 / 6096 / 60 ) = 47.58
Lon = -117.2 - ( 1280532 / ( 6096 * cos(47.58)) / 60 ) = -122.35

Что примерно соответствует приведенным данным 47,57 и -122,29

Дисперсия может быть связана с разными проекциями - система X, Y может быть «сплющенной» проекцией, в отличие от широты / долготы, которые применяются к сферической проекции? Поэтому, чтобы быть точным, вам может понадобиться более сложная математика или библиотека с открытым исходным кодом:)

Этот вопрос также может быть полезен, он содержит код для расчета расстояний большого круга:

Рассчитать расстояние между двумя точками широты и долготы? (Формула Haversine)

6 голосов
/ 04 марта 2009

Существует много разных систем координат. Вам необходимо выяснить, что такое системы координат как для широты / долготы (например, WGS84 и т. Д.), Так и для первой оси (например, какая-то проекционная система, вероятно).

Как только вы получите эту информацию, вы можете использовать несколько инструментов для выполнения преобразований и манипуляций. Одним из примеров (бесплатной библиотеки кодирования с открытым исходным кодом) является proj4 .

5 голосов
/ 04 марта 2009

Спросите их, какую систему координат они используют! (или если вы получили набор данных из какой-либо базы данных, посмотрите на метаданные для набора данных, и он должен сказать вам. В противном случае я скептически отношусь к его значению)

Скорее всего, это одна из систем координат плоскости состояния . Они предназначены для локализованных областей Земли (вроде UTM ) и часто используются для съемки.

Вы можете использовать CORPSCON (или другие ГИС-программы; ExpertGPS сделает это, если у вас есть GIS Option Pack, но он не бесплатный. * выполняет преобразование) для преобразования между широтой / долготой и любой из систем координат плоскости состояния. Вам также необходимо знать, в каких датум координаты находятся. WGS84 и NAD83 очень близки, но NAD27 отличается.

1 голос
/ 25 июня 2009

У вас уже есть хороший совет по системам координат, так что я просто познакомлюсь с библиотекой, которую я использовал с большим успехом в прошлом.

Geotrans одобрен для использования Министерством обороны США, поэтому вы можете быть уверены, что он хорошо протестирован. Вы можете взять его отсюда:

http://earth-info.nga.mil/GandG/geotrans/index.html

Возможно, это неправильная ссылка, поскольку на этой странице говорится о приложении, а не о библиотеке. Я ожидаю, что библиотека находится в пакете для разработчиков. Условия лицензирования были очень либеральными по памяти, но обязательно ознакомьтесь с ними, прежде чем использовать их в коммерческих целях.

Edit:

Интересное обсуждение о лицензировании Geotrans можно найти здесь:

http://www.mail-archive.com/debian-legal@lists.debian.org/msg39263.html
0 голосов
/ 16 апреля 2009

Я использовал PHP-класс Бренора Брофи gPoint , чтобы сделать это пару раз. Хорошие результаты, код GPL и простота развертывания. Рекомендуется.

0 голосов
/ 16 апреля 2009

Здесь я сказал это:

В Java я бы использовал OpenMap конвертер из выражения точки в UTM в выражение, использующее широту и долготу (предполагая эллипсоид WGS-84, который чаще всего используется в GPS).

OpenMap с открытым исходным кодом, и я бы опубликовал ссылку на их страницу загрузки, но у них есть короткий лицензионный скрипт. Таким образом, чтобы не быть грубым, я не буду глубоко связывать. Вместо этого перейдите на их домашнюю страницу и нажмите Загрузки .

Это должно либо решить вашу проблему напрямую, либо, по крайней мере, указать вам на полезный алгоритм.

...