تبدیل مختصات جغرافیایی به کارتزین و برعکس (به همراه نمونه کدهای پایتون و متلب)

در عملیات های نقشه برداری و ترسیم نقشه های قابل نمایش، یکی از مهم ترین و در عین حال حیاتی ترین بخش های عملیات، تبدیل انواع مختصات ها به یکدیگر است. بطور کلی داده های مکانی اساسا در دو قالب اصلی ذخیره و پردازش می شوند: مختصات جغرافیایی (طول و عرض جغرافیایی برحسب درجه) و مختصات کارتزین سه بعدی (X,Y,Z برحسب متر)

تبدیل سیستم مختصات جغرافیایی به کارتزین

هریک از این انواع مختصات برای یک پروژه و نوع خاصی از ارائه مناسب است که درک تفاوت ها و موارد نیاز به این نوع از مختصات ها باعث خواهد شد تا راحت تر بتوان بر حسب تحلیل های مکانی، خروجی های مناسبی را تهیه و تولید کرد.اما هریک از این مختصات ها چه مفهومی دارند؟

سیستم مختصات جغرافیایی (Geodetic Coordinates)

مختصات جغرافیایی

مختصات محاسبه شده در این نوع از مختصات را معمولا با(Latitude, Longitude, Altitude) یا (φ, λ, h) نمایش می دهند که موقعیت یک نقطه را برحسب درجه و روی یک بیضوی مرجع نمایش می دهد. این بیضوی مرجع معمولا در محاسبات نقشه برداری همان WGS84 که استاندارد جهانی در سیستم GPS است درنظر گرفته می شود و ارتفاع نقاط را از سطح همان بیضوی محاسبه می کنند.

سیستم مختصات زمین مرکز کارتزین (ECEF - Earth-Centered, Earth-Fixed) 

سیستم مختصات کارتزین ECEF

این نوع از سیستم مختصات، ک سیستم مختصات سه بعدی دکارتی با مبدأیی در مرکز جرم زمین است. در این سیستم، محور Z به سمت قطب شمال جغرافیایی بوده، محور X از تقاطع نصف النهار گرینویچ و استوا، و محور Y در صفحه استوا و عمود بر دو محور دیگر قرار دارد.
محاسبه و اندازه گیری این مختصات بر حسب متر است و برای محاسبات دقیق سه بعدی بسیار مناسب تر از مختصات جغرافیایی هستند.

چرا در نقشه برداری به تبدیل مختصات بین سیستم مختصات کارتزین و سیستم مختصات جغرافیایی احتیاج داریم؟

برای تبدیل مختصات بین سیستم های متفاوت در نقشه برداری دلایل متعددی وجد دارد اما در این بخش، به مهم ترین این عوامل اشاره می کنیم.

علل نیاز به تبدیل مختصات

1. محاسبات فاصله، مساحت و زاویه

