京公网安备 11010802034615号
经营许可证编号:京B2-20210330
在开始提取前,需先判断 TIF 文件的类型 —— 这直接决定了后续的技术方案。两种核心形式的差异如下:
| 地名存在形式 | 适用 TIF 类型 | 核心特征 | 提取思路 |
|---|---|---|---|
| 地理矢量属性字段 | GeoTIFF(带地理空间信息) | 地名存储在矢量要素的属性表中(如 Shapefile 关联的 “NAME” 字段),TIF 本身是栅格底图,地名不直接显示在图像上 | 读取 TIF 的地理元数据→关联矢量图层→提取属性字段中的地名 |
| 图像可视化文字 | 普通 TIF(如扫描地图、航拍图) | 地名是图像像素的一部分(如 “北京市朝阳区” 标注文字),无结构化属性,需识别图像内容 | 图像预处理(去噪、灰度化)→OCR 文字识别→筛选地名 |
GeoTIFF 是带有地理空间参考信息的 TIF 文件,常与矢量数据(如 Shapefile、GeoJSON)配套使用 —— 地名通常存储在矢量要素的属性表中(如居民点要素的 “NAME” 字段、道路要素的 “ROAD_NAME” 字段)。这种场景下,提取本质是 “读取地理数据的属性信息”,核心依赖 GIS 相关库。
GDAL/OGR:地理数据处理的底层库,支持读取 GeoTIFF 的元数据及关联的矢量文件;
Geopandas:基于 Pandas 的 GIS 扩展库,简化矢量数据的读取与属性筛选,适合处理带地名的矢量图层;
Fiona:轻量级矢量数据读取库,常与 Geopandas 配合使用,支持 Shapefile、GeoJSON 等格式。
需获取与 GeoTIFF 配套的矢量文件(如 Shapefile 格式的.shp文件,通常包含.shp/.shx/.dbf/.prj四个文件);
矢量文件的属性表中需包含地名字段(如 “NAME”“地名”“CNAME”,可通过 QGIS、ArcGIS 查看字段名);
GeoTIFF 与矢量文件需空间参考一致(如均为 WGS84 坐标系),避免空间匹配偏差。
假设我们有一份 “某区域 GeoTIFF 底图”,配套的residential.shp矢量文件包含居民点要素,属性表中 “NAME” 字段存储地名。
GIS 库在 Windows 环境下直接用pip安装可能报错,建议用conda(Anaconda/Miniconda)安装:
# 创建conda环境(可选)
conda create -n gis_env python=3.9
conda activate gis_env
# 安装核心库
conda install -c conda-forge gdal geopandas fiona pandas
import geopandas as gpd
import pandas as pd
# 1. 读取Shapefile矢量文件(包含居民点要素)
# 注意:需确保.shp/.shx/.dbf/.prj文件在同一目录
gdf = gpd.read_file("residential.shp")
# 2. 查看矢量数据的基本信息(确认字段名与地名字段)
print("矢量数据字段名:", gdf.columns.tolist()) # 输出如['FID', 'NAME', 'POP', 'geometry']
print("n前5条数据的地理类型:", gdf.geom_type.head()) # 确认是Point(点要素,对应居民点)
# 3. 筛选地名字段,去重并保存
# 提取"NAME"字段中的地名,排除空值和重复值
place_names = gdf["NAME"].dropna().drop_duplicates().tolist()
# 4. 查看结果并保存为CSV
print("n提取的地名列表(前10个):")
print(place_names[:10]) # 输出如['张三村', '李四镇', '王五社区', ...]
# 保存为CSV,便于后续使用
pd.DataFrame({"地名": place_names}).to_csv("extracted_place_names.csv", index=False, encoding="utf-8")
print("n地名已保存至 extracted_place_names.csv")
若需提取 “GeoTIFF 底图覆盖范围内” 的地名(排除矢量文件中超出底图的要素),需先获取 GeoTIFF 的空间范围,再筛选矢量要素:
from osgeo import gdal
# 1. 读取GeoTIFF,获取其空间范围(边界框)
def get_geotiff_bbox(tif_path):
dataset = gdal.Open(tif_path)
if not dataset:
raise ValueError("无法打开GeoTIFF文件")
# 获取地理变换参数(左上角坐标、分辨率等)
geotransform = dataset.GetGeoTransform()
# 计算边界框(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 # 关闭文件
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. 筛选矢量要素中在边界框内的地名
# 创建边界框的Polygon几何对象
from shapely.geometry import box
bbox_geometry = box(min_x, min_y, max_x, max_y)
# 筛选与边界框相交的居民点要素
gdf_in_bbox = gdf[gdf.intersects(bbox_geometry)]
# 提取地名
place_names_in_bbox = gdf_in_bbox["NAME"].dropna().drop_duplicates().tolist()
print("GeoTIFF范围内的地名数量:", len(place_names_in_bbox))
print("GeoTIFF范围内的地名(前10个):", place_names_in_bbox[:10])
若 TIF 是普通图像(如扫描的纸质地图、无人机航拍图),地名是图像上的可视化文字(如印刷体标注),则需通过OCR(光学字符识别) 技术提取。这种场景的核心是 “将图像文字转化为文本”,再通过简单筛选得到地名。
PIL/Pillow:Python 图像处理库,用于 TIF 图像的读取、预处理(灰度化、二值化、去噪);
EasyOCR:轻量级 OCR 库,支持多语言(含中文),识别准确率高于传统的 Tesseract,且无需复杂配置;
TIF 图像中的地名需清晰可辨(避免模糊、倾斜、遮挡,否则 OCR 准确率会大幅下降);
若识别中文地名,需确保 OCR 库已下载中文模型(EasyOCR 会自动下载,首次运行需联网)。
假设我们有一份扫描的纸质地图 TIF(scan_map.tif),图像上有 “XX 路”“XX 镇” 等地名标注。
# 安装Pillow和EasyOCR
pip install pillow easyocr opencv-python
普通 TIF 图像可能存在噪声、颜色干扰,需先预处理:
灰度化:将彩色图像转为灰度图像,减少颜色通道干扰;
二值化:将灰度图像转为黑白二值图像,突出文字与背景的对比;
去噪:去除图像中的小点、杂色,避免 OCR 误识别。
from PIL import Image
import numpy as np
import cv2
def preprocess_tif(tif_path):
# 1. 读取TIF图像(支持多页TIF,此处取第一页)
img = Image.open(tif_path)
if img.mode == "CMYK":
img = img.convert("RGB") # 处理CMYK格式图像
# 转为OpenCV格式(BGR通道)
img_cv = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
# 2. 灰度化
gray = cv2.cvtColor(img_cv, cv2.COLOR_BGR2GRAY)
# 3. 二值化(自适应阈值,适合光照不均匀的图像)
# 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)
# 转回PIL图像,便于后续OCR
img_preprocessed = Image.fromarray(cv2.cvtColor(denoised, cv2.COLOR_BGR2RGB))
return img_preprocessed
# 预处理TIF图像
preprocessed_img = preprocess_tif("scan_map.tif")
# 保存预处理后的图像(可选,用于检查效果)
preprocessed_img.save("preprocessed_map.png")
print("预处理完成,图像已保存至 preprocessed_map.png")
OCR 会识别图像中的所有文字(如数字、符号、无关说明),需通过 “地名特征” 筛选(如含 “市”“县”“镇”“村”“路”“街” 等关键词):
import easyocr
def extract_place_names_from_ocr(img):
# 1. 初始化EasyOCR阅读器(仅加载中文模型,减少内存占用)
# lang_list=["ch_sim"]:中文简体,如需英文可加["en"]
reader = easyocr.Reader(lang_list=["ch_sim"], gpu=False) # gpu=True需安装CUDA
# 2. 识别图像文字(返回结果:[(文字区域坐标, 文字内容, 置信度)])
result = reader.readtext(np.array(img))
# 3. 筛选地名:保留含地名关键词的文字,且置信度>0.5(过滤低准确率结果)
place_keywords = ["市", "县", "区", "镇", "乡", "村", "社区", "路", "街", "巷", "大道"]
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)
# 查看结果
print("nOCR提取的地名列表:")
for name in place_names_ocr:
print(name) # 输出如['朝阳路', '海淀镇', '中关村社区', ...]
# 保存结果
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")
若识别结果中存在大量错误(如 “朝阳路” 识别为 “朝阳铬”),可尝试以下优化:
调整二值化阈值:若文字模糊,可减小adaptiveThreshold的blockSize(如从 11 改为 9);
文字区域定位:用 OpenCV 的findContours找到文字轮廓,仅对文字区域进行 OCR,减少背景干扰;
更换 OCR 库:若 EasyOCR 效果不佳,可尝试pytesseract(需安装 Tesseract 引擎,支持自定义训练模型);
图像旋转矫正:若 TIF 图像倾斜,用cv2.getRotationMatrix2D旋转矫正后再识别。
| 对比维度 | 场景 1:GeoTIFF 矢量属性地名 | 场景 2:普通 TIF 图像文字地名 |
|---|---|---|
| 数据结构化程度 | 高(地名存储在属性表,可直接读取) | 低(需 OCR 识别,结果需筛选) |
| 提取准确率 | 近 100%(只要矢量数据正确) | 中等(受图像质量、OCR 模型影响,通常 70%-95%) |
| 依赖文件 | 需配套矢量文件(如 Shapefile) | 仅需 TIF 图像本身 |
| 核心工具库 | GDAL、Geopandas、Fiona | Pillow、EasyOCR、OpenCV |
| 适用场景 | GIS 项目、专业地理数据处理 | 扫描地图、航拍图、无矢量的历史地图 |
优先确认 TIF 类型:若 TIF 是从 GIS 软件导出的 GeoTIFF,先检查是否有配套矢量文件,优先用场景 1 的方法(准确率高、效率快);
无矢量数据时用 OCR:若仅能获取普通 TIF 图像(如历史地图扫描件),则采用场景 2 的 OCR 方案,需做好图像预处理;
混合场景处理:若 GeoTIFF 底图上有额外的图像文字地名(如临时标注),可结合两种方法 —— 先提取矢量属性地名,再用 OCR 补充图像文字地名。
问题 1:GeoTIFF 无法关联矢量文件
原因:两者空间参考不一致(如 GeoTIFF 是 GCJ02 坐标系,矢量是 WGS84)。
解决方案:用 Geopandas 的to_crs统一坐标系,如gdf = gdf.to_crs(epsg=4326)(转为 WGS84)。
问题 2:TIF 图像太大,OCR 内存溢出
原因:EasyOCR 处理大图像(如分辨率 > 5000×5000)时占用内存过高。
解决方案:将图像按网格分割为小块(如 500×500 像素),分别 OCR 后合并结果。
问题 3:矢量文件中无明确的地名字段
原因:字段名非 “NAME”,可能是 “DZM”“MC” 等中文拼音缩写。
Python 提取 TIF 中的地名,核心是 “根据 TIF 文件类型选择对应技术路径”—— 对于结构化的 GeoTIFF 矢量数据,利用 GIS 库直接读取属性字段是最优解;对于非结构化的图像文字,通过 “预处理 + OCR” 是唯一可行方案。无论哪种场景,都需关注数据质量(矢量数据完整性、图像清晰度)与工具库适配(GIS 库的空间参考、OCR 库的语言模型)。掌握这两种方法,可覆盖绝大多数 TIF 地名提取需求,为地理信息分析、地图数字化等工作提供数据支撑。

