2009-09-15 9 views
6

hoffen, dass Sie gutPROJ.4 Bibliothek und OSGB36

I lat/long Koordinaten OSGB36 x und y mit der proj.4 Bibliothek zu konvertieren versuchen.

Hat jemand anderes dies erfolgreich getan? Ich muss die Variablen srcPrj4String und destPrj4String füllen, z.

Zeichenfolge srcPrj4String = "+ proj = longlat + ellps = WGS84 + Datum = WGS84 + no_defs";
Zeichenfolge destPrj4String = "+ proj = utm + zone = 11 + ellps = GRS80 + Datum = NAD83 + Einheiten = m";

aber ich kann nicht herausfinden, die, was die destPrj4String mit OSGB36 sein sollte - ich weiß das Datum + Datum = OSGB36 sein sollte, aber alles, was ich versuche, funktioniert nicht

Irgendwelche Ideen?

Vielen Dank im Voraus

leddy

Antwort

4

bekam es:

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

Prost!

6

Googeln taucht auf this von Dr. John Stevenson, einem Manchester University Earth Science Akademiker - wer sollte es richtig machen, wenn jemand tut. Hier ist ein Zitat.


Das Problem war, dass beide einen Vorsprung OSGB36 gehen und einen datum conversion erfordert. Vor October 2007 führte proj nur aus der Projektion heraus, was zu dem großen Offset führte. Sie können überprüfen, ob Sie die neue Version durch Ausführen von ‚proj -v‘ oder durch einen Blick auf Ihre epsg Datei haben:

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

Die neuen Versionen + Datum = OSGB36 haben.

Wenn Sie eine alte Version haben, können Sie diese korrigieren, indem Sie die Zeile mit dem Ersetzen:

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

Eine Komplikation ist, dass OSGB36 ist slightly distorted in Bezug auf GPS Projektionen (wie WGS84 und ETRS89). Dieser Offset ist klein, und ist nur für eine genauere Vermessung wichtig. Viele Suchanfragen über OSGB36 Offsets führen dazu Seiten auf. Wenn Sie dies auch kompensieren möchten, können Sie eine Nadgrid-Datei und use it herunterladen. Für meine Daten bewegte sich diese um die Punkte um ca. 1 m.

1

EPSG:27700 on spatialreference.org gibt verschiedene Zeichenfolgen für die Definition, einschließlich einer für proj4.

Hier ist Beispielcode in Ruby die proj4 Bindungen mit:

#!/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" 

Der Ausgang:

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

So genau jetzt das funktioniert . Ursprünglich habe ich nur die 'destPrj'-Zeichenkette versucht und die "forward" -Methode aufgerufen, aber dies hat sich geweigert, die Datumkonvertierung durchzuführen, was dazu führte, dass alles 100m entfernt war. Es schien notwendig zu sein, die 'srcPrj'-Zeichenfolge und die' Transform'-Methode zu verwenden, um die Datumkonvertierung zu erhalten.

Siehe auch meinen Blogpost: Ruby code for converting to UK Ordnance Survey coordinate systems from WGS84?, der eine reine Rubinversion (nicht proj4) für das gleiche enthält