Biblioteca PROJ.4 e OSGB36
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
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