Python 讀取.shp文件并生成圖幅編號的實現(xiàn)思路
代碼適用于需要處理和分析地理空間數(shù)據(jù)的場景,如城市規(guī)劃、環(huán)境監(jiān)測或自然資源管理,其中它可以幫助用戶讀取特定區(qū)域的Shapefile文件,確定其地理邊界,并基于這些邊界計算出按照經(jīng)緯度5度間隔的圖幅編號,進而用于地圖制作、空間數(shù)據(jù)管理和快速數(shù)據(jù)檢索。

實現(xiàn)思路:
代碼主要用于處理地理空間數(shù)據(jù),具體功能如下:
- 讀取一個Shapefile(
.shp)文件,獲取其地理邊界范圍。 - 根據(jù)獲取的邊界范圍,計算出按照經(jīng)緯度
5°間隔的圖幅編號。 - 將每個國家的地圖邊界范圍和對應(yīng)的圖幅編號存儲起來,并打印出來。
完整代碼
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īng)的5度分隔規(guī)則返回圖幅范圍的格式。
:param map_extent: 地圖邊界的范圍 (minx, miny, maxx, maxy)
:return: 圖幅范圍列表,每個元素包含(lon_start, lat_start, lon_end, lat_end, sheet_range)
"""
minx, miny, maxx, maxy = map_extent
# 初始化圖幅范圍列表
sheet_ranges = []
# 計算圖幅編號
# 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ù)計數(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)
# 計算圖幅范圍
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()實現(xiàn)流程:
- 導(dǎo)入庫:導(dǎo)入csv庫用于讀取CSV文件,導(dǎo)入geopandas庫用于處理地理空間數(shù)據(jù)。
- 定義get_map_extent函數(shù):該函數(shù)接收一個.shp文件路徑作為參數(shù),讀取該文件,并返回其地理邊界范圍。
- 定義calculate_sheet_ranges函數(shù):該函數(shù)接收一個邊界范圍作為參數(shù),計算并返回一個圖幅編號列表。圖幅編號的計算規(guī)則是按照經(jīng)緯度5度的間隔。
- 定義main函數(shù):這是程序的主要執(zhí)行函數(shù)。它首先讀取一個CSV文件,然后對于CSV文件中的每一個條目,執(zhí)行以下步驟:
- 構(gòu)造.shp文件路徑。
- 調(diào)用get_map_extent函數(shù)獲取地圖邊界范圍。
- 調(diào)用calculate_sheet_ranges函數(shù)計算圖幅編號。
- 打印出當(dāng)前處理的國家和其地圖邊界范圍。
- 將地圖邊界范圍和圖幅編號添加到結(jié)果列表中。
執(zhí)行入口:如果該腳本作為主程序運行,將調(diào)用main函數(shù)。
代碼運行示例: 預(yù)備Shapefile文件:

程序輸出:


應(yīng)用范圍:
- 地理信息系統(tǒng)(GIS):用于處理和分析地理空間數(shù)據(jù)。
- 地圖制作:確定地圖的邊界范圍和圖幅編號,有助于地圖的制作和布局。
- 空間數(shù)據(jù)分析:在進行空間數(shù)據(jù)分析時,可以利用此腳本快速獲取地圖邊界和圖幅編號,進而進行更深入的分析。
- 科研和教育:在地理學(xué)、城市規(guī)劃、環(huán)境科學(xué)等領(lǐng)域的研究和教學(xué)中,用于數(shù)據(jù)處理和分析。
注意事項:
- 代碼中的
shp_file_path是一個格式化字符串,需要根據(jù)實際的文件路徑進行調(diào)整。 calculate_sheet_ranges函數(shù)中的注釋掉的代碼塊可能是用于不同的計算規(guī)則或示例。- 代碼中的打印語句用于調(diào)試和驗證,展示了每個國家的邊界范圍和圖幅編號。
相關(guān)函數(shù)及調(diào)用庫的解釋說明:
| 函數(shù)及調(diào)用庫 | 描述 |
|---|---|
| csv | Python標(biāo)準(zhǔn)庫中的模塊,用于讀寫CSV(逗號分隔值)文件。在此代碼中,它被用來讀取包含國家信息的CSV文件。 |
| geopandas | 一個開源項目,擴展了pandas庫的功能,使其能夠處理地理空間數(shù)據(jù)。它允許用戶讀取、處理和分析地理空間數(shù)據(jù)。 |
| get_map_extent(shp_file_path) | 此函數(shù)接收一個Shapefile的文件路徑作為參數(shù),使用geopandas的read_file方法讀取Shapefile,并獲取其幾何邊界。返回值是一個包含最小經(jīng)度、最小緯度、最大經(jīng)度、最大緯度的元組。 |
| calculate_sheet_ranges(map_extent) | 此函數(shù)接收一個地圖邊界范圍作為參數(shù),并基于這個范圍計算圖幅編號。按照南北緯和東西經(jīng)的5度間隔規(guī)則來劃分圖幅,并返回一個包含這些圖幅編號的列表。 |
到此這篇關(guān)于Python 讀取.shp文件并生成圖幅編號的文章就介紹到這了,更多相關(guān)Python 讀取.shp文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django+Bootstrap實現(xiàn)計算器的示例代碼
本文主要介紹了Django+Bootstrap實現(xiàn)計算器的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11
一文詳細(xì)說說Python中常用的字符串和數(shù)組方法(面試官常問)
這篇文章主要為大家詳細(xì)介紹了Python中常用的字符串和數(shù)組方法,這也是面試中常常被問起的問題,下面小編就和大家詳細(xì)介紹一下吧,有需要的可以了解下2026-03-03
Pygame游戲開發(fā)之太空射擊實戰(zhàn)添加圖形篇
相信大多數(shù)8090后都玩過太空射擊游戲,在過去游戲不多的年代太空射擊自然屬于經(jīng)典好玩的一款了,今天我們來自己動手實現(xiàn)它,在編寫學(xué)習(xí)中回顧過往展望未來,在本課中,我們將討論如何在游戲中使用預(yù)先繪制的圖形2022-08-08
python3.7.3版本和django2.2.3版本是否可以兼容
在本篇文章里小編給大家整理的是一篇關(guān)于python3.7.3版本和django2.2.3版本是否可以兼容的相關(guān)知識點內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2020-09-09
Python使用ThreadPoolExecutor一次開啟多個線程
通過使用ThreadPoolExecutor,您可以同時開啟多個線程,從而提高程序的并發(fā)性能,本文就來介紹一下Python使用ThreadPoolExecutor一次開啟多個線程,感興趣的可以了解一下2023-11-11

