4 votos

Mapa de ubicación de punto desconocido con distancias a dos puntos conocidos

Estoy tratando de desarrollar una función en R que se busque un punto (A) en un mapa dado distancias entre el punto a y otros dos puntos (B y C), para lo cual coordenadas exactas son conocidos. El problema que estoy subiendo en contra es que mi enfoque es sensible a la forma del triángulo, y por lo tanto el número de condiciones en mi algoritmo es más de lo que yo creo que necesita ser, probablemente porque mi medio de la escuela de matemáticas no son lo bastante buenas, así que estoy buscando a alguien a ser muy condescendiente, me dicen que tonta soy, y que me ayudan a un enfoque general de este problema.

Por ejemplo, estoy en busca de un único algoritmo que puede colocar el punto a en el conjunto de estas circunstancias:

  1. (x,y): B(1, 2); C(4,1), las distancias: a B = 6, C = 2
  2. (x,y): B(1,1); C(4,2), las distancias: a B = 2, C = 3
  3. (x,y): B(1,1); C(4,1), las distancias: a B = 2, C = 6

Para el registro, estoy consciente de que hay dos posibles puntos en el espacio que satisfacer estas suposiciones. Estoy feliz de tener ambos.

Por último, voy a señalar que si bien esto suena como tarea, es en realidad la investigación ecológica, aunque a cabo por alguien que al parecer underqualified estar haciendo.

2voto

Denis Kash Puntos 16

El gIntersection función de la rgeos biblioteca podría ayudar. Ver el código comentado a continuación.

library(sp)  
library(rgeos)

pointB <- SpatialPoints(cbind(1,1))
pointC <- SpatialPoints(cbind(4,2))
distanceA2B <- 2
distanceA2C <- 3

# create the circle polygons around the points with the distances
polyB <- gBuffer(pointB, width = distanceA2B)
polyC <- gBuffer(pointC, width = distanceA2C)

# extract the feature coordinates of the polygon - we need to intersect lines, not polygons
coordsB <- lapply(polyB@polygons, function(x) {x@Polygons[[1]]@coords})
coordsC <- lapply(polyC@polygons, function(x) {x@Polygons[[1]]@coords})

# create circles as lines
lineB <- SpatialLines(list(Lines(Line(coordsB[[1]]), "B")))
lineC <- SpatialLines(list(Lines(Line(coordsC[[1]]), "C")))

# find intersections
if (is.null(gIntersection(lineB, lineC))) coords <- NULL else coords <- coordinates(gIntersection(lineB, lineC))
coords

plot(lineC)
lines(lineB)
points(coords, col="red", pch=16)
points(pointB, pch=4); text(coordinates(pointB) + .4, "Point B")
points(pointC, pch=4); text(coordinates(pointC) + .4, "Point C")

enter image description here

(inspirado por http://stackoverflow.com/a/21648987)

1voto

alasdairg Puntos 1518

KevinMayall la sugerencia de intersección de los círculos es el más fácil. Un buen tratamiento teórico se puede encontrar en Wolfram Mathworld, que pueden entrar en más detalle de lo que quieres conseguir este trabajo (pero es agradable de fondo para escribir un artículo acerca de su metodología).

Esta respuesta de StackOverflow tiene un enlace roto sino que describe un enfoque básico.

Intersection of 2 circles

Primero se calcula la distancia d entre el centro de de los círculos. d = ||P1 - P0||.

  • Si d > r0 + r1 , a continuación, que no hay soluciones, los círculos están separados.
  • Si d < | r0- r1| entonces no hay soluciones porque es un círculo contenida dentro de la otra.

  • Si d = 0 y r0= r1 , a continuación, los círculos son coincidentes y hay un número infinito de soluciones.

Teniendo en cuenta los dos triángulos P0P2P3 y P1P2P3 , podemos escribir

un2 + h2 = r02y b2 + h2 = r12

Usando d = a + b, podemos resolver para una,

a = (r02 - r12 + d2 ) / (2 d)

Puede ser fácilmente demostrado que esto se reduce a r0 cuando los dos círculos se tocan en un punto, es decir: d = r0 + r1 Resolver para h sustituyendo en la primera ecuación, h2 = r02 - 2

Así

P2 = P0 + a ( P1- P0 ) / d

Y por último, P3= (x3,y3) en términos de P0= (x0,y0), P1= (x1,y1) y P2= (x2,y2), es

x3= x2 +- h ( y1 - y0 ) / d

y3 = y2 -+ h ( x1 - x0 ) / d

Una nota importante, sin embargo, es que las matemáticas aquí está basado en la distancia Euclídea. El efecto de la curvatura de la tierra no está incluido. Esto está bien para pequeñas distancias (< 20 km, ver este SIG preguntas frecuentes, desplácese a Q5.1) , pero si estás trabajando en grandes análisis comienza a ser inexacta.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X