Usando medições geodésicas para raios de círculo?


15

Atualmente, estou desenvolvendo um site de mapeamento OpenLayers. As medições podem ser feitas usando uma ferramenta de linha e uma ferramenta de área. Atualmente, ambos estão definidos para calcular medidas geodésicas, conforme descrito na API do OpenLayers .

Uso medições geodésicas em vez de medições planares, pois durante o teste do usuário as pessoas questionam as medições da ferramenta quanto a distâncias já conhecidas (como dirigir entre cidades).

Um novo recurso do site é que um usuário pode desenhar um círculo no mapa de um raio definido. O OpenLayers apenas permite desenhar círculos usando distâncias planas; portanto, quando um usuário mede o círculo com a ferramenta de medição geodésica, os valores não correspondem. Na imagem abaixo, o raio planar do círculo é de 10 km, mas a medição da linha geodésica para o diâmetro é de 12 km.

Claramente, isso deixará um usuário (e eu) imaginando qual é o correto.

texto alternativo

Olhando para esta resposta , parece que a maioria dos sistemas GIS de desktop "ignora" esse problema e retorna medições e distâncias planares. Então, qual é a melhor prática em termos de interface com o usuário e precisão para lidar com medições planares e geodésicas?

Atualizar

Encontrei este exemplo do Google que ilustra a questão dos raios e a projeção de Mercator:

http://maps.forum.nu/gm_sensitive_circle2.html

O código JavaScript para desenhar o círculo é o seguinte:

    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);
    }

Esse círculo leva em consideração a curvatura da Terra?

Atualização final

Código de trabalho publicado em http://geographika.co.uk/creating-a-geodesic-circle-in-openlayers


1
algo deve estar errado aqui. a diferença não pode ser de 20% nessa curta distância entre a linha reta e a linha após o esferóide. outra coisa deve estar envolvida.
Nicklas Avén #

4
A projeção é muito provável Mercator, que só tem escala real no equador (geralmente, é realmente possível ter projeções Mercator com escala verdadeira em outro lugar (em uma única latitude), mas a maioria das parametrizações globais usa o equador). E os erros de escala para Mercator são realmente muito altos (infinitos, de fato, nos pólos) aumentando à medida que você segue para o norte / sul a partir da latitude real da escala.
Paul Ramsey

As medições foram feitas a 52 graus norte e estão de fato na projeção Mercator. Isso significa que quaisquer recursos do lado do cliente desenhados no Mercator retornarão áreas e comprimentos muito imprecisos, a menos que estejam perto do equador?
geographika

1
Sim, esse é o caso, projete os dados em uma grade local em metros ou pés e tudo ficará bem.
Ian Turton

2
@Paul Boa chamada. Mas esses dados indicam apenas que a projeção é cilíndrica, da qual o Mercator é um. Nas projeções cilíndricas verdadeiras, a distorção horizontal é igual a segundos (latitude). Por essa fórmula, a distorção de 20 / 12.13 ocorre a uma latitude de 52,66 graus; essa é exatamente a latitude de Limerick.
whuber

Respostas:


8

Se você estiver produzindo em casa no navegador, poderá obter um "círculo" (não será redondo na tela devido à sua projeção; é aproximado por um polígono com tantos pontos quanto você deseja desenhar) a forma direta de cálculos geodésicos: dado um ponto, uma direção (azimute) e uma distância que fornece o ponto resultante. Detalhes sangrentos: http://en.wikipedia.org/wiki/Vincenty%27s_formulae#Direct_Method

Parece que alguém já fez uma tradução para javascript: http://www.movable-type.co.uk/scripts/latlong-vincenty-direct.html . Sortudo!

Para finalizar:

  • Decida quão robusto (número de vértices, chame de n) você está disposto a ter o resultado final.
  • Divida 360 graus em n pedaços.
  • Crie um polígono por (para i no intervalo (n): polygon.add (vincenty_direct (ponto_início, i * 360 / n, distância))))
  • Após o fato, possivelmente conserte algumas irritações de projeção e planarização:
    • Se você estiver usando a projeção típica de mapa da Web, que quase certamente é, o polígono resultante será esticado verticalmente se estiver próximo de um poste.
    • Da mesma forma, se o polígono do resultado cruzar a linha de data internacional, ele será realmente exibido.

Felicidades!


1
O método Vincenty já foi adicionado ao OpenLayers no namespace utils - dev.openlayers.org/apidocs/files/OpenLayers/… com isso e sua explicação, principalmente o parâmetro de rolamento, esclarece isso. Obrigado!
geographika

:) Deixe-me saber como são irritantes as 'irritações'. Idealmente, a correção já faria parte do OpenLayers e funcionaria, mas não tenho certeza.
Dan S.

3

O OpenLayers apenas permite desenhar círculos usando distâncias planares

Para obter um círculo geodésico, você pode usar a operação de buffer no serviço de geometria da ESRI.

... se a unidade for linear, como pés ou metros, é realizado o buffer geodésico

Um disponível gratuitamente está disponível aqui .


Obrigado pelo link útil - vou ver se consigo ligar para o serviço e atualizar o recurso em JavaScript. Minha única preocupação seria confiar em um serviço da web que pudesse ser desativado a qualquer momento. Presumo que o ponto geodésico de buffer seria o círculo preciso / real de 10 km?
geographika

O círculo deve ser preciso, no entanto, eu o verificaria usando sua ferramenta de medida. Penso que o serviço de geometria faz parte de uma instalação padrão do servidor arcgis, portanto, se esse for desativado, haverá muito mais na web para você escolher. google.com/…
Kirk Kuykendall 6/11/10
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.