Полилиния не соединяется с первой точкой - PullRequest
1 голос
/ 22 января 2020

Я объявляю точку следующим образом:

makeAnnotation(givenTitle: "Start", pointCoords: userCoords)
turnLocations.append(userCoords)
let region = MKCoordinateRegion(center: userCoords, latitudinalMeters: 100, longitudinalMeters: 100)
mapView.setRegion(region, animated: true) 

userCoords устанавливается правильно, и заголовок «Пуск» отображается на карте без визуального вывода для аннотации, хотя и увеличивает ее масштаб. правильно с регионом. Когда я вычисляю расстояние между этим «Стартом» и другими моими аннотациями и складываю их вместе, он работает правильно и даже восстанавливает начальный маршрут. Однако, когда я делаю ломаную линию следующим образом: (и отрисовываю ее правильно)

let polyline = MKPolyline(coordinates: turnLocations, count: turnLocations.count) //makes polyLine w/ coords given
mapView.addOverlay(polyline)

Она только делает ломаную линию между каждой другой точкой в ​​массиве turnLocations или соединяет ее странным образом (это должно соединиться повернуть1)

https://imgur.com/a/kP3wbWc

Редактировать: Поскольку меня спросили, вот как добавляются другие координаты в очереди:

let coords = mapView.convert(tapLocation,toCoordinateFrom: mapView)
print("Tapped at lat: \(coords.latitude) long: \(coords.longitude)")
makeAnnotation(givenTitle: "Turn\(annotations.count)", pointCoords: coords)
turnLocations.append(coords)

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

var turnLocations: [CLLocationCoordinate2D] = []

И очищается с помощью

turnLocations = []

Всякий раз, когда пользователь сбрасывает координаты в приложении (со сбросом кнопка) Кнопка запуска добавляется всякий раз, когда нет аннотаций

if(turnLocations.count < 1){ //if start isn't there already, it creates it
makeAnnotation(givenTitle: "Start", pointCoords: userCoords)
turnLocations.append(userCoords)
let region = MKCoordinateRegion(center: userCoords, latitudinalMeters: 100, longitudinalMeters: 100)
mapView.setRegion(region, animated: true)
}

, и userCoords определяется с этим после обновления userLocation (с помощью встроенного метода диспетчера местоположений)

userCoords = mapView.userLocation.coordinate

1 Ответ

0 голосов
/ 23 января 2020

Вы сказали:

напечатанные местоположения были [__C.CLLocationCoordinate2D(latitude: 0.0, longitude: 0.0), __C.CLLocationCoordinate2D(latitude: -1.197754045278998e-06, longitude: -0.00022158450201459345), __C.CLLocationCoordinate2D(latitude: 0.00030902054875525664, longitude: -0.0002335620426663354), __C.CLLocationCoordinate2D(latitude: 0.00019164065039944944, longitude: 0.00014013722557137953)]

Полилиния только запуталась из-за того, что первая точка данных на широте и долготе 0, 0 .

Рассмотрим:

let coordinates = [
    CLLocationCoordinate2D(latitude: 0, longitude: 0),
    CLLocationCoordinate2D(latitude: -1.197754045278998e-06, longitude: -0.00022158450201459345),
    CLLocationCoordinate2D(latitude: 0.00030902054875525664, longitude: -0.0002335620426663354),
    CLLocationCoordinate2D(latitude: 0.00019164065039944944, longitude: 0.00014013722557137953)
]

let polyline = MKPolyline(coordinates: coordinates, count: coordinates.count)
mapView.addOverlay(polyline)
mapView.setVisibleMapRect(polyline.boundingMapRect, animated: true)

Это дает:

enter image description here

Если вы замените этот первый на что-то иначе, например, CLLocationCoordinate2D(latitude: 0.0000001, longitude: 0.0000001), тогда он работает нормально:

enter image description here

Ясно, что MKPolylineRenderer просто смущает 0, 0 координаты. Но если вы используете практические, реальные мировые координаты, которые, вероятно, будут у конечного пользователя, то это работает нормально.

Честно говоря, ни одна из этих точек данных не выглядит совершенно правильной. Обычно вы бы имели значения express широты и долготы в значениях от -180 до 180, но сами они в районе нуля в океане у побережья Африки.

Итак, если вас беспокоит то, что представление карты не обрабатывает сценарий вырожденного 0, 0 правильно, не стесняйтесь опубликовать отчет об ошибке . Если вы думаете, что вы встретите 0, 0 и связанный сценарий ios в своем приложении, я бы посоветовал вам добавить тест для значений 0 широты и / или долготы и обрабатывать их соответственно (например, использовать крошечный, не нулевое значение).

...