Python 讀取.shp文件并生成圖幅編號(hào)的實(shí)現(xiàn)思路
代碼適用于需要處理和分析地理空間數(shù)據(jù)的場(chǎng)景,如城市規(guī)劃、環(huán)境監(jiān)測(cè)或自然資源管理,其中它可以幫助用戶讀取特定區(qū)域的Shapefile文件,確定其地理邊界,并基于這些邊界計(jì)算出按照經(jīng)緯度5度間隔的圖幅編號(hào),進(jìn)而用于地圖制作、空間數(shù)據(jù)管理和快速數(shù)據(jù)檢索。
實(shí)現(xiàn)思路:
代碼主要用于處理地理空間數(shù)據(jù),具體功能如下:
- 讀取一個(gè)Shapefile(
.shp
)文件,獲取其地理邊界范圍。 - 根據(jù)獲取的邊界范圍,計(jì)算出按照經(jīng)緯度
5°
間隔的圖幅編號(hào)。 - 將每個(gè)國(guó)家的地圖邊界范圍和對(duì)應(yīng)的圖幅編號(hào)存儲(chǔ)起來(lái),并打印出來(lái)。
完整代碼
import csv import geopandas as gpd def get_map_extent(shp_file_path): """ 讀取.shp文件并獲取其邊界范圍。 :param shp_file_path: .shp文件路徑 :return: 地圖邊界的范圍 (minx, miny, maxx, maxy) """ # 讀取.shp文件 gdf = gpd.read_file(shp_file_path) # 獲取地圖邊界 boundary = gdf.geometry.total_bounds # 返回地圖范圍 return boundary def calculate_sheet_ranges(map_extent): """ 根據(jù)地圖邊界計(jì)算圖幅范圍,并按照南北緯和東西經(jīng)的5度分隔規(guī)則返回圖幅范圍的格式。 :param map_extent: 地圖邊界的范圍 (minx, miny, maxx, maxy) :return: 圖幅范圍列表,每個(gè)元素包含(lon_start, lat_start, lon_end, lat_end, sheet_range) """ minx, miny, maxx, maxy = map_extent # 初始化圖幅范圍列表 sheet_ranges = [] # 計(jì)算圖幅編號(hào) # for lon_start in range(int(minx // 5) * 5, int(maxx // 5 + 1) * 5, 5): # for lat_start in range(int(miny // 5) * 5, int(maxy // 5 + 1) * 5, 5): for lon_start in range(int(minx // 5) * 5, int(maxx // 5 + 1) * 5, 5): for lat_start in range(int(miny // 5 + 1) * 5, int(maxy // 5 + 2) * 5, 5): # GLC_FCS30D 緯度需要上調(diào)一格5度 lon_end = lon_start + 5 lat_end = lat_start + 5 sheet_range = f"{'W' if lon_start < 0 else 'E'}{abs(lon_start)}" \ f"{'S' if lat_start < 0 else 'N'}{abs(lat_start)}" sheet_ranges.append(sheet_range) return sheet_ranges def main(): iso_data = [] with open('../../ISO.csv', newline='') as csvfile: # 創(chuàng)建 CSV 讀取器 csv_reader = csv.reader(csvfile) data = list(csv_reader) # 將文件內(nèi)容讀取到內(nèi)存中 # 初始化行數(shù)計(jì)數(shù)器 iso_count = 0 for country in data: iso_count += 1 sids_country = country[0] iso_map_extent = [iso_count, sids_country] # [1, 'BMU'] # 示例文件路徑 shp_file_path = fr'path_to_admin_division\{sids_country}.shp' # 獲取地圖范圍 map_extent = get_map_extent(shp_file_path=shp_file_path) # 計(jì)算圖幅范圍 sheet_ranges = calculate_sheet_ranges(map_extent=map_extent) # 打印結(jié)果 print(iso_count, sids_country, map_extent) iso_map_extent.extend(sheet_ranges) iso_data.append(iso_map_extent) print('- Map Extent Num: ', len(sheet_ranges), iso_map_extent[2:], '\n') if __name__ == '__main__': main()
實(shí)現(xiàn)流程:
- 導(dǎo)入庫(kù):導(dǎo)入csv庫(kù)用于讀取CSV文件,導(dǎo)入geopandas庫(kù)用于處理地理空間數(shù)據(jù)。
- 定義get_map_extent函數(shù):該函數(shù)接收一個(gè).shp文件路徑作為參數(shù),讀取該文件,并返回其地理邊界范圍。
- 定義calculate_sheet_ranges函數(shù):該函數(shù)接收一個(gè)邊界范圍作為參數(shù),計(jì)算并返回一個(gè)圖幅編號(hào)列表。圖幅編號(hào)的計(jì)算規(guī)則是按照經(jīng)緯度5度的間隔。
- 定義main函數(shù):這是程序的主要執(zhí)行函數(shù)。它首先讀取一個(gè)CSV文件,然后對(duì)于CSV文件中的每一個(gè)條目,執(zhí)行以下步驟:
- 構(gòu)造.shp文件路徑。
- 調(diào)用get_map_extent函數(shù)獲取地圖邊界范圍。
- 調(diào)用calculate_sheet_ranges函數(shù)計(jì)算圖幅編號(hào)。
- 打印出當(dāng)前處理的國(guó)家和其地圖邊界范圍。
- 將地圖邊界范圍和圖幅編號(hào)添加到結(jié)果列表中。
執(zhí)行入口:如果該腳本作為主程序運(yùn)行,將調(diào)用main函數(shù)。
代碼運(yùn)行示例: 預(yù)備Shapefile文件:
程序輸出:
應(yīng)用范圍:
- 地理信息系統(tǒng)(GIS):用于處理和分析地理空間數(shù)據(jù)。
- 地圖制作:確定地圖的邊界范圍和圖幅編號(hào),有助于地圖的制作和布局。
- 空間數(shù)據(jù)分析:在進(jìn)行空間數(shù)據(jù)分析時(shí),可以利用此腳本快速獲取地圖邊界和圖幅編號(hào),進(jìn)而進(jìn)行更深入的分析。
- 科研和教育:在地理學(xué)、城市規(guī)劃、環(huán)境科學(xué)等領(lǐng)域的研究和教學(xué)中,用于數(shù)據(jù)處理和分析。
注意事項(xiàng):
- 代碼中的
shp_file_path
是一個(gè)格式化字符串,需要根據(jù)實(shí)際的文件路徑進(jìn)行調(diào)整。 calculate_sheet_ranges
函數(shù)中的注釋掉的代碼塊可能是用于不同的計(jì)算規(guī)則或示例。- 代碼中的打印語(yǔ)句用于調(diào)試和驗(yàn)證,展示了每個(gè)國(guó)家的邊界范圍和圖幅編號(hào)。
相關(guān)函數(shù)及調(diào)用庫(kù)的解釋說(shuō)明:
函數(shù)及調(diào)用庫(kù) | 描述 |
---|---|
csv | Python標(biāo)準(zhǔn)庫(kù)中的模塊,用于讀寫CSV(逗號(hào)分隔值)文件。在此代碼中,它被用來(lái)讀取包含國(guó)家信息的CSV文件。 |
geopandas | 一個(gè)開源項(xiàng)目,擴(kuò)展了pandas庫(kù)的功能,使其能夠處理地理空間數(shù)據(jù)。它允許用戶讀取、處理和分析地理空間數(shù)據(jù)。 |
get_map_extent(shp_file_path) | 此函數(shù)接收一個(gè)Shapefile的文件路徑作為參數(shù),使用geopandas的read_file 方法讀取Shapefile,并獲取其幾何邊界。返回值是一個(gè)包含最小經(jīng)度、最小緯度、最大經(jīng)度、最大緯度的元組。 |
calculate_sheet_ranges(map_extent) | 此函數(shù)接收一個(gè)地圖邊界范圍作為參數(shù),并基于這個(gè)范圍計(jì)算圖幅編號(hào)。按照南北緯和東西經(jīng)的5度間隔規(guī)則來(lái)劃分圖幅,并返回一個(gè)包含這些圖幅編號(hào)的列表。 |
到此這篇關(guān)于Python 讀取.shp文件并生成圖幅編號(hào)的文章就介紹到這了,更多相關(guān)Python 讀取.shp文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python中format函數(shù)與round函數(shù)的區(qū)別
大家好,本篇文章主要講的是python中format函數(shù)與round函數(shù)的區(qū)別,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01Python實(shí)現(xiàn)優(yōu)先級(jí)隊(duì)列結(jié)構(gòu)的方法詳解
優(yōu)先級(jí)隊(duì)列(priority queue)是0個(gè)或多個(gè)元素的集合,每個(gè)元素都有一個(gè)優(yōu)先權(quán),接下來(lái)就來(lái)看一下簡(jiǎn)潔的Python實(shí)現(xiàn)優(yōu)先級(jí)隊(duì)列結(jié)構(gòu)的方法詳解:2016-06-06Django token 生成與驗(yàn)證的實(shí)現(xiàn)
本文主要介紹了Django token 生成與驗(yàn)證的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04Python調(diào)用騰訊API進(jìn)行人像動(dòng)漫化效果實(shí)例
最近上網(wǎng)的時(shí)候看到了一個(gè)有趣的東西,叫做人物動(dòng)漫化,嘗試著用python實(shí)現(xiàn)了,所以下面這篇文章主要給大家介紹了關(guān)于Python調(diào)用騰訊API進(jìn)行人像動(dòng)漫化效果的相關(guān)資料,需要的朋友可以參考下2023-06-06PyQT中QTableWidget如何根據(jù)單元格內(nèi)容設(shè)置自動(dòng)寬度
這篇文章主要介紹了PyQT中QTableWidget如何根據(jù)單元格內(nèi)容設(shè)置自動(dòng)寬度問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05python 異步async庫(kù)的使用說(shuō)明
這篇文章主要介紹了python 異步async庫(kù)的使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05pandas中DataFrame的merge操作的實(shí)現(xiàn)
本文主要介紹了pandas中DataFrame的merge操作的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07python破解WiFi教程代碼,Python蹭網(wǎng)原理講解
用Python生成一個(gè)簡(jiǎn)單的密碼本,一般是有數(shù)字、字母和符號(hào)組成,這里用到的思路主要是窮舉法。通過(guò)使用pywifi?模塊,根據(jù)密碼本暴力破解WiFi。本文只是從技術(shù)的角度來(lái)闡述學(xué)習(xí)Pywifi庫(kù)!并不建議大家做任何破壞性的操作和任何不當(dāng)?shù)男袨椋?/div> 2023-01-01python中數(shù)據(jù)爬蟲requests庫(kù)使用方法詳解
本篇文章主要介紹了python中數(shù)據(jù)爬蟲requests庫(kù)使用方法詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02最新評(píng)論