پریسا رشیدی نژاد
پریسا رشیدی نژاد
خواندن ۳ دقیقه·۴ سال پیش

آموزش رج زدن نقشه به روش PostGIS!

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

حالا قالیبافی چه ربطی به PostGIS داره؟

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


کجا استفاده میشه؟

من خودم دو جا توی کارم ازش استفاده کردم، یکی اینکه میخواستم روی سرویس آدرس یابی شرکت map.ir تست کیفیت انجام بدم. این سرویس این طوری کار میکنه که شما یه مختصات جغرافیایی بهش میدین و جزییات اون مختصات مثل اینکه توی کدوم شهره، توی کدوم محله است، نزدیک ترین خیابان اصلی بهش چیه و ... رو توی خروجی بهتون میده. پس من احتیاج داشتم تعداد زیادی نقطه داشته باشم، که کل ایران رو پوشش بده و جایی نباشه که نقطه ایی انتخاب نکرده باشیم و تست نشده باقی بمونه.

دومین کاربردی که برای من داشته، به دست آوردن آب و هوای نقطه به نقطه ی ایران بود. در واقع این نقاطی که بدست آوردم یه نماینده برای آب و هوای بقیه ی نقاط نزدیک خودشون به شعاع مثلا ۵۰ متری بودن.




مراحل انجام اینکار رو توی گیت هاب با توضیحات گذاشتم، اما میخواستم یه کم بیشتر توی این پست توضیحش بدم.(البته کلا کار سختی نیست)

https://github.com/ParisaRashidi/postgres_geo_functions

قدم اول یه جدول برای ذخیره ی مختصات نقاطمون ایجاد میکنیم:

create table tbl_grid ( lat double precision, long double precision );

قدم دوم که اصلی ترین قسمته کاره، ایجاد متد زیر در پست گرسه:

https://gist.github.com/ParisaRashidi/463f369d50c5764025eca375e3fce79d



با اجرا کردن این متد جدولی که ابتدای کار برای ذخیره کردن مختصات نقاط ایجاد کردیم، پر میشه.

برای ورودی متد به مختصات دو تا نقطه احتیاج داریم که بقیه ی نقاط رو داخل این چارچوب بچینیم.

(این نقاط، توی تصویر بالا به اسم point1 , point2 مشخص شدن)

وارد سایت map.ir بشین و مطابق دو تصویر زیر با راست کلیک کردن مختصات نقطه ی اول و همین طور دوم رو کپی کنید.

گزینه ی اینجا کجاست مختصات نقطه به همراه آدرسش رو بهتون میده
گزینه ی اینجا کجاست مختصات نقطه به همراه آدرسش رو بهتون میده
 اولین عددی که نوشته شده طول و دومین عدد عرض جغرافیایی هست.
اولین عددی که نوشته شده طول و دومین عدد عرض جغرافیایی هست.

بدین ترتیب چهار تا از ورودی های تابع ما برای چهارچوب (BBOX) کل ایران به این صورت میشه:

latitudePoint1 = 25.482951 latitudePoint2 = 39.095963 longitudePoint1 = 45.131836 longitudePoint2 = 63.193359

میمونه دو تا ورودی آخر تابع که طول و عرض فاصله ی نقاط از همدیگه هستن، مثلا من عدد ۱۰ رو قرار میدم و تابع رو اجرا میکنم.

select point_distributor(25.284438,38.065392, 45.307617,63.105469,10, 10);

که چون خروجی تابع void هست هیچی برنمیگردونه اما با اجرا کردن این دستور خروجی تابع که جدول tbl_grid هست رو میتونید ببینید:

select st_setsrid(st_makepoint(long,lat),4326) from tbl_grid;

البته برای اینکه بتونید از تابع st_makepoint استفاده کنید، قبلش باید اکستنشن postgis رو به پست گرس اضافه کرده باشین.

CREATE EXTENSION IF NOT EXISTS postgis;





postgresmapopenstreetmap
یه همسر، یه مادر، یه مهندس داده در map.ir
شاید از این پست‌ها خوشتان بیاید