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

Кроме синтаксического сахара, единственной реальной разницей является способность к параметру функции, который является указателем для пустого указателя. Таким образом, версия указателя может быть более выразительной, если она обрабатывает пустой случай правильно. Пустой случай может также иметь некоторое особое значение, присоединенное к нему. Ссылочная версия может только воздействовать на значения типа, определенного без пустой возможности.

7
задан winwaed 2 January 2011 в 23:37
поделиться

3 ответа

понял:

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

ура!

5
ответ дан 6 December 2019 в 19:39
поделиться

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


Проблема заключалась в том, что для перехода на OSGB36 требовались и проекция, и преобразование данных . До октября 2007 г. проект нес только out the projection, thus resulting in the large offset. You can check if you have the new version by running 'proj -v' or by looking at your epsg file:

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

The new versions have +datum=OSGB36.

If you have an old version, you can correct it by replacing the line with:

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

A complication is that OSGB36 is slightly distorted with respect to GPS projections (such as WGS84 and ETRS89). This offset is small, and is only important for higher precision surveying. Many searches about OSGB36 offsets bring up pages relating to this. If you want to compensate for this too, you can download a nadgrid file and use it. For my data, this moved the points by about 1 m.

7
ответ дан 6 December 2019 в 19:39
поделиться

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-код для преобразования в систему координат UK Ordnance Survey из WGS84?, который включает чистую версию на руби (не proj4) для выполнения того же

.
1
ответ дан 6 December 2019 в 19:39
поделиться