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.

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.

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.

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.