Ортодромия на карте UIMapView Recently i was faced with this issue , I had to map the UIMapView shortest path between two points with the given coordinates. The fact that orthodromy on Mercator looks not like as a straight line . Its looks more like an arc , if both points are in the same hemisphere , and it’s looks like to a sine wave , if the points are in different hemispheres. What you need to understand to build a great circle – is that the latitude and longitude (in fact, the coordinates on the map ) – is the angles values indicated in degrees. The picture shows that the limit values ??of latitude (?) from -90 to 90 degrees and longitude (?) from -180 to 180 . A zero point longitude – is the Greenwich meridian , which passes through Greenwich observatory in London, and latitude , respectively – the equator . Ie the point with coordinates 0, 0 will lie somewhere near the Gulf of Guinea in the North Atlantic Ocean . In general, I read the official manual for MapKit, fumbled on Stackoverflow questions and answers on a similar topic . Revealed himself to the next way to solve the problem :Coordinates system

  1. Рисование на картах MapView производится путем добавления на карту специального слоя Overlay, который содержит в себе необходимую графическую информацию – линии, фигуры или изображения.
  2. Линия в overlay добавляется с помощью следующего метода:

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

    Но прежде чем добавлять self.routLine в self.routLineView мы должны инициализировать линию следующим методом

    Итак, что мы здесь сделали? Вы уже наверное заметили, что мы использовали метод DEGREES_TO_RADIANS, переводя широту и долготу каждой точки из градусов в радианы. Дело в том, что формула, в которой мы вычисляем широту и долготу каждой точки ортодромии использьзует тригонометрические функции, требующие радианы для вычислений. При этом широта и долгота в структуре CLLocationCoordinate хранятся в градусах. NUMBER_OF_POINTS в моем случае была описана константой, содержащей заданное количество точек для построения ортодромии. Чем больше точек, тем плавнее будет ваша кривая ортодромии на проекции Меркатора, тоесть на представлении вашей карты в UIMapView. Обычно берется от 10 до 20 точек. В конце всех вычислений мы получаем массив структур (array of struct) с координатами всех точек ортодромии. Причем обратите внимание, записывая координаты в массив, мы их конвертируем обратно из радиан в градусы с помощью метода RADIANS_TO_DEGREES. Эти два метода вы описываете сами в начале вашего файла имплементации:
  3. В методе viewDidLoad вы сначала вызываете метод createRoutLine, который создаст нам линию self.routLine, затем, если хотите, вы задаете границы видимости для карты с помощью метода setVisibleMapRect, параметром для которого будут границы созданной нами линии self.routLine. Затем добавляем наш оверлэй на карту.

Вот в принципе и все. Если вам нужно чтобы ваша программа высчитывала текущее положение пользователя, то вам нужно будет создать CLLocationManager и с помощью него узнать текущие координаты. Делается это примерно так:

Вроде должно работать =) При условии, что вы не забудете объявить свойство вашего класса для менеджера в заголовочном файле:

PS Кто-то спросит – зачем надо было заморачиваться и вычислять самому точки ортодромии, когда есть общедоступный Google Maps API. Я могу только сказать, что с API еще стоит поразбираться, т.к. оно не такое уж и простое. Ну и метод этот требует постоянного наличия интернета на устройстве, что не всегда возможно.

 

Draw great circle curve on the UIMapViewРисуем ортодромию на карте UIMapView
Метки:            

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

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