Estou trabalhando com uma pilha ESRI, armazenando minhas camadas em um banco de dados geodésico-SDE habilitado para sql-espacial (tipo Geometry, Web Mercator-3857).
Como estou criando um aplicativo de mapeamento da web, por padrão, os blocos também estão no web mercator, 3857.
Via procs armazenados, eu uso STDistance para consultar distâncias da localização de um usuário (coordena também no web mercator) até as várias camadas.
O problema é que, devido à distorção do web mercator, minhas distâncias estão cada vez mais afastadas, quanto mais distantes do equador são feitas.
Eu pensei em armazenar minhas camadas no tipo sql-spatial-geography (em vez de geometry), mas:
- Imagino que minhas consultas à distância demorem muito mais (distâncias calculadas na superfície esférica)
- precisarei reimportar muitos dados
- os serviços arcgis não serão tão rápidos quanto precisarão projetar em tempo real
Se eu for ao Google Maps e fizer um cálculo de distância, a distância retornada será muito mais precisa, mesmo nas regiões Nortern / Southern, por isso presumo que o Google esteja corrigindo as distorções causadas pela projeção do web mercator.
Minha pergunta então: Existe um valor de fator simples que pode ser aplicado aos cálculos de distâncias feitos na projeção do web mercator para obter a distância "correta"?
fonte
cos((l1 + l2)/2)
que fornecerá a distância da linha de rumo / curso constante, em vez de uma distância de grande círculo.Eu consideraria sua segunda opção de armazenar seus dados no
GEOGRAPHY
formato novamente se você estiver procurando resultados precisos em dados globais.Não há nada que o impeça de ter dois campos espaciais em uma tabela - um no Mercator como um
GEOMETRY
tipo e um no WGS84 como umGEOGRAPHY
tipo (pelo menos não no SQL Server, não tenho certeza sobre o ArcSDE).Você deve conseguir criar um script de geoprocessamento simples que preencherá os dois campos com seus dados originais. Se houver edição e atualizações frequentes em andamento, isso pode não ser uma opção.
Depois de ter os dois campos, você pode continuar usando o Mercator para exibição rápida e converter os pontos inseridos pelo usuário em Lat / Lon para distâncias.
Isso tem duas vantagens principais:
As velocidades da consulta serão mais complexas, mas podem ser imperceptíveis para um usuário. Você pode testar com uma classe de recurso antes de decidir sobre uma solução. Você também terá que converter os pontos inseridos pelo usuário no Mercator (o que deve ser trivial e pode ser feito no navegador).
Mesmo com o tipo de região, embora ainda haja uma margem de erro:
Do MSDN
fonte
Uma sugestão alternativa da ESRI é usar um "serviço de geometria", que envolve o envio das geometrias para um ArcGIS Server e a devolução do resultado. Se você não espera problemas de gargalo usando um serviço da Web, isso pode ser uma abordagem muito eficaz. Eu usei a mesma abordagem em um aplicativo Silverlight.
Aqui está uma entrada de blog original da ESRI: http://blogs.esri.com/Dev/blogs/arcgisserver/archive/2010/03/05/Measuring-distances-and-areas-when-your-map-uses-the -Mercator-projection.aspx
No blog, há um exemplo de JavaScript simplificado e também um aplicativo de exemplo completo aqui: http://serverapps.esri.com/javascript_examples/compare_measurements.htm
fonte
Como o Google Earth faz, você pode transformar a geometria em uma projeção de zona WGS84 local ou uma projeção WGS84 aprimorada como SIRGAS na América do Sul.
Você pode procurar em http://www.spatialreference.org as coordenadas de quase todas as projeções "zonificadas" e criar uma tabela etc. para transformá-las, dependendo da zona.
Nós imaginamos uma zona de mesa
todos os valores minx, miny, maxx, maxy armazenados no Spherical Mercator (Web Mercator). então eu vou usar postgis como exemplo.
Espero que isso seja útil, tenha um bom dia.
fonte
Os OpenLayers têm um método utilitário para calcular a distância entre dois pontos EPSG: 4326 (WGS84) em um elipsóide. Como o OpenLayers é de código aberto, você pode ver como ele é implementado aqui: https://github.com/openlayers/openlayers/blob/release-2.12/lib/OpenLayers/Util.js#L750
Para aqueles que usam OpenLayers e o controle Measure, ative apenas geodésico nas opções literais para usar esse cálculo.
fonte