سؤال
اتمنى ان تكون بخير
أحاول تحويل الإحداثيات Lat/Long إلى OSGB36 X و Y باستخدام مكتبة Proj.4.
هل قام أي شخص آخر بنجاح بهذا؟ أحتاج إلى ملء متغيرات 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 - أعرف أن المسند يجب أن يكون +datum = OSGB36 ، لكن كل ما أحاوله ، لا يعمل
أيه أفكار؟
شكرا كثيرا مسبقا
ليددي
المحلول 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";
في صحتك!
نصائح أخرى
googling يظهر هذه من الدكتور جون ستيفنسون ، وهو أكاديمي لعلوم الأرض بجامعة مانشستر - الذي يجب أن يحصل عليه بشكل صحيح إذا فعل أي شخص. هذا اقتباس.
كانت المشكلة أن الذهاب إلى OSGB36 يتطلب كل من الإسقاط وتحويل المسند. قبل ذ لك أكتوبر 2007, ، كان 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 متر.
EPSG: 27700 على 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" ، وأطلق على طريقة "الأمام" ، لكن هذا رفض القيام بتحويل المسند ، مما أدى إلى خروج 100 متر. يبدو أنه من الضروري استخدام سلسلة "SRCPRJ" وطريقة "التحويل" ، للحصول على تحويل المسند.
انظر أيضًا منشور مدونتي: رمز Ruby للتحويل إلى أنظمة إحداثيات مسح Ord Ordnance من WGS84؟ الذي يتضمن نسخة روبي نقية (وليس proj4) لفعل الشيء نفسه