Tengo una coordenada, y un camino. Necesito encontrar un punto en el camino más cercano a mi coordenada. Algo así como http://turfjs.org/static/docs/module-turf_point-on-line.html pero para iOS. ArcGIS no parece tener esa funcionalidad. O yo no la veo. En el peor de los casos puedo implementar un algoritmo propio. Pero es realmente difícil de envolver la cabeza alrededor de las fórmulas matemáticas.
Respuestas
¿Demasiados anuncios?
user72503
Puntos
1
Es importante tener en cuenta que puedes coger la coordenada más cercana o el vértice más cercano de la ruta del motor de geometría...
No has especificado si usas Swift u Objective-C, pero aquí tienes algunos no probado Código Swift para buscar en una ruta dada la coordenada más cercana a un punto determinado y luego mostrarla como un gráfico:
import UIKit
import ArcGIS
class SomeViewController: UIViewController, AGSMapViewLayerDelegate {
@IBOutlet weak var mapView:AGSMapView!
// some variables you will need, obviously your app will require more...
var point: AGSGraphic!
var routeResult: AGSRouteResult!
var routeGraphicsLayer:AGSGraphicsLayer!
let geometryEngine = AGSGeometryEngine.defaultGeometryEngine()
override func viewDidLoad() {
super.viewDidLoad()
// your app code to generate a point and route...
// MARK: Find closest point on route to your point of interest
// add a graphic for the point, assuming you are working with an AGSRouteResult for your route
self.routeGraphicsLayer = AGSGraphicsLayer()
self.mapView.addMapLayer(routeGraphicsLayer, withName: "Graphics")
// find nearest vertex or coordinate on route to a given point
let closestPoint = self.geometryEngine.nearestCoordinateInGeometry(self.routeResult.routeGraphic.geometry, toPoint:self.point)
// set symbol
let closestMarkerSymbol = AGSSimpleMarkerSymbol()
closestMarkerSymbol.style = .Diamond
closestMarkerSymbol.outline.color = UIColor.blueColor()
// display it, add attribute for distance to route
var attrib: [String:Double] = ["Distance": self.routeResult.distance]
let closestPointGraphic = AGSGraphic(closestPoint, attributes:attrib)
self.closestPointGraphic.symbol = closestMarkerSymbol
self.routeGraphicsLayer.addGraphic(closestPointGraphic)
self.routeGraphicsLayer.visible = true
// do other stuff, maybe add a callout/popup for the point so the user can see distance?
}
}