تبدیل یک Shapefile به DataFrame در پایتون
داده های مکانی در پایتون
کاربرد علم داده اغلب نیاز به کار با داده ها در فضای جغرافیایی دارد. Shapefiles فایل هایی هستند که داده های مکانی را که با استفاده از یک پایگاه داده مبتنی بر فایل سازماندهی شده اند ذخیره می کنند. Shapefiles توسط متخصصان GIS، سازمان های دولتی محلی و مشاغل برای نقشه برداری و تجزیه و تحلیل استفاده می شود.
در این مطلب روشی زیبا برای کار با داده های مکانی در پایتون را از طریق یک مثال عملی شرح خواهیم داد. برای این کار از GeoPandas، یک کتابخانه پایتون برای کار با داده های مکانی مانند ترسیم، تجزیه و تحلیل و نقشه برداری استفاده خواهیم کرد. GeoPandas کتابخانه بسیار محبوب پانداها را برای رسیدگی به داده های جغرافیایی گسترش میدهد. همچنین به نحوه رسم نتایج با استفاده از matplotlib اشاره خواهیم کرد.
GeoPandas را می توان از طریق دستور زیر نصب کرد:
pip3 install geopandas
بارگذاری مجموعه داده:
برای بارگذاری یک مجموعه داده جغرافیایی، میتوانیم از تابع read_file() استفاده کنیم که به طور خودکار فرمت مجموعه داده را شناسایی میکند. اگر فایل shapefileباشد، باید مطمئن شویم که پوشه حاوی shapefile شامل فایلهای .prj، .dbf و .shx نیز باشد.
در این آموزش، از یک مجموعه داده حاوی نقاط مورد علاقه ایتالیایی که توسط Map Cruzin ارائه شده است، استفاده میکنیم. این شکل فایل از OpenStreetMap.org مشتق شده و تحت مجوز Open Data Commons Open Database (ODbL) است.
import geopandas as gpddf = gpd.read_file('../../Datasets/italy-points-shape/points.shp') df.head()
فیلد هندسی ممکن است شامل نقاط، چند خط، چند ضلعی و غیره باشد. مجموعه داده ممکن است حاوی بیش از یک فیلد هندسی باشد، اما فقط یک فیلد هندسی را می توان به عنوان فعال تنظیم کرد. این کار از طریق تابع set_geometry() قابل انجام است.
df = df.set_geometry('geometry')
فایل به عنوان یک دیتافریم GeoPandas بارگذاری میشود. از آنجایی که GeoPandas Dataframe یک زیر کلاس از Pandas Dataframe است، میتوانیم از تمام متدهای Pandas Dataframe با GeoPandas Dataframe خود استفاده کنیم. به عنوان مثال، میتوانیم تعداد رکوردها را از طریق ویژگی shape نشان دهیم:
df.shape
مجموعه داده شامل 47427 فایل است.
نمودار دادهها:
می توانیم اولین نقشه را از طریق تابع plot() ارائه شده توسط GeoPandas رسم کنیم. اگر یک فایل حاوی بیش از یک هندسه باشد
df.plot()
نقشه قبلی خیلی کوچک است، بنابراین با استفاده از matplotlib می توان آن را بهبود بخشید. در مرحله اول، می توانیم اندازه شکل را افزایش دهیم. یک subplot() با اندازه دلخواه تعریف می کنیم و سپس متغیر ax را به نمودار GeoDataFrame منتقل می کنیم:
import matplotlib.pyplot as pltfig, ax = plt.subplots(1, 1, figsize=(15, 15)) df.plot(ax=ax)
همچنین میتوانیم رنگ نقاط را با توجه به نوع ستون تغییر دهیم.
len(df['type'].value_counts())
301 نوع مختلف وجود دارد. برای خوانایی بیشتر نقشه، انواع با امتیاز کمتر از 300 را رها می کنیم.
target_types = df[‘type’].value_counts() > 300 tc = target_types[target_types == True].indexdef myfilter(x): return x in tcdf['delete'] = df['type'].apply(lambda x: myfilter(x)) df = df[df['delete']]
اکنون تعداد انواع باقی مانده را بررسی می کنیم .
len(df['type'].value_counts())
26 نوع وجود دارد.
اکنون نقشه Chorophlet را ، به سادگی با ارسال ویژگی ستون به تابع plot() رسم می کنیم. می توانیم با تنظیم legend=True نمودار را نشان دهیم.
fig, ax = plt.subplots(1, 1, figsize=(15, 15)) df.plot(ax=ax, column='type', legend=True, cmap='viridis')
جالب است بدانید که اکثر نقاط دیدنی در شمال ایتالیا واقع شده اند.
عملیات در هندسه:
GeoPandas اجازه می دهد تا بسیاری از عملیات را مستقیماً در زمینه هندسه انجام دهید. به عنوان مثال، می توانیم فاصله هر نقطه را از یک نقطه مشخص، یعنی رم، که پایتخت ایتالیا است، محاسبه کنیم. برای انجام این عمل از طریق تابع points_from_xy () مختصات را به هندسه تبدیل می کنیم:
rome_longitude = [12.496365] rome_latitude = [41.902782] rome_point = gpd.points_from_xy(rome_longitude,rome_latitude)
سپس فاصله هر نقطه را از rom_point بر حسب df محاسبه می کنیم. از تابع distance() استفاده می کنیم که برای هندسه فعال اعمال میشود:
df['distance'] = df['geometry'].distance(rome_point[0])
من مجموعه داده را با افزایش فاصله نظمدهی میکنیم:
df = df.sort_values(by=’distance’, ascending=True)
در نهایت، فقط نقاط دیدنی نزدیک رم را انتخاب می کنم، یعنی فاصله کمتر از 0.2
df_rome = df[df['distance'] < 0.2]
سپس، دیتافریم حاصل را رسم می کنیم:
fig, ax = plt.subplots(1, 1, figsize=(15, 15)) df_rome.plot(ax=ax, column='type', legend=True, cmap='viridis')
دیدگاهتان را بنویسید