2009-09-15 8 views
6

nadzieję, że są dobrzePROJ.4 biblioteka i OSGB36

próbuję przekonwertować łac/długie współrzędne x i y OSGB36 wykorzystaniem biblioteki proj.4.

Czy ktoś inny z powodzeniem to zrobił? Muszę wypełnić zmienne srcPrj4String i destPrj4String, np.

string srcPrj4String = "+ proj = longlat + ellps = WGS84 + dane = WGS84 + no_defs";
string destPrj4String = "+ proj = utm + strefa = 11 + ellps = GRS80 + dane = NAD83 + jednostki = m";

ale nie mogę dowiedzieć się, co destPrj4String powinno być z OSGB36 - wiem, że punkt odniesienia powinna wynosić + układ odniesienia = OSGB36, ale wszystko staram, nie działa

Jakieś pomysły?

Wiele z góry dzięki

Leddy

Odpowiedz

4

dostał go:

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

zdrowie!

6

Googling pojawia się this od Dr Johna Stevensona, akademickiego naukowca z Uniwersytetu w Manchesterze - który powinien zrobić to dobrze, jeśli ktoś tak robi. Oto cytat.


Problem polegał na tym, że zamierza OSGB36 wymaga zarówno projekcję i datum conversion. Przed October 2007, proj wyniósł tylko z projekcji, co spowodowało duże przesunięcie. Można sprawdzić jeśli masz nową wersję uruchamiając „proj -v” lub patrząc na pliku 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 <> 

Nowe wersje mają punktu odniesienia + = OSGB36.

Jeśli masz starszą wersję, można go poprawić poprzez zastąpienie linii z:

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

Powikłaniem jest OSGB36 jest slightly distorted względem GPS rzuty (takich jak WGS84 i ETRS89). To przesunięcie jest małe, a jest ważne tylko dla pomiarów o wyższej dokładności. Wiele wyszukiwań o przesunięciach OSGB36 o wartości powoduje wyświetlenie powiązanych z nimi stron. Jeśli chcesz, aby to zrekompensować, możesz pobrać plik nadgrid i use it. Dla moich danych przesunęło to punktów o około 1 metr.

1

EPSG:27700 on spatialreference.org podaje różne ciągi określające to, w tym jeden dla proj4.

Oto przykład kodu w Ruby wykorzystaniem powiązań 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" 

Wyjście:

http://www.openstreetmap.org/?mlat=51.52237&mlon=-0.10322&zoom=16
przekształca się:
http://streetmap.co.uk/grid/531691_182089_106

więc to działa dokładnie teraz . Oryginalnie próbowałem tylko łańcucha "destPrj" i wywoływałam metodę "forward", ale odmówił on konwersji danych, co powodowało, że wszystko było oddalone o 100 metrów. Wydaje się, że konieczne jest użycie ciągu "srcPrj" i metody "transformacji", aby uzyskać konwersję punktów odniesienia.

Zobacz także mój wpis na blogu: Ruby code for converting to UK Ordnance Survey coordinate systems from WGS84? który zawiera wersję z czystym rubinem (nie proj4) za wykonanie tego samego