문제

당신이 잘되기를 바랍니다

PROJ.4 라이브러리를 사용하여 LAT/Long 좌표를 OSGB36 X 및 Y로 변환하려고합니다.

다른 사람 이이 일을 성공적으로 수행 한 적이 있습니까? Srcprj4string 및 destprj4string 변수를 채워야합니다.

문자열 srcprj4string = " +proj = longlat +elps = wgs84 +datum = wgs84 +no_defs";
String destprj4string = " +proj = utm +zone = 11 +elps = grs80 +datum = nad83 +단위 = m";

그러나 나는 destprj4string이 OSGB36에서 무엇을 해야하는지 알아낼 수 없습니다 - 나는 데이텀이 +datum = osgb36이어야한다는 것을 알고 있지만, 내가 시도하는 모든 것은 작동하지 않습니다.

어떤 아이디어?

미리 감사드립니다

Leddy

도움이 되었습니까?

해결책 2

알았어요:

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

건배!

다른 팁

인터넷 검색이 나타납니다 이것 Manchester University Earth Science Academic 인 John Stevenson 박사는 누구든지 누가 그것을 얻어야합니다. 여기에 인용문이 있습니다.


문제는 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 파일을 다운로드하고 그걸 써. 내 데이터의 경우, 이것은 지점을 약 1m로 옮겼습니다.

EPSG : spatialreference.org의 27700 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'문자열을 시도하고 '전진'방법을 호출했지만, 이것은 데이텀 변환을 거부하여 모든 것이 100m 아웃되었습니다. 데이텀 변환이 발생하기 위해 'srcprj'문자열과 '변환'방법을 사용해야하는 것 같습니다.

내 블로그 게시물도 참조하십시오. WGS84에서 영국 병기 조사 좌표 시스템으로 전환하기위한 루비 코드? 여기에는 동일한 작업을위한 순수한 루비 버전 (Proj4 아님)이 포함됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top