Требовать MKPolyline, но код продолжает возвращать MKShape

Я хотел бы получить MKPolyline, но мой код продолжает возвращать MKShape. Я пытаюсь использовать библиотеку GEOSwift, как описано здесь: https://github.com/GEOSwift/GEOSwift

Мой код:

let linestring = Geometry.create("LINESTRING(51.063164 -0.728986, 51.072347 -0.723721, 51.116898 -0.731893)")!
let shapeLine = linestring.mapShape()
self.mapView.add(shapeLine)

Я получаю сообщение об ошибке: Не удается вызвать «добавить» со списком аргументов типа «(MKShape)».

(пусть shapeLine = linestring.mapshape() должен преобразовать его в MKPolyline)

Однако, если я запускаю:

 let linestring = Geometry.create("LINESTRING(51.063164 -0.728986, 51.072347 -0.723721, 51.116898 -0.731893)")!
 let shapeLine = linestring.mapShape()
 dump(shapeLine)

я понимаю это:

- <MKPolyline: 0x60000069e550> #0
  - super: MKMultiPoint
    - super: MKShape
      - super: NSObject

Говорит ли это о том, что там есть полилиния?

Мой оверлейный рендерер:

    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
    let renderer = MKPolylineRenderer(overlay: overlay)
    renderer.strokeColor = UIColor.blue
    renderer.lineWidth = 5.0

    return renderer
}

Кроме того, над этим приложением уже работают другие полилинии. Я установил MKMapViewDelegate, а также установил делегата на себя.

/// Чтобы попытаться избежать проблемы xy - я пытаюсь выполнить поиск по маршруту, поэтому я использую GEOSwift для создания буфера вокруг полилинии, а затем использую его для поиска в базе данных с геозапросом этих точек, ниже приведена конкретная проблема, как описано в названии:///

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

Любая помощь высоко ценится


person Alex A    schedule 17.11.2017    source источник


Ответы (1)


Метод mapShape(), как определено в протоколе [GEOSwiftMapKit][1], возвращает MKShape, который является абстрактным базовым классом для всех объектов наложения MapKit на основе формы.

Реализация этого метода вернет соответствующий подкласс в зависимости от базового типа геометрии, хотя, как я указал выше, сигнатура метода указывает, что он возвращает MKShape, который не соответствует MKOverlay, как ожидается методом add MapKit.MapView.

Все, что вам нужно сделать, это преобразовать shapeLine в MKPolyline.

guard let shapeLine = linestring.mapShape() as? MKPolyline else {
    preconditionFailure()
}
person vfn    schedule 20.11.2017
comment
Спасибо, это сработало отлично. Однако теперь мне нужно создать буфер вокруг полилинии, а затем получить координаты буфера. Это возможно? Я также видел, что у вас есть LinearRing. Это то, что я ищу? - person Alex A; 22.11.2017
comment
я пробовал много методов в вашей библиотеке, но не размещал здесь код, чтобы упростить его. (просто хотел знать, возможно ли то, что я хочу сделать, или я могу потратить очень много времени на попытки) - person Alex A; 22.11.2017
comment
Если это кого-то еще интересует, в дополнение к ответу выше, у меня была проблема с делегированием. Это может быть трудно диагностировать, поскольку он не выдает никаких ошибок. Проблема заключалась в том, что мой оверлей rendererFor не вызывался, поэтому я рекомендую поместить туда оператор печати для проверки. - person Alex A; 22.11.2017
comment
@AlexA относительно добавления буфера, вы должны использовать файл Geometry func buffer(width: Double) -> Geometry?. Как видите, он вернет геометрию, представляющую новую буферизованную форму, а затем вы сможете получить доступ к ее точкам. - person vfn; 30.11.2017
comment
Удалось заставить его работать. Ключевым моментом было преобразование shapeLine в виде MKPolygon, а не полилинии после того, как линия была буферизована. Кроме того, если кто-то следит за этим, буфер отлично работает с линией, нет необходимости использовать LinearRing, пока вы используете его, как описано выше. Надеюсь, это кому-то поможет. Еще раз спасибо за помощь vfn! - person Alex A; 11.12.2017