2009-09-15 46 views
6

希望你很好PROJ.4庫和OSGB36

我想使用proj.4庫將緯度/經度座標轉換爲OSGB36 x和y。

有沒有其他人成功地做到這一點?我需要填充srcPrj4String和destPrj4String變量,例如

string srcPrj4String =「+ proj = longlat + ellps = WGS84 + datum = WGS84 + no_defs」;
string destPrj4String =「+ proj = utm + zone = 11 + ellps = GRS80 + datum = NAD83 + units = m」;

,但我無法弄清楚的destPrj4String應該是什麼與OSGB36 - 我知道的數據應該是+基準= OSGB36,但一切我試試,不行

任何想法?

提前

萊迪

回答

4

非常感謝得到它:

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

喝彩!

6

谷歌搜索結果來自曼徹斯特大學地球科學學者約翰史蒂文森博士的this--如果有人這樣做,他應該做對的。這是一個報價。


的問題是要OSGB36既需要投影和 datum conversion。在October 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 <> 

新版本有+基準= 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是slightly distorted相對於GPS 預測(如WGS84和ETRS89)。這個偏移量很小,而且對於更高精度的測量來說只是很重要的。許多關於 OSGB36偏移量的搜索都會顯示與此相關的頁面。如果你想 也可以補償, 你可以下載一個nadgrid文件和​​use it。對於我的數據,這移動了大約1米的點數 。

1

EPSG:27700 on spatialreference.org給出了用於定義這個的各種字符串,其中包括一個用於proj4的字符串。

下面是示例代碼在紅寶石使用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'方法,但是這拒絕了數據轉換,導致所有內容都被刪除了。似乎有必要使用'srcPrj'字符串和'transform'方法來實現數據轉換。

另請參閱我的博客文章:Ruby code for converting to UK Ordnance Survey coordinate systems from WGS84?它包含一個純紅寶石版本(不是proj4),用於執行相同的操作