Pergunta

espero que você esteja bem

Estou tentando converter coordenadas lat/long para OSGB36 xey usando a biblioteca proj.4.

Alguém mais fez isso com sucesso?Preciso preencher as variáveis ​​srcPrj4String e destPrj4String, por exemplo.

string srcPrj4String = "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs";
string destPrj4String = "+proj=utm +zona=11 +ellps=GRS80 +datum=NAD83 +unidades=m";

mas não consigo descobrir qual deveria ser o destPrj4String com OSGB36 - sei que o dado deveria ser +datum=OSGB36, mas tudo que tento não funciona

Alguma ideia?

Muito obrigado antecipadamente

leddy

Foi útil?

Solução 2

entendi:

string srcPrj4String = "+proj=longlat +ellps=WGS84 +towgs84=0,0,0 +no_defs";
string destPrj4String = "+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +towgs84=446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894 +units=m +no_defs";

saúde!

Outras dicas

Pesquisando no Google aparece esse do Dr. John Stevenson, um acadêmico de Ciências da Terra da Universidade de Manchester - que deveria acertar se alguém o fizesse.Aqui está uma citação.


O problema é que ir para OSGB36 requer tanto uma projeção quanto umconversão de dados.Antes de Outubro de 2007, o Proj estava apenas realizando a projeção, resultando no grande deslocamento.Você pode verificar Se você tiver a nova versão, executando 'proj -v' ou olhando para o seu Arquivo EPSG:

cat /usr/share/proj/epsg | grep -A 1 "British National Grid" 

# OSGB 1936 / British National Grid 
<27700> +proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 
+y_0=-100000 +ellps=airy +datum=OSGB36 +units=m +no_defs  <> 

As novas versões possuem +datum=OSGB36.

Se você tiver uma versão antiga, poderá corrigi-la substituindo a linha por:

+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.999601 +x_0=400000 +y_0=-100000 
+ellps=airy 
+towgs84=446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894 +units=m 
+no_defs <> 

Uma complicação é que o OSGB36 é ligeiramente distorcido com relação ao GPS projeções (como WGS84 e ETRS89).Esse deslocamento é pequeno, e só é importante para um levantamento de maior precisão.Muitas pesquisas sobre Os deslocamentos OSGB36 trazem páginas relacionadas a isso.Se você quiser compensar isso também, Você pode baixar um arquivo NADGRID e use-o.Para os meus dados, isso mudou os pontos por cerca de 1 m.

EPSG:27700 em espacialreference.org fornece várias strings para definir isso, incluindo uma para proj4.

Aqui está o código de exemplo em rubi usando as ligações proj4:

#!/usr/bin/ruby
require 'rubygems'
require 'proj4'

#Some example WGS84 lat lon coordinates to convert:
lon = -0.10322
lat = 51.52237

srcPoint = Proj4::Point.new(Math::PI * lon.to_f / 180, 
                            Math::PI * lat.to_f / 180)

srcPrj  = Proj4::Projection.new("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs") 
destPrj = Proj4::Projection.new("+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.999601 +x_0=400000 +y_0=-100000 +ellps=airy +towgs84=446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894 +units=m +no_defs <>")

point = srcPrj.transform(destPrj, srcPoint)

puts "http://www.openstreetmap.org/?mlat=" + lat.to_s + "&mlon=" + lon.to_s + "&zoom=16"
puts "Converts to:";
puts "http://streetmap.co.uk/grid/" + point.x.round.to_s + "_" + point.y.round.to_s + "_106"

A saída:

http://www.openstreetmap.org/?mlat=51.52237&mlon=-0.10322&zoom=16
Converte para:
http://streetmap.co.uk/grid/531691_182089_106

Então isso está funcionando corretamente agora.Originalmente, eu estava tentando apenas a string 'destPrj' e chamando o método 'forward', mas ele se recusou a fazer a conversão de dados, resultando em tudo a 100 m de distância.Parecia ser necessário usar a string 'srcPrj' e o método 'transform' para que a conversão de dados acontecesse.

Veja também minha postagem no blog: Código Ruby para conversão para sistemas de coordenadas do UK Ordnance Survey do WGS84? que inclui uma versão Ruby pura (não proj4) para fazer o mesmo

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top