Skip to main content

Offline geocoding and reverse geocoding for Chinese administrative regions

Project description

GeoToolCN

PyPI Python License: MIT

中国行政区划离线地理编码工具,覆盖全部省、市、区县,无需 API 密钥或网络。

English

功能特点

  • 逆地理编码 — 经纬度坐标 → 省 / 市 / 区县
  • 正向地理编码 — 地名或行政区划代码 → 经纬度坐标
  • 批量处理 — 一次调用即可逆编码数千个坐标点
  • R-tree 空间索引 — 快速点在多边形查询
  • 类型化数据类 — 结构化的 RegionReverseResult 对象
  • 行政区划树 — 省→市→区县三级树,适用于前端级联选择器,无需 geopandas
  • 零网络依赖 — 完全离线,内置数据

安装

pip install geotool-cn

快速上手

from geotool_cn import GeoTool

geo = GeoTool()

# 逆地理编码(坐标 → 行政区划)
result = geo.reverse(39.9, 116.4)
print(result.province.name)   # 北京市
print(result.district.name)   # 东城区
print(result.district.code)   # 110101

# 正向地理编码(地名/代码 → 坐标)
regions = geo.search("深圳市")
print(regions[0].latitude, regions[0].longitude)

# 批量逆地理编码
results = geo.reverse_batch([(39.9, 116.4), (31.2, 121.5)])

# 列出所有省份
provinces = geo.list_regions("province")

# 按 adcode 查询
region = geo.get_region("110000")

行政区划树

省→市→区县三级树,适用于前端级联选择器(Cascader)等场景。无需 geopandas

from geotool_cn import get_administrative_tree

tree = get_administrative_tree()
# tree[0] = {"value": "110000", "label": "北京市", "children": [...]}

直辖市(北京、天津、上海、重庆)和特别行政区(香港、澳门)的市级节点 value 使用省级代码。结果按 value 升序排列,首次调用后缓存。

便捷函数

模块级快捷方式,使用共享的单例实例:

from geotool_cn import reverse, search, reverse_batch, list_regions, get_region

result = reverse(39.9, 116.4)
regions = search("深圳市")

API 参考

GeoTool(data_dir=None)

创建地理编码实例。传入 data_dir 可使用自定义 GeoJSON 文件替代内置数据。

geo.reverse(lat, lng) → ReverseResult

对单个 WGS-84 坐标进行逆地理编码。

geo.reverse_batch(coords) → list[ReverseResult]

使用空间连接对多个 (lat, lng) 坐标对进行批量逆地理编码。

geo.search(query, *, level=None, province=None, city=None, fuzzy=True) → list[Region]

按地名或 adcode 搜索。设置 level"province""city""district" 可缩小搜索范围。使用 provincecity 参数可消除同名区划的歧义(接受地名或 adcode)。默认开启模糊匹配。

# "朝阳区"在北京和长春都存在
geo.search("朝阳区")                     # 返回两个结果
geo.search("朝阳区", province="北京市")    # 仅返回北京的
geo.search("朝阳区", city="长春市")        # 仅返回长春的

geo.list_regions(level) → list[Region]

列出指定级别("province""city""district")的所有行政区划。

geo.get_region(code) → Region | None

按 adcode 查询单个区划。

get_administrative_tree() → list[dict]

返回省→市→区县三级行政区划树。每个节点格式:{"value": "adcode", "label": "名称", "children": [...]}。覆盖 34 个省级单位(含台湾、香港、澳门),2800+ 区县。该函数不依赖 geopandas,首次调用后缓存。

数据类

@dataclass
class Region:
    name: str        # "北京市"
    code: str        # "110000" (6位 adcode)
    level: str       # "province" | "city" | "district"
    latitude: float  # 代表点纬度
    longitude: float # 代表点经度

@dataclass
class ReverseResult:
    province: Region | None
    city: Region | None
    district: Region | None

性能

操作 优化前 GeoToolCN v1.0
加载数据 每次调用 (~2s) 初始化一次 (~2s)
单次逆编码 ~2s(暴力遍历) ~1ms(R-tree 索引)
批量 1000 点 ~2000s ~1s(空间连接)
正向搜索 ~0.5s(扫描) <0.1ms(字典索引)

更新数据

GeoJSON 边界数据和行政区划树使用同一数据源(DataV.GeoAtlas),通过脚本一键更新:

python scripts/fetch_datav_geojson.py

脚本会:

  1. 从 DataV API 递归下载省/市/区县边界数据
  2. 将坐标从 GCJ-02 转换为 WGS-84
  3. 生成 china_province.geojsonchina_city.geojsonchina_district.geojsonchina_admin.json
  4. 更新 DATA_VERSION.json(记录数据源、日期、数量)
  5. 生成 DATA_UPDATE_REPORT.md(与上次数据的差异报告)
  6. 自动运行数据校验(数量、adcode、层级关系、几何有效性、地标抽检等)

也可单独运行校验:

python scripts/validate_data.py

也可传入自定义数据目录:

geo = GeoTool(data_dir="/path/to/data")

数据来源

字段
数据源 DataV.GeoAtlas(阿里云 DataV 地理小工具)
覆盖范围 34 省 / 363 市 / 2874 区县
坐标系 WGS-84(原始 GCJ-02 已转换)
编码体系 6 位 adcode
最近更新 2026 年 3 月

许可证

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

geotool_cn-2.0.1.tar.gz (8.4 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

geotool_cn-2.0.1-py3-none-any.whl (8.4 MB view details)

Uploaded Python 3

File details

Details for the file geotool_cn-2.0.1.tar.gz.

File metadata

  • Download URL: geotool_cn-2.0.1.tar.gz
  • Upload date:
  • Size: 8.4 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for geotool_cn-2.0.1.tar.gz
Algorithm Hash digest
SHA256 1f3bb3d29b545050975b19c47a01f1adea708d2024f4d359aa9081028c2102e4
MD5 21610dd8f8e2c56808eefaa227d4ff4d
BLAKE2b-256 e7dd60f24c6cf63443f5644f705188e3237789d3d213fd1cd7a5f7ca1f1cdd8c

See more details on using hashes here.

File details

Details for the file geotool_cn-2.0.1-py3-none-any.whl.

File metadata

  • Download URL: geotool_cn-2.0.1-py3-none-any.whl
  • Upload date:
  • Size: 8.4 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for geotool_cn-2.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 9717376f8dd6d6302770d07acf40efa8f203b82dc9f8842e2eeff7024fecbac8
MD5 a5b45007a8e5a9448fbd6ead4241bbb6
BLAKE2b-256 d552808b759a4f7f98f9092b5b4d770b16f11b5c4d26d5fa89f986b59aa5f349

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page