7

一切顺利

我正在尝试使用 proj.4 库将纬度/经度坐标转换为 OSGB36 x 和 y。

有没有其他人成功地做到了这一点?我需要填写 srcPrj4String 和 destPrj4String 变量,例如

字符串 srcPrj4String = "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs";
字符串 destPrj4String = "+proj=utm +zone=11 +ellps=GRS80 +datum=NAD83 +units=m";

但我无法弄清楚 OSGB36 中的 destPrj4String 应该是什么 - 我知道基准应该是 +datum=OSGB36,但我尝试的一切都不起作用

有任何想法吗?

提前谢谢了

雷迪

4

3 回答 3

8

谷歌搜索从曼彻斯特大学地球科学学者约翰史蒂文森博士那里发现了这一点 - 如果有人这样做,他应该做对这是一个报价。


问题是转到 OSGB36 需要投影和 基准面转换。在2007 年 10 月之前,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 m。

于 2009-09-16T19:24:02.237 回答
5

知道了:

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

干杯!

于 2009-09-15T14:08:54.393 回答
1

spatialreference.org 上的 EPSG:27700 提供了各种字符串来定义它,包括一个用于 proj4 的字符串。

这是使用 proj4 绑定的 ruby​​ 示例代码:

#!/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'方法,但这拒绝进行基准转换,导致一切都在100m之外。似乎有必要使用“srcPrj”字符串和“transform”方法来进行数据转换。

另请参阅我的博客文章:用于从 WGS84 转换为英国军械测量坐标系的 Ruby 代码?其中包括用于执行相同操作的纯 ruby​​ 版本(不是 proj4)

于 2010-06-09T10:45:36.910 回答