2010-02-26 22 views
9

He encontrado un método que toma una coordenada y un rango (en millas) y devuelve una lista de coordenadas que forman un círculo alrededor del origen. Parece que he progresado un poco, pero tengo un problema para bajar la parte del rango.Calcular coordenadas GPS para formar un radio de tamaño dado

private const Double LAT_MILE = 0.0144839; 
private const Double LONG_MILE = 0.0190693; 

public static List<Gps.Coordinate> GetRadius(Double OriginLatitude, Double OriginLongitude, Double Range, int Points) 
{ 
    List<Gps.Coordinate> Result = new List<Coordinate>(); 

    //insert a new point 
    for (int i = 0; i < Points; i++) 
    { 
     Result.Add(new Gps.Coordinate() 
     { 
      Latitude = ((Range * LAT_MILE) * System.Math.Cos(i)) + OriginLatitude, 
      Longitude = ((Range * LONG_MILE) * System.Math.Sin(i)) + OriginLongitude 
     }); 
    } 

    //sort using nearest neighbor 
    return SortCoords(ref Result); 
} 

El problema que he encontrado es que la constante que estoy usando para contar la distancia en millas a grados cambia en función de la ubicación .. ¿Alguien tiene alguna sugerencia para resolver este problema, o una mejor trampa para ratones por completo ?

EDIT: Debo señalar, soy horrible en matemáticas :)

+1

Recuerda que el conjunto puntos a una distancia constante de un punto fijo sería _seem_ ser un elipse y no un círculo si graficaste su latitud/longitud en un papel cuadriculado. Eso es porque (excepto en el ecuador) la distancia cubierta por una unidad de lat no es la misma que para una unidad de lon. – JonnyBoats

Respuesta

5

echar un vistazo a este (incluye código de ejemplo): http://www.movable-type.co.uk/scripts/latlong.html

la "Ley de los cosenos esférica" ​​le da la distancia entre dos coordenadas. debería ser posible modificar esto para darle las coordenadas alrededor de un centro específico y un radio especificado (distancia).

1

En lugar de definir LONG_MILE como una constante, debe calcular dentro de su función GetRadius: LONG_MILE = LAT_MILE/cos(OriginLatitude*PI/180.0)

Además, se ve un poco raro que usted está tomando sin() y cos() de su índice entero i. Si su intención es generar puntos a intervalos de 1 radianes que rodean el punto central, funcionará. Pero sospecho que es posible que desee algo más parecido a

angle_radians = i * 2.0*PI/Points; 

y sustituir sin(angle_radians) para sin(i), etc.

0

hacer sus cálculos en un espacio de coordenadas esféricas y luego convertirlos a la latitud/longitud.

Cuestiones relacionadas