2009-09-15 4 views
6

あなたは、私がPROJ.4ライブラリを使用してOSGB36 xとyに緯度/経度座標を変換しようとしていますだけでなくPROJ.4ライブラリとOSGB36

ている願っています。

これを成功裏に完了した人はいますか?私は、srcPrj4StringとdestPrj4String変数を埋める必要があります。

文字列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

leddy事前に

多くのおかげでそれを得た:

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より前では、プロジェクションは投影から しか搬送していなかったため、大きなオフセットが生じました。

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の-v」を実行するか、またはあなたの EPSGファイルを見て、新しいバージョンを持っている場合は、 を確認することができます。

古いバージョンを持っている場合、あなたが行を置換することによってそれを修正することができるが:

+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は(例えばWGS84やETRS89など)GPS 突起に対してslightly distortedであることです。このオフセットは小さく、 は高精度測量にのみ重要です。 に関する多くの検索では、OSGB36オフセットがこれに関連するページを表示します。 もこれを補償したい場合は 、nadgridファイルとuse itをダウンロードできます。私のデータでは、これは を約1m移動しました。

1

EPSG:27700 on spatialreference.orgは、これを定義するためのさまざまな文字列を提供します(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" 

出力:ここ

はPROJ4バインディングを使用してルビーのコード例あるので、これは今正確に働いている
http://streetmap.co.uk/grid/531691_182089_106

http://www.openstreetmap.org/?mlat=51.52237&mlon=-0.10322&zoom=16
はに変換します。もともと私は単に「destPrj」という文字列をしよう、と「前進」メソッドを呼び出しますが、これがすべてであること100メートルを出し、その結果、データム変換を行うことを拒否しました。データ変換を行うには、 'srcPrj'文字列と 'transform'メソッドを使用する必要があるようです。

私のブログ記事も参照してください。Ruby code for converting to UK Ordnance Survey coordinate systems from WGS84?純粋なルビーバージョン(proj4ではない)を含んでいます。

関連する問題