Помогите рассчитать X и Y по широте и долготе в iPhone - PullRequest
1 голос
/ 28 июля 2011

Я застрял в каком-то геолокации, используя пользовательскую карту с iPhone.Проблема в том, что у меня есть UIScrollView и UIImageView с изображением пользовательской карты для ярмарки со всеми местоположениями стендов и так далее.Моя самая большая проблема заключается в том, что я собираюсь использовать геолокацию, чтобы найти человека внутри этой карты.Проблема начинается, когда я пытаюсь получить пиксельное местоположение заданной широты и долготы.У меня есть несколько контрольных точек на земле, и даже мне удалось вычислить угол между моей контрольной точкой и текущим местом.Проблема в том, что я не могу соотнести расстояние в пикселях с расстоянием, рассчитанным по координатам геолокации.

Я пытаюсь связать их следующим образом:

Расчет расстояния в пикселяхизвестная точка на моей карте.Расчет расстояния с использованием векторного расчета расстояния для двух опорных точек.Выравнивая два приведенных выше, чтобы найти фактическое расстояние от эталона.

Но у меня нет успеха вообще ...

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

Я не могу использовать наложенное изображение в MKMapKit, потому что мне нужно использовать карту по горизонтали, а на картах Google это же место поворачивается на несколько градусов влево.

ОБНОВЛЕНИЕ:

После этого сайта: http://www.movable -type.co.uk / scripts / latlong.html , я мог рассчитать расстояние, используя формулу Хаверсайна, но, как показано ниже, я узнал, что явычислял угол неправильно.Мне нужно будет найти другой способ вычисления угла.

Ответы [ 3 ]

2 голосов
/ 28 июля 2011

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

Например:

Я предполагаю, что вы знаете лат, лон для нижнего левого и нижнего правого углов. Также предположим, что ваша справедливая карта не находится рядом с полюсами и имеет небольшую площадь.

Выберите систему координат, скажем, в левом нижнем углу с известной широтой и долготой 0,0 пикселей Вызывается lat1, lon2 в следующем псевдокоде

Вычислить вектор 1 от нижнего правого лат2, lon2 до нижнего левого лат1, lon1

Используя простую проекцию xl = lon, yl = lat, затем vector 1 = (lon2 - lon1) i + (lat2-lat1) j

Вычислите вектор 2 из широты и долготы человека, которого вы хотите (latp, lonp) поместить на карту в нижнюю левую точку lat1, lon1

Используйте векторное произведение точек, чтобы получить угол между вектором 1 и 2.

Вычислить расстояние в широте и долготе с помощью равносторонней проекции:

p1 = (lonp - lon1) cos ( 0.5*(latp+lat1) ) (convert lat/lon to radians)
p2 = (latp - lat1)
distance = R * sqrt( p1*p1 + p2*p2)
use R = 6371000 and your distance will be in meters

Теперь масштабируйте это расстояние до масштаба вашей карты

На данный момент у вас есть полярные координаты точки в пиксельном пространстве

теперь вы делаете полярное преобразование в прямоугольное; x = r cos (угол), y = r sin (угол)

r - это масштабированное расстояние (то есть расстояние в пиксельном пространстве), а угол - это угол между векторами 1 и 2 выше

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

0 голосов
/ 28 июля 2011

Я думаю, что вы ищете экранные проекции.

google.maps.Projection object specification

fromLatLngToPoint(latLng:LatLng, point?:Point)

Переводит из цилиндра LatLng в плоскость Point.Этот интерфейс определяет функцию, которая реализует перевод из заданных значений LatLng в мировые координаты на проекции карты.API Карт вызывает этот метод, когда ему нужно отобразить местоположения на экране.Проекционные объекты должны реализовать этот метод.

http://code.google.com/apis/maps/documentation/javascript/reference.html#Projection

РЕДАКТИРОВАТЬ:

MKCoordinateForMapPoint Возвращает широту и долготу, которые соответствуют указанной точке карты.

CLLocationCoordinate2D MKCoordinateForMapPoint(
   MKMapPoint mapPoint
);

MKMapPointForCoordinate Возвращает структуру данных точки карты, соответствующую указанной координате.

MKMapPoint MKMapPointForCoordinate(
   CLLocationCoordinate2D coordinate
);

http://developer.apple.com/library/ios/#documentation/MapKit/Reference/MapKitFunctionsReference/Reference/reference.html#//apple_ref/doc/uid/TP40008209

0 голосов
/ 28 июля 2011

Не уверен, правильно ли я понимаю ... но на небольшом расстоянии вы сможете просто масштабировать координаты широты / долготы до координат y / x ... или вы можете пойти другим путем.

ЧтоЯ хотел бы разобраться / найти координаты широты / долготы углов вашего изображения, а затем масштабировать точки между пикселями в этом диапазоне.Например:

Допустим, верхний левый угол вашего изображения (шириной 101 пикселя) представляет широту / долготу (0,100), а верхний правый (0,100,1).Теперь, если вы хотите разместить точку (0,100,05), вы просто поместите ее посередине - то есть в пиксель (x, y) (51,0).

Я бы также преобразовал все широты / долготы изградус / минута / секунда в десятичные градусы - т.е.150 градусов 30 минут становится 150,5.

...