¿Usando mediciones geodésicas para radios de círculo?

15

Actualmente estoy desarrollando un sitio de mapeo de OpenLayers. Las mediciones se pueden hacer usando una herramienta de línea y una herramienta de área. Ambos están actualmente configurados para calcular mediciones geodésicas como se indica en API de OpenLayers .

Utilizo medidas geodésicas en lugar de mediciones planas como durante pruebas de usuarios las personas cuestionaron las medidas de la herramienta por las distancias que ya conocían (como conducir entre ciudades).

Una nueva característica del sitio es que un usuario pueda dibujar un círculo en el mapa de un radio establecido. OpenLayers solo permite dibujar círculos utilizando distancias planas, por lo que cuando un usuario mide el círculo con la herramienta de medición geodésica, los valores no coinciden. En la imagen debajo del círculo, el radio planar es de 10 km, pero la medición de la línea geodésica para el diámetro es de 12 km.

Claramente, esto dejará a un usuario (ya mí) preguntándose cuál es el correcto.

Mirandoesto respuesta parece que la mayoría de los sistemas SIG de escritorio" ignoran "este problema y devuelven mediciones planas y distancias. Entonces, ¿cuál es la mejor práctica en términos de interfaz de usuario y precisión para lidiar con mediciones planas y geodésicas?

Actualizar

Encontré este ejemplo de Google que ilustra el problema de los radios y la proyección de Mercator:

enlace

El código JavaScript para dibujar el círculo es el siguiente:

    var lat1 = (PI/180)* center.lat(); // radians
    var lng1 = (PI/180)* center.lng(); // radians

    for (var a = 0 ; a < 361 ; a++ ) {
        var tc = (PI/180)*a;
        var y = asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc));
        var dlng = atan2(sin(tc)*sin(d)*cos(lat1),cos(d)-sin(lat1)*sin(y));
        var x = ((lng1-dlng+PI) % (2*PI)) - PI ; // MOD function
        var point = new GLatLng(parseFloat(y*(180/PI)),parseFloat(x*(180/PI)));
        circlePoints.push(point);
        bounds.extend(point);
    }

¿Este círculo toma en cuenta la curvatura de la tierra?

Actualización final

Código de trabajo publicado en enlace

    
pregunta geographika 06.11.2010 - 15:17

2 respuestas

8

Si estás elaborando cerveza en el navegador, puedes obtener un "círculo" (no se redondeará en la pantalla debido a tu proyección, sino que se aproximará por un polígono con tantos puntos como quieras dibujar ), use la forma directa de los cálculos geodésicos: dado un punto, una dirección (acimut) y una distancia, le da el punto resultante. Detalles sangrientos: enlace

Parece que alguien ya ha realizado una traducción a javascript: enlace . ¡Que suerte!

Para terminar las cosas:

  • Decida qué tan grueso (número de vértices, llámelo n) está dispuesto a tener el resultado final.
  • Divide 360 grados en n piezas.
  • Cree un polígono para (para i en el rango (n): polygon.add (vincenty_direct (start_point, i * 360 / n, distance)))
  • Después del hecho, posiblemente arregle algunas irritaciones de proyección y planarización:
    • Si está utilizando la proyección de mapa web típica, lo que es casi seguro, el polígono resultante se estirará verticalmente en gran medida si se acerca a un polo.
    • Del mismo modo, si el polígono resultante cruza la línea de la fecha internacional, será realmente defectuoso.

¡Salud!

    
respondido por el Dan S. 10.11.2010 - 23:57
3
  

OpenLayers solo permite dibujar   círculos usando distancias planas

Para obtener un círculo geodésico, puede utilizar la operación buffer en El servicio de geometría de ESRI.

  

... si la unidad es lineal, como pies o   metros, el buffering geodésico es   realizado

Hay uno de acceso gratuito disponible aquí .

    
respondido por el Kirk Kuykendall 06.11.2010 - 17:01

Lea otras preguntas en las etiquetas