【问题标题】:Require MKPolyline but code keeps returning MKShape需要 MKPolyline 但代码不断返回 MKShape
【发布时间】:2017-11-17 02:59:33
【问题描述】:

我想检索 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 并将委托设置为 self。

///为了尝试避免 xy 问题 - 我试图沿着路线搜索,所以我使用 GEOSwift 在折线周围创建缓冲区,然后使用它来搜索具有这些点的地理查询的数据库,下面是具体的标题中描述的问题:///

我确定这个错误很简单,但是我看相同的代码太久了,我就是看不到它。

非常感谢任何帮助

【问题讨论】:

    标签: swift3 mkpolyline geoswift


    【解决方案1】:

    [GEOSwiftMapKit][1] 协议中定义的方法mapShape() 返回一个MKShape,它是所有基于形状的 MapKit 覆盖对象的抽象基类。

    该方法的实现将返回适当的子类,具体取决于基础几何类型,尽管正如我在上面指出的,该方法的签名表明它返回的 MKShape 不符合 MKOverlay 的预期@ 987654326@的add方法。

    您需要做的就是将shapeLine 转换为MKPolyline

    guard let shapeLine = linestring.mapShape() as? MKPolyline else {
        preconditionFailure()
    }
    

    【讨论】:

    • 谢谢,效果很好。但是我现在需要在折线周围创建一个缓冲区,然后检索缓冲区的坐标。这可能吗?我还看到你有一个 LinearRing。这就是我要找的吗?
    • 我尝试了您库中的很多方法,但没有在此处发布代码以保持简单。 (只是想知道我想做的事情是否可能,或者我可以花很长时间尝试)
    • 如果其他人感兴趣,除了上面的答案,我还有一个代表问题。这可能很难诊断,因为它不会引发任何错误。问题是我的 rendererFor 覆盖没有被调用,所以我建议在其中放置一个打印语句进行检查。
    • @AlexA 关于添加缓冲区,您应该使用几何的func buffer(width: Double) -&gt; Geometry?。如您所见,它将返回一个代表新缓冲形状的几何图形,然后您可以访问它的点
    • 设法让它工作。关键是将 shapeLine 转换为 MKPolygon,而不是在缓冲线之后的折线。此外,如果有人跟随,缓冲区可以完美地在线串上工作,只要您按照上述方式进行转换,就无需使用 LinearRing。希望这对某人有帮助。再次感谢 vfn 的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    • 1970-01-01
    • 2011-02-16
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多