← GAT dasturlash

GeoPandas bilan vektor ma'lumot tahlili

GeoPandas bilan vektor ma'lumot tahlili

Kirish

GeoPandas — Python’da vektor fazoviy ma’lumotni jadval ko’rinishida o’qish, tahlil qilish va saqlash uchun ochiq kodli kutubxonadir. U pandas jadvallariga geometriya ustunini qo’shadi, geometrik amallarni esa Shapely, fayl o’qish-yozishni GDAL asosidagi vositalar orqali bajaradi.

Natijada QGIS’da qo’lda bajariladigan ko’p amal — qatlamni ochish, atribut bo’yicha tanlash, qayta proyeksiyalash, nuqtalarni hududlarga biriktirish — bir necha qator kodga aylanadi. Kod qayta ishga tushirilganda xuddi shu jarayon yangi ma’lumot ustida aynan takrorlanadi. Kutubxona pip install geopandas buyrug’i yoki conda-forge kanali orqali o’rnatiladi; har loyiha uchun alohida virtual muhit yaratish versiyalar to’qnashuvining oldini oladi.

GeoDataFrame tuzilishi

GeoPandas’ning asosiy obyekti — GeoDataFrame. Uning har bir satri bitta fazoviy obyekt, har bir ustuni bitta atribut. Ustunlardan biri faol geometriya ustuni bo’lib, unda nuqta, chiziq yoki poligon saqlanadi. Jadval bilan birga koordinata ma’lumotnoma tizimi (CRS) ham saqlanadi.

Bu tuzilma GAT dasturidagi atribut jadvaliga juda yaqin. Farqi shundaki, filtrlash, guruhlash va hisoblash pandas buyruqlari bilan bajariladi. GeoPandas qo’llanmasi GeoDataFrame va GeoSeries tuzilmalarini batafsil izohlaydi.

GeoDataFrame jadvalidagi atribut ustunlari, geometriya ustuni va CRS yorlig'ining xaritadagi obyektlar bilan bog'lanishi

O’qish va dastlabki tekshiruv

Qatlam read_file funksiyasi bilan o’qiladi; GeoPackage, Shapefile va GeoJSON kabi keng tarqalgan formatlar qo’llab-quvvatlanadi. O’qishdan keyin tahlilga shoshilmasdan, avval qatlamning holati tekshiriladi:

import geopandas as gpd

maktablar = gpd.read_file("data/maktablar.gpkg")
tumanlar = gpd.read_file("data/tumanlar.gpkg")

print(maktablar.crs)                          # masalan, EPSG:4326
print(len(maktablar), maktablar.geom_type.unique())
print((~maktablar.is_valid).sum(), maktablar.geometry.isna().sum())

Bu uch qator CRS, obyektlar soni, geometriya turi, yaroqsiz va bo’sh geometriyalar haqida ma’lumot beradi. Kutilgan son bilan farq bo’lsa yoki CRS None chiqsa, keyingi hisob ishonchsiz bo’ladi. CRS noma’lum bo’lsa, uni taxmin bilan belgilash emas, manbadan aniqlash kerak.

Atribut bo’yicha tanlash

GeoDataFrame oddiy pandas jadvali kabi filtrlanadi. Shart bajarilgan satrlar geometriyasi bilan birga yangi qatlam bo’lib qoladi:

katta = maktablar[maktablar["oquvchi_soni"] > 1000]
noaniq = maktablar[maktablar["oquvchi_soni"].isna()]

Ikkinchi qator muhim: NULL qiymatli satrlar hech qanday taqqoslash shartiga tushmaydi va jimgina tushib qoladi. Shuning uchun bo’sh qiymatlar alohida sanaladi va natija hisobotida ko’rsatiladi. Matnli maydonda imlo farqlari, masalan “Yunusobod” va “Yunusobod tumani”, ham filtr natijasini kamaytiradi.

CRS va o’lchov

Darajadagi kenglik-uzunlik bilan maydon yoki masofa hisoblab bo’lmaydi. Shuning uchun o’lchovdan oldin qatlam metrli proyeksiyaga o’tkaziladi. Toshkent, Samarqand va 66–72° sharqiy uzunlik oralig’idagi boshqa hududlar uchun WGS 84 / UTM 42N (EPSG:32642) mos keladi:

maktablar = maktablar.to_crs(32642)
tumanlar = tumanlar.to_crs(32642)
tumanlar["maydon_km2"] = tumanlar.area / 1_000_000

to_crs koordinatalarni qayta hisoblaydi, set_crs esa faqat yorliq qo’yadi — ularni almashtirish keng tarqalgan xatodir. O’zbekiston hududi g’arbdan sharqqa to’rtta UTM zonasini (40N–43N) kesib o’tadi: masalan, Xorazm 41N, Andijonning sharqiy chekkasi esa 43N zonasiga tushadi. Shu sababli butun mamlakat bo’yicha hisobda bitta zona emas, respublika uchun mos yagona proyeksiya oldindan tanlanadi. Bu mavzu koordinata tizimi va qayta proyeksiyalash maqolasida batafsil yoritilgan.

GeoPandas ish oqimi: faylni o'qish, CRS va geometriyani tekshirish, metrli CRSga o'tkazish, tahlil qilish va GeoPackage'ga saqlash

Fazoviy birlashtirish

Fazoviy birlashtirish (spatial join) ikki qatlamni umumiy kalit emas, joylashuv munosabati orqali bog’laydi. Masalan, har bir maktabga u joylashgan tuman nomini yozish:

natija = gpd.sjoin(maktablar, tumanlar[["tuman", "geometry"]],
                   how="left", predicate="within")

print(natija["tuman"].isna().sum())   # hech bir tumanga tushmaganlar
print(natija.groupby("tuman").size())  # tumanlar kesimida maktablar soni

how="left" barcha maktablarni saqlaydi va mos tuman topilmaganini bo’sh qiymat bilan ko’rsatadi. within sharti chegara chizig’i ustidagi nuqtani tumanga kiritmaydi; bunday holatda intersects ishlatilishi mumkin. Agar tuman poligonlari ustma-ust tushsa, bitta maktab ikki marta chiqadi — natija satrlari soni manba bilan solishtiriladi.

Maktab nuqtalarining tuman poligonlariga fazoviy birlashtirilishi va natija jadvalida tuman ustunining paydo bo'lishi

Natijani saqlash

Natija manba fayl ustiga emas, alohida faylga yoziladi. GeoPackage bir faylda bir nechta qatlamni, uzun maydon nomlarini va CRS’ni saqlay oladi:

natija.to_file("natija/maktablar_tuman.gpkg", layer="maktablar")

Saqlangan faylni QGIS’da ochib, bir nechta obyektni xaritada ko’zdan kechirish avtomatik tekshiruvni to’ldiradi. Skript bilan birga kutubxona versiyalari va kirish fayllari ro’yxati yozib qo’yilsa, tahlilni keyinchalik aynan tiklash mumkin bo’ladi.

Xulosa

GeoPandas vektor qatlamni jadval mantiqida boshqarish imkonini beradi: o’qish, tekshirish, qayta proyeksiyalash, fazoviy birlashtirish va saqlash bir skriptda izchil bajariladi.

Kodning ishonchliligi esa sintaksisga emas, CRS, geometriya yaroqliligi va fazoviy munosabat shartini to’g’ri tanlashga bog’liq.