2009-09-15 7 views
6

spero tu stia benebiblioteca PROJ.4 e OSGB36

Sto cercando di convertire le coordinate di latitudine/lunghi per OSGB36 xey utilizzando la libreria proj.4.

Qualcun altro ha eseguito correttamente questo? Devo riempire le variabili srcPrj4String e destPrj4String, ad es.

string srcPrj4String = "+ proj = longlat + ellps = WGS84 + datum = WGS84 + no_defs";
string destPrj4String = "+ proj = utm + zone = 11 + ellps = GRS80 + datum = NAD83 + unità = m";

ma non riesco a capire la cosa destPrj4String dovrebbe essere con OSGB36 - So che il dato dovrebbe essere + datum = OSGB36, ma tutto quello che provo, non funziona

Tutte le idee?

Molte grazie in anticipo

Leddy

risposta

4

capito:

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"; 

applausi!

6

Googling si trasforma in this dal dottor John Stevenson, un accademico di Scienze della Terra dell'università di Manchester - che dovrebbe farlo bene se qualcuno lo fa. Ecco una citazione.


Il problema è che andando a OSGB36 richiede sia una proiezione e una datum conversion. Prima di October 2007, proj trasportava solo fuori dalla proiezione, determinando così l'offset di grandi dimensioni. È possibile controllare se avete la nuova versione eseguendo 'proj -v' o, cercando in file 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 <> 

Le nuove versioni hanno dato + = OSGB36.

Se si dispone di una vecchia versione, è possibile correggerlo sostituendo la linea con:

+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 <> 

Una complicazione è che OSGB36 è slightly distorted rispetto al GPS proiezioni (come WGS84 e ETRS89). Questo offset è piccolo e è importante solo per il rilievo più preciso. Molte ricerche sugli offset di OSGB36 richiamano pagine relative a questo. Se si desidera che compensi anche questo, è possibile scaricare un file nadgrid e use it. Per i miei dati, ciò ha spostato i punti di circa 1 m.

1

EPSG:27700 on spatialreference.org fornisce varie stringhe per definire ciò, incluso uno per proj4.

Ecco esempio di codice in rubino utilizzando i binding 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" 

L'output:

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

Quindi questo sta lavorando accuratamente ora . Inizialmente stavo provando solo la stringa 'destPrj' e chiamavo il metodo 'forward', ma questo si rifiutava di fare la conversione del datum, risultando in 100m out. Sembrava necessario utilizzare la stringa 'srcPrj' e il metodo 'transform', per ottenere la conversione del datum.

Vedere anche il mio post del blog: Ruby code for converting to UK Ordnance Survey coordinate systems from WGS84? che include una versione in puro rubino (non proj4) per fare lo stesso