Библиотека PROJ.4 и OSGB36
Вопрос
надеюсь, у вас все хорошо
Я пытаюсь преобразовать широтные / длинные координаты в OSGB36 x и y, используя библиотеку proj.4.
Кто-нибудь еще успешно сделал это?Мне нужно заполнить переменные srcPrj4String и destPrj4String, например
строка srcPrj4String = "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs";
строка destPrj4String = "+proj=utm + зона = 11 + ellps = GRS80 + исходные данные = NAD83 + единицы измерения = m";
но я не могу понять, какой должна быть строка destPrj4String с OSGB36 - я знаю, что datum должен быть + datum = OSGB36, но все, что я пытаюсь, не работает
Есть какие-нибудь идеи?
Заранее большое спасибо
ледди
Решение 2
понял это:
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";
ваше здоровье!
Другие советы
Появляется поиск в Google это от доктора Джона Стивенсона, преподавателя наук о Земле Манчестерского университета, который должен понять это правильно, если кто-то это понимает.Вот цитата.
Проблема заключалась в том, что для перехода на OSGB36 требуется как проекция, так и преобразование исходных данных.До того, как Октябрь 2007 года, proj только выполнял проекцию, что привело к большому смещению.Вы можете проверить установлена ли у вас новая версия, запустив "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 м.
EPSG:27700 вкл. spatialreference.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-код для преобразования в системы координат артиллерийской разведки Великобритании из WGS84? который включает в себя чистую версию ruby (не proj4) для выполнения того же самого