哪个库允许在地图视图上管理多边形?

时间:2018-01-16 11:52:50

标签: ios cocoapods

是否有任何图书馆(cocoapod最好)在地图视图上创建多边形?

不是来自用户视图的代码。

作为用户,我可以:

  • 开始创建多边形
  • 移动点
  • 删除积分
  • 添加其他积分

这就是我所需要的一切。

1 个答案:

答案 0 :(得分:1)

根据评论,即使找到这样的工具也不会与您使用本机组件的快捷方式相提并论。从UX角度来看,您的问题可能更有趣。您需要从这个角度提供您的要求,但让我们假设一些:

  1. 用户可以正常使用地图,就像没有添加注释一样。
  2. 用户可以在地图上添加多边形。
  3. 可能有任意数量的多边形。
  4. 每个多边形可以包含任意数量的点。
  5. 现在让我们将自己定位到用户视角,其中用户有4个多边形,每个多边形有N个点,并且他想在之前创建的第二个多边形中添加另一个点。他是怎么做到的?我们需要确定添加一个点会影响该特定多边形,而不是最后一个或新的...

    让我们想象另一种情况,即用户创建了两个相交的多边形,一个多边形绘制在另一个上。用户可以更改那些的顺序,以便另一个位于底部吗?如果答案是"是"那么我们必须从一个多边形列表开始。可能是我们使用点达到相同的情况,因此每个多边形都有一个点列表...

    在某些时候,您可能能够删除所有列表(可视化)并用手势识别器或其他任何内容替换它们,但是在构建您的这些内容时,从代码角度来看没有任何区别。我建议你的数据结构如下:

    class Polygon {
        class Point {
            var location: CLLocationCoordinate
            init(location: CLLocationCoordinate) { self.location = location }
        }
    
        var points: [Point] = []
    }
    

    然后你的系统只包含一个数组:

    private var polygons: [Polygon] = []
    

    然后你需要一些手势识别器和状态,所以你有一个方法,如:

    private func handleGestureRecognizerEvent(recognizer: UIGestureRecognizer, forState state: State) {
        switch state {
        case .idle:
            if let closest = findPolygonCloseTo(recognizer.location(in: mapView)) {
                self.state = .selectedPolygon(polygon: closest)
            } else {
                // Nothing to do here
            }
        case .selectedPolygon(let polygon):
            if let closest = findPointCloseTo(recognizer.location(in: mapView), belongingTo: polygon) {
                self.state = .selectedPoint(point: closest, inPolygon: polygon) // Selected a point within current polygon
            } else if let closest = findPolygonCloseTo(recognizer.location(in: mapView)) {
                self.state = .selectedPolygon(polygon: closest) // Selected another polygon
            } else {
                self.state = .idle // Selected nothing so go back to idle
            }
        case .selectedPoint(let point, let polygon):
            switch gesture.state {
            case .begin: // TODO: same as selected polygon but revert to selected polygon instead of idle
            case .moved: point.location = self.coordinateForPoint(recognizer.location(in: mapView))
            // TODO: add other scenarios if needed
            }
        }
    }
    

    从这个角度来看,您只需要找到points.append(MKMapView().convert(gesure.location(in: mapView), toCoordinateFrom: mapView))点的坐标。你需要找到点是否在已经exists natively的多边形内。

    然后在添加点上,您只需要在选定的多边形中添加它(或者如果没有选择,则创建一个新的多边形)。在删除时,您需要选择一个点...

    我希望这会让你走上正轨......

相关问题