محاسبه فاصله دقیق بین دو نقطه با استفاده از مختصات جغرافیایی (عرض و طول) مسئله تقریبا پیچیده ای است و نیازمند فرمول های خاصی مانند روابط وینسِنتی (Vincenty's formulae) است که انحنای زمین در آنها در نظر گرفته می شود. اما در مختصات کارتزین، محاسبه فاصله اقلیدسی با استفاده از قضیه فیثاغورث به سادگی انجام می شود.
از طرفی محاسبه دقیق مساحت و زاویه در سیستم کارتزین بسیار ساده تر است. برای مثال، در سیستم های نرم افزاری که با داده های لرزه شناسی، موقعیت ایستگاه ها و رویدادها کار می کنند، ابتدا مختصات جغرافیایی به مختصات کارتزین زمین مرکزی تبدیل می شوند تا بتوان محاسبات ریاضی مانند فاصله زاویه ای، آزیموت، چرخش حول قطب ها و برخورد دایره های بزرگ را به راحتی و با دقت انجام داد.

2. ساخت و تحلیل مدل های سه بعدی

برای ساخت مدل های سه بعدی دقیق از زمین، پدیده های طبیعی، یا سازه های شهری، داده های مکانی باید در یک سیستم مختصات سه بعدی یکپارچه (کارتزین) پردازش شوند. این امر به ویژه در کاربردهایی مانند شبیه سازی های شهری، تحلیل فرونشست زمین، یا مدل سازی جریان هوا بسیار حیاتی است.
به عنوان مثال، یک گزارش فنی از آزمایشگاه ملی ساندیا (Sandia National Laboratories) نشان می دهد که برای تحلیل داده های لرزه شناسی و عملیات ریاضی بر روی آنها، ابتدا موقعیت های جغرافیایی به مختصات کارتزین زمین مرکزی تبدیل می شوند تا پردازش هایی مانند یافتن فاصله زاویه ای یا آزیموت بین نقاط به صورت کارآمد و دقیق انجام شود.

3. یکپارچه سازی داده های مکانی از منابع مختلف

داده های مکانی از منابع گوناگون (دستگاه های GPS، تصاویر ماهواره ای، نقشه های توپوگرافی، نقشه های کاداستر) معمولاً در سیستم های مختصات متفاوتی مانند WGS84، UTM و یا حتی در سیستم های محلی تعریف می شوند. برای ترکیب و تحلیل همزمان این داده ها، ناگزیر به تبدیل آنها به یک سیستم مختصات مشترک هستیم.
در بسیاری از پروژه های نقشه برداری، برای تبدیل شبکه های مختصاتی قدیمی به شبکه های جدید، نیاز به انجام تبدیل هلمرت (Helmert Transformation) با استفاده از مختصات نقاط مشترک است که این کار نیز با مختصات کارتزین انجام می شود.

4. توسعه و اجرای الگوریتم های موقعیت یاب

برای استفاده از الگوریتم های ناوبری و موقعیت یابی، با توجه به تأثیر ناچیز انحنای زمین در سناریوهای کوچک مقیاس، ابتدا مسئله پیچیده موقعیت یابی روی سطح بیضوی به یک مسئله ساده تر در یک صفحه با ارتفاع ثابت تبدیل می شود. سپس مختصات محاسبه شده دوباره به مختصات جغرافیایی (عرض، طول و ارتفاع) تبدیل می شوند تا خروجی نهایی قابل استفاده باشد.

5. کاربرد در سامانه های CAD و مدل سازی

 برای استفاده از داده های موقعیتی GPS در نرم افزارهای نقشه برداری مانند ArcGIS، AutoCad و ... برای مدل سازی سه بعدی، داده های دریافتی باید به فرمت مختصات مناسب (مثلا مختصات کارتزین X، Y، Z) تبدیل شوند تا سیستم قادر به پردازش و نمایش آنها باشد .

کاربردهای تبدیل مختصات در نقشه برداری

حالا که متوجه ماهیت این سیستم ها و همچنین علت نیاز به تبدیل مختصات بین این دو نوع سیستم مختصات شدیم، می خواهیم نگاهی داشته باشیم به فرآیند تبدیل این دو نوع مختصات به یکدیگر:

روابط ریاضی و هندسی تبدیل سیستم مختصات جغرافیایی به کارتزین:

برای درک بهتر مفاهیمی که تا کنون توضیح دادیم، در این بخش فرمول های ریاضی اصلی برای تبدیل مختصات جغرافیایی به ECEF ارائه شده است.

تبدیل مختصات جغرافیایی به کارتزین (ECEF)

با داشتن (φ, λ, h):X=(N+h)cosϕcosλX=(N+h)cosϕcosλ
Y=(N+h)cosϕsinλY=(N+h)cosϕsinλ
Z=[N(1−e2)+h]sinϕZ=[N(1−e2)+h]sinϕ

که در آن N  شعاع انحنای قائم اول بوده و به صورت زیر محاسبه می شود: 

N = a / √(1 - e² sin²φ)

a نیم قطر بزرگ و خروج از مرکزیت بیضوی است.
برای بیضوی WGS84، این مقادیر به صورت زیر هستند:

 a=6378137.0
e2=0.08181919104282

تبدیل مختصات کارتزین به جغرافیایی (ECFE به جغرافیایی)

تبدیل سیستم مختصات کارتزین به جغرافیایی

این تبدیل کمی پیچیده تر است و معمولاً با روش های تکرار (Iterative) حل می شود. طول جغرافیایی به سادگی به دست می آید:

λ=arctan(XY​)

برای عرض جغرافیایی و ارتفاع، از یک فرآیند تکراری استفاده می شود که در آن ابتدا یک حدس اولیه برایϕ زده می شود و سپس با تکرار، به جواب نهایی نزدیک می شود .

حدس اولیه برای φ:

Initial Approximation:

p = √(X² + Y²)

φ₀ = arctan ( Z / [p(1 − e²)] )

فرمول تکراری (Iterative):

N = a 1 e 2 sin 2 ( φ )
h = p cos ( φ ) N
φ new = arctan ( Z p ( 1 e 2 N N ) )

در انتهای این مطلب، سعی کردیم تا این فرمول ها را برای ساخت یک پروژه کدنویسی در هر دو زبان پایتون و متلب، پیاده سازی کرده و در اختیار شما قرار دهیم. برای دسترسی به این کدها به بخش کتابخانه های برنامه نویسی مراجعه کنید.اما بیایید ابتدا نگاهی داشته باشیم به ابزارها و کتابخانه هایی که روند برنامه نویسی برای تبدیل مختصات بین این دو سیستم مختصاتی را راحت تر می کنند.

معرفی ابزار جهت تبدیل مختصات

در این مقاله، دو اسکریپت پایتون را معرفی می کنیم که این تبدیل را با دقت بالا انجام می دهد. این کدها، یک ابزار ضروری برای هر متخصص GIS، نقشه  بردار و برنامه  نویسی است که با داده  های مکانی سروکار دارد.

کتابخانه PyMap3D پایتون

کتابخانه PyMap3D پایتون

PyMap3D یک کتابخانه کتابخانه قدرتمند و خالص پایتون (بدون نیاز به کتابخانه های جانبی) برای تبدیل مختصات سه بعدی جغرافیایی است. این کتابخانه با الهام از توابع مشابه در متلب طراحی شده و برای سیستم های موازی و تعبیه شده بسیار مناسب است. توابع این کتابخانه از آرایه های با ابعاد دلخواه (اسکالر یا N-D array) پشتیبانی می کنند.

استفاده از کتابخانه PyMap3D برای تبدیل مختصات های نقشه برداری

   مرحله 1: نصب کتابخانه
      ابتدا با استفاده از قطعه کد زیر، کتابخانه را به برنامه خود اضافه کنید:

bash
python3 -m pip install pymap3d

   مسئله 1: تبدیل مختصات جغرافیایی به کارتزین (Lat/Lon/Height → ECEF XYZ)
     این تابع یک نقطه با مختصات جغرافیایی (عرض، طول، ارتفاع) را دریافت کرده و معادل آن را در سیستم ECEF (X, Y, Z) بر می گرداند.

تابع تبدیل مختصات ژئودتیک به کارتزین ECEF

import pymap3d as pm


def geodetic_to_ecef(lat, lon, alt=0):
    """
    Convert geodetic coordinates to ECEF coordinates.

    Parameters
    ----------
    lat : float
        عرض جغرافیایی بر حسب درجه

    lon : float
        طول جغرافیایی بر حسب درجه

    alt : float
        ارتفاع از سطح بیضوی بر حسب متر

    Returns
    -------
    tuple
        مختصات ECEF شامل X, Y, Z بر حسب متر
    """

    x, y, z = pm.geodetic2ecef(
        lat,
        lon,
        alt
    )

    return x, y, z
ساختار خروجی

تابع بالا سه مؤلفه مختصات کارتزین در سیستم Earth-Centered, Earth-Fixed (ECEF) را برمی‌گرداند:

  • X: فاصله از مرکز زمین در راستای محور استوایی با طول جغرافیایی صفر درجه
  • Y: فاصله از مرکز زمین در راستای محور استوایی با طول جغرافیایی ۹۰ درجه شرقی
  • Z: فاصله از مرکز زمین در راستای محور قطبی زمین

   مسئله 2: تبدیل مختصات کارتزین به جغرافیایی (ECEF XYZ → Lat/Lon/Height)
      این تابع عملیات عکس را انجام می  دهد و مختصات ECEF را به مختصات جغرافیایی تبدیل می  کند.

تابع تبدیل مختصات کارتزین ECEF به ژئودتیک

import pymap3d as pm


def ecef_to_geodetic(x, y, z):
    """
    Convert ECEF coordinates to geodetic coordinates.

    Parameters
    ----------
    x : float
        مؤلفه X مختصات ECEF بر حسب متر

    y : float
        مؤلفه Y مختصات ECEF بر حسب متر

    z : float
        مؤلفه Z مختصات ECEF بر حسب متر

    Returns
    -------
    tuple
        مختصات ژئودتیک شامل:
        latitude (deg), longitude (deg), altitude (m)
    """

    lat, lon, alt = pm.ecef2geodetic(
        x,
        y,
        z
    )

    return lat, lon, alt
ساختار خروجی

این تابع مختصات کارتزین ECEF را به مختصات ژئودتیک شامل عرض جغرافیایی، طول جغرافیایی و ارتفاع بیضوی تبدیل می‌کند:

  • Latitude (lat): عرض جغرافیایی بر حسب درجه
  • Longitude (lon): طول جغرافیایی بر حسب درجه
  • Altitude (alt): ارتفاع از سطح بیضوی مرجع بر حسب متر

کتابخانه PyGeodesy در پایتون

یکی دیگر از کتابخانه های قدرتمند و محبوب پایتون برای استفاده در روند این تبدیل، PyGeodesy است. این کتابخانه یک پیاده سازی خالص از ابزارهای ژئودزی پایتون است که روش های مختلفی را برای محاسبات روی بیضوی و کره زمین ارائه می دهد. PyGeodesy روش های دقیقی مانند فرمول های Vincenty و Karney را برای محاسبات ژئودزی پیاده سازی کرده است که بسیار دقیق تر از روش های ساده تر هستند . یکی از نقاط قوت این کتابخانه این است که شامل ماژول های مختلفی برای مدل های بیضوی (مانند ellipsoidalVincenty، ellipsoidalKarney و ellipsoidalNvector) است .
در ادامه، کد تبدیل مختصات با استفاده از PyGeodesy را مرحله به مرحله توضیح می دهیم.

   مسئله 1: نصب کتابخانه
      برای استفاده از این کتابخانه، ابتدا با استفاده از دستور زیر، این کتابخانه را به کد خود، اضافه کنید:

نصب کتابخانه مورد نیاز

pip install pygeodesy
تبدیل مختصات ژئودتیک به کارتزین ECEF (Lat/Lon/Height → X/Y/Z)

from pygeodesy.ellipsoidalKarney import LatLon


def geodetic_to_ecef(lat, lon, height=0):
    """
    Convert geodetic coordinates to ECEF coordinates.

    Parameters
    ----------
    lat : float
        عرض جغرافیایی بر حسب درجه

    lon : float
        طول جغرافیایی بر حسب درجه

    height : float
        ارتفاع از سطح بیضوی بر حسب متر
        مقدار پیش‌فرض برابر صفر است.

    Returns
    -------
    tuple
        مختصات ECEF شامل X, Y, Z بر حسب متر
    """

    # ایجاد نقطه ژئودتیک
    point = LatLon(
        lat,
        lon,
        height=height
    )

    # تبدیل به مختصات کارتزین ECEF
    cart = point.toCartesian()

    return cart.x, cart.y, cart.z
خروجی تابع

خروجی شامل سه مؤلفه مختصات کارتزین در سیستم ECEF است:

  • X: مؤلفه محور استوایی در راستای طول جغرافیایی صفر درجه
  • Y: مؤلفه محور استوایی در راستای طول جغرافیایی ۹۰ درجه شرقی
  • Z: مؤلفه محور قطبی زمین

مسئله 2: تبدیل مختصات کارتزین به جغرافیایی (ECEF XYZ → Lat/Lon/Height)

این تابع عملیات عکس را انجام می  دهد و مختصات ECEF را به مختصات جغرافیایی تبدیل می  کند .

تبدیل مختصات کارتزین ECEF به ژئودتیک (X/Y/Z → Lat/Lon/Height)

from pygeodesy.ellipsoidalKarney import Cartesian


def ecef_to_geodetic(x, y, z):
    """
    Convert ECEF coordinates to geodetic coordinates.

    Parameters
    ----------
    x : float
        مؤلفه X مختصات ECEF بر حسب متر

    y : float
        مؤلفه Y مختصات ECEF بر حسب متر

    z : float
        مؤلفه Z مختصات ECEF بر حسب متر

    Returns
    -------
    tuple
        مختصات ژئودتیک شامل:
        latitude (deg), longitude (deg), height (m)
    """

    # ایجاد شیء Cartesian
    cart = Cartesian(
        x,
        y,
        z
    )

    # تبدیل به مختصات ژئودتیک
    point = cart.toLatLon()

    return point.lat, point.lon, point.height
خروجی تابع

این تابع سه مؤلفه مختصات ژئودتیک را برمی‌گرداند:

  • Latitude (lat): عرض جغرافیایی بر حسب درجه
  • Longitude (lon): طول جغرافیایی بر حسب درجه
  • Height (height): ارتفاع از سطح بیضوی مرجع بر حسب متر

پیاده سازی در متلب

کد متلب تبدیل مختصات کارتزین به جغرافیایی

متلب نیز توابع قدرتمندی برای تبدیل مختصات در جعبه ابزار نقشه برداری (Mapping Toolbox) خود دارد. از نسخه R2012b به بعد، توابع geodetic2ecef  و ecef2geodetic به این جعبه ابزار اضافه شده اند و از نسخه R2021a امکان تولید کد C/C++ با استفاده از MATLAB Coder نیز فراهم شده است، استفاده از این ابزارها به شرح زیر است:
   مسئله 1: تبدیل مختصات جغرافیایی به کارتزین ECEF

تبدیل مختصات ژئودتیک به کارتزین ECEF (MATLAB)

در متلب، با استفاده از تابع geodetic2ecef و تعریف بیضوی مرجع WGS84 می‌توان مختصات ژئودتیک را به سیستم مختصات ECEF تبدیل کرد.


% تعریف بیضوی مرجع WGS84
wgs84 = wgs84Ellipsoid;

% مختصات ژئودتیک
lat = ...;    % عرض جغرافیایی (درجه)
lon = ...;    % طول جغرافیایی (درجه)
alt = ...;    % ارتفاع از سطح بیضوی (متر)

% تبدیل مختصات ژئودتیک به ECEF
[X, Y, Z] = geodetic2ecef(wgs84, lat, lon, alt);

% نمایش نتایج
fprintf('ECEF Coordinates:\n');
fprintf('X = %.3f m\n', X);
fprintf('Y = %.3f m\n', Y);
fprintf('Z = %.3f m\n', Z);
خروجی

خروجی تابع شامل سه مؤلفه مختصات کارتزین در سیستم Earth-Centered, Earth-Fixed (ECEF) است:

  • X: مؤلفه محور X بر حسب متر
  • Y: مؤلفه محور Y بر حسب متر
  • Z: مؤلفه محور Z بر حسب متر

مسئله 2: تبدیل ECEF به مختصات جغرافیایی

تبدیل مختصات کارتزین ECEF به ژئودتیک (MATLAB)

% تعریف بیضوی مرجع WGS84
wgs84 = wgs84Ellipsoid;

% مختصات ECEF
X = ...;    % مؤلفه X (متر)
Y = ...;    % مؤلفه Y (متر)
Z = ...;    % مؤلفه Z (متر)

% تبدیل مختصات ECEF به ژئودتیک
[lat, lon, alt] = ecef2geodetic(wgs84, X, Y, Z);

% نمایش نتایج
fprintf('Geodetic Coordinates:\n');
fprintf('Latitude  = %.8f°\n', lat);
fprintf('Longitude = %.8f°\n', lon);
fprintf('Altitude  = %.3f m\n', alt);
خروجی

خروجی تابع شامل سه مؤلفه مختصات ژئودتیک است:

  • Latitude (lat): عرض جغرافیایی بر حسب درجه
  • Longitude (lon): طول جغرافیایی بر حسب درجه
  • Altitude (alt): ارتفاع از سطح بیضوی مرجع بر حسب متر

البته اگر تمایل دارید که کد مرحله به مرحله (با استفاده از روابط ریاضی و بصورت قدم به قدم ) در زبان برنامه نویسی متلب دسترسی داشته باشید، می توانید به بخش کتابخانه های برنامه نویسی مراجعه کنید. جهت دانلود مستقیم کد متلب تبدیل سیستم مختصات جغرافیایی به کارتزین و برعکس و همچنین دسترسی به Source های اصلی کتابخانه های پایتون معرفی شده در این مقاله، می توانید به بخش کتابخانه های برنامه نویسی مراجعه کنید.
هر دو کد ارائه شده را می توانید به راحتی در پروژه های خود برای کاربرد های متعددی مانند محاسبه فواصل دقیق، یکپارچه  سازی داده های مکانی، توسعه برنامه های تعیین موقعیت، و تحلیل داده های سه بعدی استفاده کنید.
معمولا استفاده از کتابخانه ها به دلیل استفاده از روش های دقیق ژئودزی و تعداد تکرار های بیشتر، باعث کاهش خطاهای محاسباتی و بهینه سازی نتایج می شود به همین دلیل پیشنهاد می شود که حدالمقدور برای پروژه های خود از این روش ها استفاده نمایید.
همچنین توجه کنید که ارتفاع (Height) در تبدیل  ها، ارتفاع از سطح بیضوی (Ellipsoidal Height) در نظر گرفته می  شود که با ارتفاع از سطح دریا (MSL) متفاوت است و علت آن، وجود مدل های ژئوئید است. 

جمع بندی

تبدیل مختصات جغرافیایی به کارتزین یکی از عملیات های اساسی و ضروری در مهندسی عمران، نقشه برداری و GIS است. در این مقاله، با استفاده از کتابخانه های متفاوت و تنها با چند خط کد، این تبدیل ها را پیاده سازی کردیم. این کدها را می توان به راحتی در پروژه های مختلف برای:
   · محاسبه فواصل دقیق
   · یکپارچه سازی داده های مکانی
   · توسعه برنامه های مبتنی بر موقعیت
   · ساخت مدل های سه بعدی
استفاده کرد. همچنین امکان تبدیل به سیستم های مختصات دیگری مانند UTM نیز وجود دارد که کاربردهای گسترده ای در نقشه برداری و مهندسی عمران دارد.
اگر تمایل دارید تا به کتابخانه ها و ابزارهای بیشتری برای استفاده در پروژه های خود دسترسی داشته باشید، فعالیت مورد نظر خود را از طریق شبکه های اجتماعی GeoMapZone به ما اطلاع دهید تا بهترین ابزارها را به شما معرفی کنیم.

منابع

1. Zhu, J. (1993) – "Conversion of Earth-centered, Earth-fixed coordinates to geodetic coordinates", NOAA Technical Report.
2. Olson, D. K. (1996) – "Converting Earth-Centered, Earth-Fixed Coordinates to Geodetic Coordinates", JPL Technical Report.
3. Wikipedia – Geographic coordinate conversion 

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

پیمایش به بالا