2009-09-15 11 views
6

희망 하시겠습니까?PROJ.4 라이브러리 및 OSGB36

proj.4 라이브러리를 사용하여 위도/경도 좌표를 OSGB36 x 및 y로 변환하려고합니다.

누구든지 성공적으로이 작업을 수행 했습니까? srcPrj4String 및 destPrj4String 변수를 채울 필요가 있습니다 (예 :

문자열 srcPrj4String = "+ proj = longlat + ellps = WGS84 + datum = WGS84 + no_defs";
문자열 destPrj4String = "+ proj = utm + zone = 11 + ellps = GRS80 + 데이텀 = NAD83 + 단위 = 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

인터넷 검색은 맨체스터 대학 지구 과학 학술원 John Stevenson 박사가 this 인 것으로 밝혀졌습니다. 여기에 견적이 있습니다.


문제

는 OSGB36에가는 것은 투사와 datum conversion 모두를 필요로했다. October 2007 이전에, proj는 프로젝션 밖으로 을 들고 있었기 때문에 큰 오프셋이 발생했습니다.

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가 GPS에 대한 예측 (예 : WGS84와 ETRS89 등)로 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" 

출력 :

http://www.openstreetmap.org/?mlat=51.52237&mlon=-0.10322&zoom=16
가 변환 : 여기

는 proj4 바인딩을 사용하여 루비에서 예제 코드 입니다 그래서이
http://streetmap.co.uk/grid/531691_182089_106

를 지금 정확하게 작동하고 . 원래는 'destPrj'문자열 만 시도하고 'forward'메서드를 호출했지만이 방법은 데이텀 변환을 거부하여 모든 결과가 100m가되었습니다. 'srcPrj'문자열과 'transform'메서드를 사용하여 데이텀 변환을 수행해야하는 것처럼 보입니다.

내 블로그 게시물도 참조하십시오 : Ruby code for converting to UK Ordnance Survey coordinate systems from WGS84? 동일한 작업을 수행하기위한 순수한 루비 버전 (proj4 아님)이 포함되어 있습니다.