Библиотека PROJ.4 и OSGB36 - PullRequest
       73

Библиотека PROJ.4 и OSGB36

6 голосов
/ 15 сентября 2009

надеюсь, что вы хорошо

Я пытаюсь преобразовать координаты широты / долготы в OSGB36 x и y с помощью библиотеки proj.4.

Кто-нибудь еще успешно это сделал? Мне нужно заполнить переменные srcPrj4String и destPrj4String, например

string srcPrj4String = "+ proj = longlat + ellps = WGS84 + datum = WGS84 + no_defs";
string destPrj4String = "+ proj = utm + zone = 11 + ellps = GRS80 + базовая точка = NAD83 + единицы = m";

но я не могу понять, какой должна быть destPrj4String с OSGB36 - я знаю, что датум должен быть + datum = OSGB36, но все, что я пытаюсь, не работает

Есть идеи?

Большое спасибо заранее

Leddy

Ответы [ 3 ]

6 голосов
/ 16 сентября 2009

Googling появляется это от доктора Джона Стивенсона, академика наук о Земле из Манчестерского университета - который должен сделать это правильно, если кто-то сделает Вот цитата.


Проблема заключалась в том, что переход на OSGB36 требует как проекции, так и преобразование данных . До октября 2007 , проект был только вне проекции, что приводит к большому смещению. Ты можешь проверить если у вас есть новая версия, запустив 'proj -v' или посмотрев на файл 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  <> 

В новых версиях + datum = OSGB36.

Если у вас старая версия, вы можете исправить ее, заменив строку на:

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

Сложность заключается в том, что OSGB36 слегка искажен относительно GPS проекции (такие как WGS84 и ETRS89). Это смещение мало, и важно только для более точной съемки. Много поисков по поводу OSGB36 смещает страницы, связанные с этим. Если хотите компенсировать это тоже, Вы можете скачать файл nadgrid и использовать его . По моим данным, это переехало очки примерно на 1 м.

5 голосов
/ 15 сентября 2009

понял:

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

ура! * * 1004

1 голос
/ 09 июня 2010

EPSG: 27700 наatialreference.org предоставляет различные строки для определения этого, включая строку для proj4.

Вот пример кода в ruby ​​ с использованием привязок 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"

Выход:

http://www.openstreetmap.org/?mlat=51.52237&mlon=-0.10322&zoom=16
Преобразует в:
http://streetmap.co.uk/grid/531691_182089_106

Так что теперь это работает точно. Первоначально я пробовал просто строку 'destPrj' и вызывал метод 'forward', но это отказалось выполнить преобразование данных, в результате чего все получилось на расстоянии 100 м. Казалось необходимым использовать строку 'srcPrj' и метод 'transform', чтобы получить преобразование данных.

См. Также мое сообщение в блоге: Код Ruby для преобразования в системы координат UK Ordnance Survey из WGS84? , который включает в себя чистую версию ruby ​​(не proj4) для выполнения того же

...