数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
尊敬的考生: 您好! 我们诚挚通知您,CDA Level III 考试大纲将于 2025 年 12 月 31 日实施重大更新,并正式启用,2026年3月考 ...
2025-12-31“字如其人”的传统认知,让不少“手残党”在需要签名的场景中倍感尴尬——商务签约时的签名歪歪扭扭,朋友聚会的签名墙不敢落笔 ...
2025-12-31在多元统计分析的因子分析中,“得分系数”是连接原始观测指标与潜在因子的关键纽带,其核心作用是将多个相关性较高的原始指标, ...
2025-12-31对CDA(Certified Data Analyst)数据分析师而言,高质量的数据是开展后续分析、挖掘业务价值的基础,而数据采集作为数据链路的 ...
2025-12-31在中介效应分析(或路径分析)中,间接效应是衡量“自变量通过中介变量影响因变量”这一间接路径强度与方向的核心指标。不同于直 ...
2025-12-30数据透视表是数据分析中高效汇总、多维度分析数据的核心工具,能快速将杂乱数据转化为结构化的汇总报表。在实际分析场景中,我们 ...
2025-12-30在金融投资、商业运营、用户增长等数据密集型领域,量化策略凭借“数据驱动、逻辑可验证、执行标准化”的优势,成为企业提升决策 ...
2025-12-30CDA(Certified Data Analyst),是在数字经济大背景和人工智能时代趋势下,源自中国,走向世界,面向全行业的专业技能认证,旨 ...
2025-12-29在数据分析领域,周期性是时间序列数据的重要特征之一——它指数据在一定时间间隔内重复出现的规律,广泛存在于经济、金融、气象 ...
2025-12-29数据分析师的核心价值在于将海量数据转化为可落地的商业洞察,而高效的工具则是实现这一价值的关键载体。从数据采集、清洗整理, ...
2025-12-29在金融、零售、互联网等数据密集型行业,量化策略已成为企业提升决策效率、挖掘商业价值的核心工具。CDA(Certified Data Analys ...
2025-12-29CDA中国官网是全国统一的数据分析师认证报名网站,由认证考试委员会与持证人会员、企业会员以及行业知名第三方机构共同合作,致 ...
2025-12-26在数字化转型浪潮下,审计行业正经历从“传统手工审计”向“大数据智能审计”的深刻变革。教育部发布的《大数据与审计专业教学标 ...
2025-12-26统计学作为数学的重要分支,是连接数据与决策的桥梁。随着数据规模的爆炸式增长和复杂问题的涌现,传统统计方法已难以应对高维、 ...
2025-12-26数字化浪潮席卷全球,数据已成为企业核心生产要素,“用数据说话、用数据决策”成为企业生存与发展的核心逻辑。在这一背景下,CD ...
2025-12-26箱线图(Box Plot)作为数据分布可视化的核心工具,凭借简洁的结构直观呈现数据的中位数、四分位数、异常值等关键信息,广泛应用 ...
2025-12-25在数据驱动决策的时代,基于历史数据进行精准预测已成为企业核心需求——无论是预测未来销售额、客户流失概率,还是产品需求趋势 ...
2025-12-25在数据驱动业务的实践中,CDA(Certified Data Analyst)数据分析师的核心工作,本质上是通过“指标”这一数据语言,解读业务现 ...
2025-12-25在金融行业的数字化转型进程中,SQL作为数据处理与分析的核心工具,贯穿于零售银行、证券交易、保险理赔、支付结算等全业务链条 ...
2025-12-24在数据分析领域,假设检验是验证“数据差异是否显著”的核心工具,而独立样本t检验与卡方检验则是其中最常用的两种方法。很多初 ...
2025-12-24