使用Python實現子區域資料分類統計

2021-07-27 13:48:59 字數 2796 閱讀 4900

前言 geopandas簡介

子區域資料分類統計

總結

最近碰到乙個需求,需要統計某省內的所有市的某資料分布情況資訊。現有該省的資料分布情況以及該省的行政區劃資料。我通過geopandas庫實現了這一需求,在這裡簡單記錄之,供需要的人借鑑。

想必大家對pandas都不陌生,它是乙個開源的強大的python資料分析工具。pandas確實做到了靈活、快速、高效的進行資料處理,而geopandas是在pandas的基礎上新增了對空間資料的支援,實現了讀取空間資料以及對空間資料進行處理。關於其介紹和安裝等請參考其github主頁,本文不再贅述。

直接進入正題,現有某省的分類統計資料shp檔案以及此省的行政區劃資料shp檔案。

為了使用geopandas庫,首先需要將其引入。**如下:

from geopandas import

*

然後從該省的分類統計資料shp檔案中讀出此資料。**如下:

provincedata = geodataframe.from_file(provinceshpfile)

**很簡單,只要給geodataframe.from_file函式傳入shp檔案路徑即可,其得到的是乙個geodataframe物件,類似於pandas中的dataframe,區別會在下文講到。同理,行政區劃資料通過以下**讀入:

regiondata = geodataframe.from_file(regionshppath)

要使上述兩個資料能夠進行處理必須先要將其轉換成相同的投影。geopandas進行投影轉換很簡單。**如下:

gpd_new=gpd.to_crs(crs)

其中gpd表示原始資料,gpd_new為轉換後的資料,crs表示需要轉換的投影引數,在中對此引數進行了詳細描述,大家可以參照。

所以我們只需要將上述兩種資料轉換到同一投影即可,問題是假設我們不知道它們的投影型別,那麼也很容易,只需要將其都轉換成4326或其他投影即可,這樣就能保證二者轉換後為同一投影。但是問題又來了,如果該省分類資料特別大將會導致投影轉換耗時過長。其實此處有個簡單方法,我們只需要讀出分類資料的crs並將行政區劃資料轉換成此投影即可,這樣不僅**簡單而且能夠節省大量時間。**如下:

regiondata_crs = regiondata.to_crs(provincedata.crs)

現在二者投影已經相同,我們不得不面對最核心的問題,如何能夠從省的分類資料中提取出逐市分類資料情況。我們可以想到必須要將每個市的空間資料與該省的所有分類資料進行相交判斷,判斷哪些分類資料與該市相交,然後完成相應處理。

首先對行政區劃資料進行迴圈得到每個市的空間資料。**如下:

for i in

range(0, len(regiondata_crs)):

geo = regiondata_crs.geometry[i]

name = regiondata_crs.name[i]

其中geo就是取到的當前市的空間資料,可以看出geodataframe與dataframe的區別就在於多了乙個geometry欄位,它包含了資料的空間資訊,可以對該字段進行空間操作。假設該shp檔案還包含了乙個name屬性,那麼我們就可以用「.name」的方式提取出當前市的name資料,其他屬性同理。

有了geo之後就可以將其與省的分類資料中的每乙個物件進行相交判斷(迴圈判斷),根據結果進行相應處理。這裡我們假設統計不同種類資料的面積值,即每種型別的資料在該市所佔面積大小。**如下:

area = {}

for i in

range(0, len(provincedata)):

geo_province = provincedata.geometry[i]

id=str(provincedata.id[i])

if geo_province.intersects(geo) and geo_province.is_valid :

temp_geo = geo_province.intersection(geo)

temp_area = temp_geo.area

if area.get(id) ==

none:

area[id] = temp_area

else :

area[id] = area.get(id) + temp_area

其中area為字典物件,用來儲存不同資料在該市所佔面積。

首先通過provincedata.geometry[i]獲取該資料的空間資訊geo_province,然後使用provincedata.id[i]取出該資料的編號值id。

geo_province.intersects(geo)用來判斷該資料與當前市(geo)在空間上是否相交,geo_province.is_valid用來判斷該資料是否合法,有無自相交環等。

如果相交則進行處理,首先通過geo_province.intersection(geo)來獲取相交的部分temp_geo,然後通過temp_geo.area獲取相交部分的面積temp_area。可以看出在geopandas中只需要對geometry物件使用area屬性即可獲取其面積。

最後將面積以id為key儲存到area字典當中。

這樣就可以實現對該省的分類統計資料進行進一步細分,取出每個市的資料分類資訊。當然並一定侷限於省和市,比如全球和國家或者國家和省等。只要存在包含關係即可通過此種方式進行處理。這是雞年的第一篇部落格,願所有人今年都能有個好的結果!

使用Python實現子區域資料分類統計

前言geopandas簡介 子區域資料分類統計 總結最近碰到乙個需求,需要統計某省內的所有市的某資料分布情況資訊。現有該省的資料分布情況以及該省的行政區劃資料。我通過geopandas庫實現了這一需求,在這裡簡單記錄之,供需要的人借鑑。想必大家對pandas都不陌生,它是乙個開源的強大的python...

Python中二維列表如何獲取子區域元素的組成

用過numpy的應該都知道,在二維陣列中可以方便地使用區域切片功能,如下圖 而這個功能在python標準庫的list中是不支援的,在list中只能以一維方式來進行切片操作 但有時候我只想用一下這個功能,但又不想引入numpy。其實這時候我也是可以在python中實現的。這時候,只需在乙個類中實現 g...

130 被包圍的區域python實現

題目描述 給定乙個二維的矩陣,包含 x 和 o 字母 o 找到所有被 x 圍繞的區域,並將這些區域裡所有的 o 用 x 填充。參考別人的思路,用dfs寫了以下 遇到了一些坑。class solution object defsolve self,board type board list list ...