2009-09-15 9 views
6

esperamos que están bienbiblioteca PROJ.4 y OSGB36

Estoy tratando de convertir las coordenadas de latitud/longitud a OSGB36 x e y utilizando la biblioteca proj.4.

¿Alguien más ha hecho esto con éxito? Necesito llenar las variables srcPrj4String y destPrj4String, p.

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

pero no puedo averiguar el qué la destPrj4String debe ser con OSGB36 - sé el dato debe ser + = dato OSGB36, pero todo lo intento, no funciona

¿Alguna idea?

Muchas gracias de antemano

leddy

Respuesta

4

consiguieron:

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

saludos!

6

Googling aparece this del Dr. John Stevenson, un académico de Ciencias de la Tierra de la Universidad de Manchester - que debería hacerlo bien si alguien lo hace. Aquí hay una cita.


El problema era que va a OSGB36 requiere tanto una proyección y una datum conversion. Antes de October 2007, proj solo llevaba fuera de la proyección, lo que daba como resultado el desplazamiento grande. Puede comprobar si tiene la nueva versión ejecutando 'proj -v' o mirando su archivo 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 <> 

Las nuevas versiones tiene + = dato OSGB36.

Si tienes una versión antigua, se puede corregir mediante la sustitución de la línea 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 complicación es que OSGB36 es slightly distorted con respecto al GPS proyecciones (como WGS84 y ETRS89). Este desplazamiento es pequeño, y solo es importante para un levantamiento de mayor precisión. Muchas búsquedas sobre desplazamientos OSGB36 muestran páginas relacionadas con esto. Si desea compensar esto también, puede descargar un archivo nadgrid y use it. Para mis datos, esto movió los puntos por aproximadamente 1 m.

1

EPSG:27700 on spatialreference.org ofrece varias cadenas para definir esto, incluida una para proj4.

Aquí es código de ejemplo en rubí utilizando los enlaces 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" 

La salida:

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

Así que esto está funcionando correctamente ahora . Originalmente estaba probando solo la cadena 'destPrj' y llamando al método 'forward', pero esto se negó a hacer la conversión de datum, resultando que todo estaba a 100m de distancia. Parecía que era necesario usar la cadena 'srcPrj' y el método 'transformar', para que ocurriera la conversión de datum.

Ver también la publicación de mi blog: Ruby code for converting to UK Ordnance Survey coordinate systems from WGS84? que incluye una versión de rubí puro (no proj4) para hacer lo mismo

Cuestiones relacionadas