دادههای مکانی
این صفحه مبنای استاندارد ما برای نگهداری مختصات در پروژههاست. از این به بعد هرجا قرار باشد موقعیت، نقطه، محدوده، مسیر یا هر دادهی مکانی دیگری ذخیره شود، باید از این قرارداد پیروی کند.
تصمیم اصلی
مختصات نباید بهصورت چند فیلد پراکنده و بدون قرارداد نگهداری شوند. ساختار استاندارد ما:
- یک ستون اصلی مکانی برای ذخیره و کوئری
- یک نمایش مناسب API برای خروجی
- ورودیهای مشخص و قابلاعتبارسنجی برای ثبت مختصات
- تبدیل صریح بین UTM، lat/lon و geometry
این یعنی:
- منبع حقیقت مختصات، ستون
geometryاست. - اگر API به JSON نیاز دارد، آن JSON باید از روی
geometryساخته شود. latitudeوlongitudeیاxوyفقط ورودی یا داده خام مهاجرت هستند، نه ساختار نهایی جستجو.
چرا این ساختار را انتخاب میکنیم؟
چون نیازهای واقعی پروژهها معمولا یکی یا چند مورد از اینها هستند:
- نمایش روی نقشه
- فیلتر در محدوده فعلی نقشه
- پیدا کردن نزدیکترین رکورد
- تشخیص اینکه یک نقطه داخل کدام محدوده قرار دارد
- محاسبه فاصله، مساحت یا همپوشانی
در این سناریوها، نگهداری داده بهصورت latitude / longitude پراکنده یا GeoJSON خام در JSON، خیلی زود باعث میشود کوئریها کند، پیچیده و سختاعتماد شوند. PostGIS این مشکل را با ذخیرهسازی native، ایندکس مکانی و توابع استاندارد حل میکند.
ساختار استاندارد فیلدهای مختصات
ستون اصلی: location
این ستون مبنای همه کوئریهای مکانی است و باید از نوع geometry(..., 4326) باشد.
کار این ستون:
- منبع نهایی و قابلاتکای مختصات
- پایه ایندکس GiST
- مبنای BBox، Nearby، Point-in-Polygon و سایر کوئریها
نمایش خروجی: geojson
اگر API یا فرانت نیاز به ساختار JSON داشته باشد، آن را از location تولید میکنیم؛ نه اینکه GeoJSON را دستی جداگانه نگه داریم.
کار این فیلد:
- خروجی استاندارد برای API
- مصرف راحتتر در Frontend
- جلوگیری از چندبار تبدیل در لایه اپلیکیشن
فیلدهای ورودی خام
بسته به منبع داده، پروژه ممکن است یکی از این شکلها را دریافت کند:
latitude/longitudex/y/zoneبرای UTMGeoJSONخام- فایل Shape / KML / سایر فرمتهای ورودی
اینها ساختار نهایی نیستند. همه باید در نهایت به location تبدیل شوند.
تعریف دقیق هر نوع مختصات
lat/lon
latitudeیعنی عرض جغرافیاییlongitudeیعنی طول جغرافیایی- مبنای پیشنهادی برای ذخیره نهایی در PostGIS:
EPSG:4326 - بازه معتبر:
latitude: از-90تا90longitude: از-180تا180
برای ایران، بیشتر دادهها معمولا در این بازه هستند:
latitude: تقریبا بین25تا40longitude: تقریبا بین44تا64
UTM
xیا Easting: فاصله افقی در سیستم UTMyیا Northing: فاصله عمودی در سیستم UTMzone: زون UTM- برای ایران، در خیلی از سناریوها
Zone 39Nرایج است، ولی نباید بدون بررسی برای همه دادهها فرض شود
UTM برای ورود دادههای نقشهبرداری و ثبتی رایج است، اما ساختار ذخیرهسازی نهایی پروژه نیست. این داده باید به WGS84 تبدیل و سپس در location ذخیره شود.
GeoJSON
GeoJSON برای تبادل داده مناسب است، اما برای کوئری مکانی سنگین، ستون اصلی مناسبی نیست. اگر داده از بیرون به شکل GeoJSON میآید، باید Parse و به geometry تبدیل شود.
چه چیزی را استاندارد میکنیم؟
از این به بعد برای فیلدهای مختصات پروژهها این موارد استاندارد هستند:
- ذخیره نهایی روی
location geometry(..., 4326) - ایندکس مکانی
GiSTرویlocation - تولید
geojsonاز رویlocationدر صورت نیاز API - تبدیل صریح ورودیهای UTM یا lat/lon به
location - جلوگیری از کوئری مستقیم روی JSON خام