是否有任何图书馆(cocoapod最好)在地图视图上创建多边形?
不是来自用户视图的代码。
作为用户,我可以:
这就是我所需要的一切。
答案 0 :(得分:1)
根据评论,即使找到这样的工具也不会与您使用本机组件的快捷方式相提并论。从UX角度来看,您的问题可能更有趣。您需要从这个角度提供您的要求,但让我们假设一些:
现在让我们将自己定位到用户视角,其中用户有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的多边形内。
然后在添加点上,您只需要在选定的多边形中添加它(或者如果没有选择,则创建一个新的多边形)。在删除时,您需要选择一个点...
我希望这会让你走上正轨......