
在開(kāi)始提取前,需先判斷 TIF 文件的類型 —— 這直接決定了后續(xù)的技術(shù)方案。兩種核心形式的差異如下:
地名存在形式 | 適用 TIF 類型 | 核心特征 | 提取思路 |
---|---|---|---|
地理矢量屬性字段 | GeoTIFF(帶地理空間信息) | 地名存儲(chǔ)在矢量要素的屬性表中(如 Shapefile 關(guān)聯(lián)的 “NAME” 字段),TIF 本身是柵格底圖,地名不直接顯示在圖像上 | 讀取 TIF 的地理元數(shù)據(jù)→關(guān)聯(lián)矢量圖層→提取屬性字段中的地名 |
圖像可視化文字 | 普通 TIF(如掃描地圖、航拍圖) | 地名是圖像像素的一部分(如 “北京市朝陽(yáng)區(qū)” 標(biāo)注文字),無(wú)結(jié)構(gòu)化屬性,需識(shí)別圖像內(nèi)容 | 圖像預(yù)處理(去噪、灰度化)→OCR 文字識(shí)別→篩選地名 |
GeoTIFF 是帶有地理空間參考信息的 TIF 文件,常與矢量數(shù)據(jù)(如 Shapefile、GeoJSON)配套使用 —— 地名通常存儲(chǔ)在矢量要素的屬性表中(如居民點(diǎn)要素的 “NAME” 字段、道路要素的 “ROAD_NAME” 字段)。這種場(chǎng)景下,提取本質(zhì)是 “讀取地理數(shù)據(jù)的屬性信息”,核心依賴 GIS 相關(guān)庫(kù)。
GDAL/OGR:地理數(shù)據(jù)處理的底層庫(kù),支持讀取 GeoTIFF 的元數(shù)據(jù)及關(guān)聯(lián)的矢量文件;
Geopandas:基于 Pandas 的 GIS 擴(kuò)展庫(kù),簡(jiǎn)化矢量數(shù)據(jù)的讀取與屬性篩選,適合處理帶地名的矢量圖層;
Fiona:輕量級(jí)矢量數(shù)據(jù)讀取庫(kù),常與 Geopandas 配合使用,支持 Shapefile、GeoJSON 等格式。
需獲取與 GeoTIFF 配套的矢量文件(如 Shapefile 格式的.shp
文件,通常包含.shp
/.shx
/.dbf
/.prj
四個(gè)文件);
矢量文件的屬性表中需包含地名字段(如 “NAME”“地名”“CNAME”,可通過(guò) QGIS、ArcGIS 查看字段名);
GeoTIFF 與矢量文件需空間參考一致(如均為 WGS84 坐標(biāo)系),避免空間匹配偏差。
假設(shè)我們有一份 “某區(qū)域 GeoTIFF 底圖”,配套的residential.shp
矢量文件包含居民點(diǎn)要素,屬性表中 “NAME” 字段存儲(chǔ)地名。
GIS 庫(kù)在 Windows 環(huán)境下直接用pip
安裝可能報(bào)錯(cuò),建議用conda
(Anaconda/Miniconda)安裝:
# 創(chuàng)建conda環(huán)境(可選)
conda create -n gis_env python=3.9
conda activate gis_env
# 安裝核心庫(kù)
conda install -c conda-forge gdal geopandas fiona pandas
import geopandas as gpd
import pandas as pd
# 1. 讀取Shapefile矢量文件(包含居民點(diǎn)要素)
# 注意:需確保.shp/.shx/.dbf/.prj文件在同一目錄
gdf = gpd.read_file("residential.shp")
# 2. 查看矢量數(shù)據(jù)的基本信息(確認(rèn)字段名與地名字段)
print("矢量數(shù)據(jù)字段名:", gdf.columns.tolist()) # 輸出如['FID', 'NAME', 'POP', 'geometry']
print("n前5條數(shù)據(jù)的地理類型:", gdf.geom_type.head()) # 確認(rèn)是Point(點(diǎn)要素,對(duì)應(yīng)居民點(diǎn))
# 3. 篩選地名字段,去重并保存
# 提取"NAME"字段中的地名,排除空值和重復(fù)值
place_names = gdf["NAME"].dropna().drop_duplicates().tolist()
# 4. 查看結(jié)果并保存為CSV
print("n提取的地名列表(前10個(gè)):")
print(place_names[:10]) # 輸出如['張三村', '李四鎮(zhèn)', '王五社區(qū)', ...]
# 保存為CSV,便于后續(xù)使用
pd.DataFrame({"地名": place_names}).to_csv("extracted_place_names.csv", index=False, encoding="utf-8")
print("n地名已保存至 extracted_place_names.csv")
若需提取 “GeoTIFF 底圖覆蓋范圍內(nèi)” 的地名(排除矢量文件中超出底圖的要素),需先獲取 GeoTIFF 的空間范圍,再篩選矢量要素:
from osgeo import gdal
# 1. 讀取GeoTIFF,獲取其空間范圍(邊界框)
def get_geotiff_bbox(tif_path):
dataset = gdal.Open(tif_path)
if not dataset:
raise ValueError("無(wú)法打開(kāi)GeoTIFF文件")
# 獲取地理變換參數(shù)(左上角坐標(biāo)、分辨率等)
geotransform = dataset.GetGeoTransform()
# 計(jì)算邊界框(min_x, min_y, max_x, max_y)
min_x = geotransform[0]
max_y = geotransform[3]
max_x = min_x + dataset.RasterXSize * geotransform[1]
min_y = max_y + dataset.RasterYSize * geotransform[5]
dataset = None # 關(guān)閉文件
return (min_x, min_y, max_x, max_y)
# 2. 獲取GeoTIFF的邊界框
tif_bbox = get_geotiff_bbox("region.tif") # 替換為你的GeoTIFF路徑
min_x, min_y, max_x, max_y = tif_bbox
# 3. 篩選矢量要素中在邊界框內(nèi)的地名
# 創(chuàng)建邊界框的Polygon幾何對(duì)象
from shapely.geometry import box
bbox_geometry = box(min_x, min_y, max_x, max_y)
# 篩選與邊界框相交的居民點(diǎn)要素
gdf_in_bbox = gdf[gdf.intersects(bbox_geometry)]
# 提取地名
place_names_in_bbox = gdf_in_bbox["NAME"].dropna().drop_duplicates().tolist()
print("GeoTIFF范圍內(nèi)的地名數(shù)量:", len(place_names_in_bbox))
print("GeoTIFF范圍內(nèi)的地名(前10個(gè)):", place_names_in_bbox[:10])
若 TIF 是普通圖像(如掃描的紙質(zhì)地圖、無(wú)人機(jī)航拍圖),地名是圖像上的可視化文字(如印刷體標(biāo)注),則需通過(guò)OCR(光學(xué)字符識(shí)別) 技術(shù)提取。這種場(chǎng)景的核心是 “將圖像文字轉(zhuǎn)化為文本”,再通過(guò)簡(jiǎn)單篩選得到地名。
PIL/Pillow:Python 圖像處理庫(kù),用于 TIF 圖像的讀取、預(yù)處理(灰度化、二值化、去噪);
EasyOCR:輕量級(jí) OCR 庫(kù),支持多語(yǔ)言(含中文),識(shí)別準(zhǔn)確率高于傳統(tǒng)的 Tesseract,且無(wú)需復(fù)雜配置;
OpenCV(可選):用于更復(fù)雜的圖像預(yù)處理(如邊緣檢測(cè)、文字區(qū)域定位),提升 OCR 準(zhǔn)確率。
TIF 圖像中的地名需清晰可辨(避免模糊、傾斜、遮擋,否則 OCR 準(zhǔn)確率會(huì)大幅下降);
若識(shí)別中文地名,需確保 OCR 庫(kù)已下載中文模型(EasyOCR 會(huì)自動(dòng)下載,首次運(yùn)行需聯(lián)網(wǎng))。
假設(shè)我們有一份掃描的紙質(zhì)地圖 TIF(scan_map.tif
),圖像上有 “XX 路”“XX 鎮(zhèn)” 等地名標(biāo)注。
# 安裝Pillow和EasyOCR
pip install pillow easyocr opencv-python
普通 TIF 圖像可能存在噪聲、顏色干擾,需先預(yù)處理:
灰度化:將彩色圖像轉(zhuǎn)為灰度圖像,減少顏色通道干擾;
二值化:將灰度圖像轉(zhuǎn)為黑白二值圖像,突出文字與背景的對(duì)比;
去噪:去除圖像中的小點(diǎn)、雜色,避免 OCR 誤識(shí)別。
from PIL import Image
import numpy as np
import cv2
def preprocess_tif(tif_path):
# 1. 讀取TIF圖像(支持多頁(yè)TIF,此處取第一頁(yè))
img = Image.open(tif_path)
if img.mode == "CMYK":
img = img.convert("RGB") # 處理CMYK格式圖像
# 轉(zhuǎn)為OpenCV格式(BGR通道)
img_cv = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
# 2. 灰度化
gray = cv2.cvtColor(img_cv, cv2.COLOR_BGR2GRAY)
# 3. 二值化(自適應(yīng)閾值,適合光照不均勻的圖像)
# THRESH_BINARY_INV:文字為白色,背景為黑色
thresh = cv2.adaptiveThreshold(
gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2
)
# 4. 去噪( morphological opening,先腐蝕再膨脹)
kernel = np.ones((2, 2), np.uint8)
denoised = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1)
# 轉(zhuǎn)回PIL圖像,便于后續(xù)OCR
img_preprocessed = Image.fromarray(cv2.cvtColor(denoised, cv2.COLOR_BGR2RGB))
return img_preprocessed
# 預(yù)處理TIF圖像
preprocessed_img = preprocess_tif("scan_map.tif")
# 保存預(yù)處理后的圖像(可選,用于檢查效果)
preprocessed_img.save("preprocessed_map.png")
print("預(yù)處理完成,圖像已保存至 preprocessed_map.png")
OCR 會(huì)識(shí)別圖像中的所有文字(如數(shù)字、符號(hào)、無(wú)關(guān)說(shuō)明),需通過(guò) “地名特征” 篩選(如含 “市”“縣”“鎮(zhèn)”“村”“路”“街” 等關(guān)鍵詞):
import easyocr
def extract_place_names_from_ocr(img):
# 1. 初始化EasyOCR閱讀器(僅加載中文模型,減少內(nèi)存占用)
# lang_list=["ch_sim"]:中文簡(jiǎn)體,如需英文可加["en"]
reader = easyocr.Reader(lang_list=["ch_sim"], gpu=False) # gpu=True需安裝CUDA
# 2. 識(shí)別圖像文字(返回結(jié)果:[(文字區(qū)域坐標(biāo), 文字內(nèi)容, 置信度)])
result = reader.readtext(np.array(img))
# 3. 篩選地名:保留含地名關(guān)鍵詞的文字,且置信度>0.5(過(guò)濾低準(zhǔn)確率結(jié)果)
place_keywords = ["市", "縣", "區(qū)", "鎮(zhèn)", "鄉(xiāng)", "村", "社區(qū)", "路", "街", "巷", "大道"]
place_names = []
for bbox, text, confidence in result:
if confidence > 0.5 and any(keyword in text for keyword in place_keywords):
# 去除文字中的空格、換行符
clean_text = text.strip().replace("n", "")
place_names.append(clean_text)
# 4. 去重并返回
return list(set(place_names)) # set去重
# 提取地名
place_names_ocr = extract_place_names_from_ocr(preprocessed_img)
# 查看結(jié)果
print("nOCR提取的地名列表:")
for name in place_names_ocr:
print(name) # 輸出如['朝陽(yáng)路', '海淀鎮(zhèn)', '中關(guān)村社區(qū)', ...]
# 保存結(jié)果
import pandas as pd
pd.DataFrame({"OCR提取地名": place_names_ocr}).to_csv("ocr_place_names.csv", index=False, encoding="utf-8")
print("nOCR提取的地名已保存至 ocr_place_names.csv")
若識(shí)別結(jié)果中存在大量錯(cuò)誤(如 “朝陽(yáng)路” 識(shí)別為 “朝陽(yáng)鉻”),可嘗試以下優(yōu)化:
調(diào)整二值化閾值:若文字模糊,可減小adaptiveThreshold
的blockSize
(如從 11 改為 9);
文字區(qū)域定位:用 OpenCV 的findContours
找到文字輪廓,僅對(duì)文字區(qū)域進(jìn)行 OCR,減少背景干擾;
更換 OCR 庫(kù):若 EasyOCR 效果不佳,可嘗試pytesseract
(需安裝 Tesseract 引擎,支持自定義訓(xùn)練模型);
圖像旋轉(zhuǎn)矯正:若 TIF 圖像傾斜,用cv2.getRotationMatrix2D
旋轉(zhuǎn)矯正后再識(shí)別。
對(duì)比維度 | 場(chǎng)景 1:GeoTIFF 矢量屬性地名 | 場(chǎng)景 2:普通 TIF 圖像文字地名 |
---|---|---|
數(shù)據(jù)結(jié)構(gòu)化程度 | 高(地名存儲(chǔ)在屬性表,可直接讀?。?/td> | 低(需 OCR 識(shí)別,結(jié)果需篩選) |
提取準(zhǔn)確率 | 近 100%(只要矢量數(shù)據(jù)正確) | 中等(受圖像質(zhì)量、OCR 模型影響,通常 70%-95%) |
依賴文件 | 需配套矢量文件(如 Shapefile) | 僅需 TIF 圖像本身 |
核心工具庫(kù) | GDAL、Geopandas、Fiona | Pillow、EasyOCR、OpenCV |
適用場(chǎng)景 | GIS 項(xiàng)目、專業(yè)地理數(shù)據(jù)處理 | 掃描地圖、航拍圖、無(wú)矢量的歷史地圖 |
優(yōu)先確認(rèn) TIF 類型:若 TIF 是從 GIS 軟件導(dǎo)出的 GeoTIFF,先檢查是否有配套矢量文件,優(yōu)先用場(chǎng)景 1 的方法(準(zhǔn)確率高、效率快);
無(wú)矢量數(shù)據(jù)時(shí)用 OCR:若僅能獲取普通 TIF 圖像(如歷史地圖掃描件),則采用場(chǎng)景 2 的 OCR 方案,需做好圖像預(yù)處理;
混合場(chǎng)景處理:若 GeoTIFF 底圖上有額外的圖像文字地名(如臨時(shí)標(biāo)注),可結(jié)合兩種方法 —— 先提取矢量屬性地名,再用 OCR 補(bǔ)充圖像文字地名。
問(wèn)題 1:GeoTIFF 無(wú)法關(guān)聯(lián)矢量文件
原因:兩者空間參考不一致(如 GeoTIFF 是 GCJ02 坐標(biāo)系,矢量是 WGS84)。
解決方案:用 Geopandas 的to_crs
統(tǒng)一坐標(biāo)系,如gdf = gdf.to_crs(epsg=4326)
(轉(zhuǎn)為 WGS84)。
問(wèn)題 2:TIF 圖像太大,OCR 內(nèi)存溢出
原因:EasyOCR 處理大圖像(如分辨率 > 5000×5000)時(shí)占用內(nèi)存過(guò)高。
解決方案:將圖像按網(wǎng)格分割為小塊(如 500×500 像素),分別 OCR 后合并結(jié)果。
問(wèn)題 3:矢量文件中無(wú)明確的地名字段
原因:字段名非 “NAME”,可能是 “DZM”“MC” 等中文拼音縮寫。
Python 提取 TIF 中的地名,核心是 “根據(jù) TIF 文件類型選擇對(duì)應(yīng)技術(shù)路徑”—— 對(duì)于結(jié)構(gòu)化的 GeoTIFF 矢量數(shù)據(jù),利用 GIS 庫(kù)直接讀取屬性字段是最優(yōu)解;對(duì)于非結(jié)構(gòu)化的圖像文字,通過(guò) “預(yù)處理 + OCR” 是唯一可行方案。無(wú)論哪種場(chǎng)景,都需關(guān)注數(shù)據(jù)質(zhì)量(矢量數(shù)據(jù)完整性、圖像清晰度)與工具庫(kù)適配(GIS 庫(kù)的空間參考、OCR 庫(kù)的語(yǔ)言模型)。掌握這兩種方法,可覆蓋絕大多數(shù) TIF 地名提取需求,為地理信息分析、地圖數(shù)字化等工作提供數(shù)據(jù)支撐。
DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動(dòng)態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開(kāi)始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價(jià)值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫(kù)表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫(kù))處理 Excel 數(shù)據(jù)時(shí),“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場(chǎng)景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計(jì)劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計(jì)劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對(duì)象的 text 與 content:區(qū)別、場(chǎng)景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請(qǐng)求開(kāi)發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫(kù)表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請(qǐng)求工具對(duì)比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請(qǐng)求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問(wèn)題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問(wèn)題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營(yíng)問(wèn)題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過(guò)程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營(yíng)銷案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見(jiàn)頂” 的當(dāng)下,精準(zhǔn)營(yíng)銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價(jià)值 在數(shù)據(jù)驅(qū)動(dòng)決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實(shí)踐到業(yè)務(wù)價(jià)值挖掘 在數(shù)據(jù)分析場(chǎng)景中,聚類分析作為 “無(wú)監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計(jì)模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價(jià)值導(dǎo)向 統(tǒng)計(jì)模型作為數(shù)據(jù)分析的核心工具,并非簡(jiǎn)單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10CDA 數(shù)據(jù)分析師:商業(yè)數(shù)據(jù)分析實(shí)踐的落地者與價(jià)值創(chuàng)造者 商業(yè)數(shù)據(jù)分析的價(jià)值,最終要在 “實(shí)踐” 中體現(xiàn) —— 脫離業(yè)務(wù)場(chǎng)景的分 ...
2025-09-10機(jī)器學(xué)習(xí)解決實(shí)際問(wèn)題的核心關(guān)鍵:從業(yè)務(wù)到落地的全流程解析 在人工智能技術(shù)落地的浪潮中,機(jī)器學(xué)習(xí)作為核心工具,已廣泛應(yīng)用于 ...
2025-09-09SPSS 編碼狀態(tài)區(qū)域中 Unicode 的功能與價(jià)值解析 在 SPSS(Statistical Product and Service Solutions,統(tǒng)計(jì)產(chǎn)品與服務(wù)解決方案 ...
2025-09-09