أكثر

كيفية تحويل EPSG: 3857 إلى إحداثيات بكسل البلاط عند عامل التكبير 0؟

كيفية تحويل EPSG: 3857 إلى إحداثيات بكسل البلاط عند عامل التكبير 0؟


أقوم بإنشاء خريطة Leaflet مع تراكب WebGL (باستخدام L.CanvasOverlay) والتي تعرض شبكة شارع على وحدة معالجة الرسومات.

لنفترض أن لدي وجهة نظر(1497143.62, 6896952.18)في EPSG: 3857 وترغب في تحويله إلى إحداثيات بكسل على خطوط المسح 256 × 256 ، على غرار لوحة خرائط Google عند مستوى التكبير 0 (قارن: هذا وذاك).

يمكنني تحويل نفس النقطة(52.51904, 13.44907)إلى EPSG: 4326 واستخدم كود JavaScript التالي لإجراء إعادة الإسقاط إلى نقطي التجانب 256 × 256:

/ ** * يحول Lat / Lon إلى وحدات البكسل X / Y عند مستوى التكبير 0 * لحجم البلاط 256 × 256 ويعكس إحداثيات y. * *param {float} Latitude *param {float} lon Longitued *return Point مع x و y يترابطان. * / وظيفة latLonToPixels (lat ، lon) {var sinLat = Math.sin (lat * Math.PI / 180.0) ؛ var pixelX = ((lon + 180) / 360) * 256 ؛ var pixelY = (0.5 - Math.log ((1 + sinLat) / (1 - sinLat)) / (Math.PI * 4)) * 256 ؛ إرجاع {x: pixelX، y: pixelY} ؛ }

... مما يتركني مع النقطة المطلوبة(137.56378, 83.94214)على خطوط المسح.

لذلك ، باستخدام المنشور يمكنني تحويل نقطتي من 3857 إلى 4326 وبعد ذلك حساب إحداثيات البكسل باستخدام الصيغة أعلاه. لكن كما فهمت منتدى المنتديات ، سيتطلب ذلك إعادة إسقاطين كرويتين وهو ما يمثل حوسبة كبيرة للغاية بالنسبة للهندسات الكبيرة.

أظن أن هناك نهجًا أكثر بساطة وفعالية لهذا التحول. لكن لم أستطع معرفة ذلك بعد. اي فكرة؟

بالإضافة إلى ذلك ، عند البحث في الإنترنت ، لا يمكنني معرفة ما تشير إليه إحداثيات EPSG: 3857 بالفعل. تحاول هذه الإجابة وتلك شرحها قليلاً ولكن لا يزال من غير الواضح كيفية حل هذا برمجيًا.


هذا هو الجواب. في بعض الأحيان ، عليك أن تمر بكل عملية طرح سؤال لفهم الحل. جافا سكريبت:

/ ** * يحول mercator الويب الكروي إلى بكسل البلاط X / Y عند مستوى التكبير 0 * لحجم البلاط 256 × 256 ويعكس إحداثيات y. * *param {L.point} p نقطة النشرة في EPSG: 3857 *return {L.point} نقطة النشرة التي ترتبط ببكسل التجانب x و y. * / وظيفة mercatorToPixels (p) {var equator = 40075016.68557849 ؛ var pixelX = (p.x + (Equator / 2.0)) / (Equator / 256.0) ؛ var pixelY = ((p.y - (Equator / 2.0)) / (Equator / -256.0)) ؛ إرجاع النقطة L. (pixelX ، pixelY) ؛ }

تفسير

يبلغ حجم البلاط في مستوى التكبير 0 40.075.016 م * 40.075.016 م. حجم البلاط 256 بكسل * 256 بكسل. مركز مركاتور الويب هو (0 ، 0).

  1. ترجم إحداثي X بنصف خط استواء إيجابي.
  2. اقسم النتيجة X على حجم البكسل الموجب بالمتر.
  3. ترجم إحداثي Y بنصف خط استواء سالب.
  4. اقسم النتيجة Y على حجم البكسل السالب بالمتر.

هذا هو.


أود النظر في استخدام مكتبة proj4.js لتحويل إحداثياتك برمجيًا باستخدام جافا سكريبت. من جيثب التمهيدي:

الاستخدام الأساسي:proj4 (fromProject [، toProject2، الإحداثيات])

على سبيل المثال:

"

var firstProject = 'PROJCS ["NAD83 / Massachusetts Mainland"، GEOGCS ["NAD83"، DATUM ["North_American_Datum_1983"، SPHEROID ["GRS 1980"، 6378137،298.257222101، AUTHORITY ["EPSG"، "7019ORITY]] "EPSG"، "6269"]]، PRIMEM ["Greenwich"، 0، AUTHORITY ["EPSG"، "8901"]]، UNIT ["Degree"، 0.01745329251994328، AUTHORITY ["EPSG"، "9122"]]، AUTHORITY ["EPSG"، "4269"]]، UNIT ["meter"، 1، AUTHORITY ["EPSG"، "9001"]]، PROJECTION ["Lambert_Conformal_Conic_2SP"]، PARAMETER ["standard_parallel_1"، 42.6833333333333333]، PARAMETER [ "standard_parallel_2"، 41.71666666666667]، PARAMETER ["latitude_of_origin"، 41]، PARAMETER ["central_meridian"، - 71.5]، PARAMETER ["false_easting"، 200000]، PARAMETER ["false_northing"، 750000] "، EPSGORITY "26986"]، AXIS ["X"، EAST]، AXIS ["Y"، NORTH]] '؛ var secondProject = "+ proj = gnom + lat_0 = 90 + lon_0 = 0 + x_0 = 6300000 + y_0 = 6300000 + ellps = WGS84 + datum = WGS84 + الوحدات = m + no_defs" ؛ // لن أعيد تعريف هذين في الأمثلة الأخيرة. proj4 (FirstProject، secondProject، [2،5])؛ // [-2690666.2977344505، 3662659.885459918]

شاهد الفيديو: أسهل طريقة لتركيب البلاط بالمادة اللاصقة من الألف الى الياء pose carrelage