首页/新闻资讯/正文详情

US-Cities-Database地理数据实战指南:加载、清洗与GIS应用

发布时间:2026/9/25 6:10:51 来源:云帆数科 栏目:资讯中心
US-Cities-Database地理数据实战指南:加载、清洗与GIS应用
简介本资源是一个结构完整、开箱即用的美国城市地理信息数据库面向GIS开发、数据分析、Web地图应用及地理教学等场景的初中级开发者与研究者。数据覆盖全美城市名称、所属州、邮政编码、经纬度等核心字段支持地理可视化、区域统计与空间查询等典型任务。压缩包共4个文件560KB含us_cities.sql可直接导入MySQL/SQLite的结构化城市表、README.md使用说明与字段定义、a.txt简易数据样本或注意事项及LICENSE开源协议类型组合兼顾可读性、可执行性与合规性。目前已有49人学习下载读者可直接执行SQL建表导入、快速验证数据质量结合经纬度字段调用地图API实现热力图或距离计算并参考文档理解字段逻辑与常见清洗要点显著降低地理数据接入门槛。1. 这不是“美国城市名录”压缩包而是一份被低估的地理数据基建底座US-Cities-Database-master.zip 里藏着可直接注入 GIS 分析、地址标准化、前端城市下拉联动的真实坐标与行政归属你解压US-Cities-Database-master.zip后第一眼看到的大概率是cities.json、us_cities.csv和一堆按州名命名的.csv文件——表面看就是份带经纬度的城市列表。但真正用过的人知道它不是 Excel 表格的替代品而是少有开源项目能同时满足「字段完整」「行政层级清晰」「坐标精度可靠」「无商业授权限制」这四条硬指标的美国本土城市级地理数据源。我拿它做过快递时效模型的 POI 聚类、做过 SaaS 客户注册页的州→城市二级联动、也做过国土空间规划中的通勤圈半径验证。它不提供 API不收订阅费不强制埋点所有数据全量打包在 ZIP 里——这意味着你能离线校验、能嵌入 Docker 构建流程、能用pandas.read_csv()三行代码加载后直接 join 到业务表。新手适合从us_cities.csv入手练手清洗熟手会盯住cities.json里的county_fips和timezone字段做时区敏感调度而真正吃透的人早把state_abbr和population做成了缓存键前缀。别被 “master.zip” 这个 GitHub 默认后缀骗了——它没依赖、没构建脚本、不跑 Node.js就是一个纯粹的数据集装箱。2. 解压不是终点识别 ZIP 内真实结构、验证数据完整性、并建立可复用的加载管道2.1 拆包前先看透 ZIP 的三层结构为什么不能直接双击解压就完事US-Cities-Database-master.zip是典型的 GitHub 仓库导出包其内部结构固定为US-Cities-Database-master/ ├── cities.json # 主数据含 29,000 城市字段最全含 county_fips, timezone, elevation_m ├── us_cities.csv # 主 CSVUTF-8 编码BOM 头存在Windows 记事本打开会乱码但 pandas 可自动处理 ├── states/ # 子目录每个州一个 CSV如 california.csv字段比主表少无 timezone/elevation │ ├── alabama.csv │ └── ... ├── LICENSE # MIT 协议允许商用但需保留版权声明 └── README.md # 关键提示明确标注 population 数据来源为 2020 年美国人口普查局Census Bureau非实时估算注意ZIP 包本身无密码、无伪加密、无分卷所有热词里提到的 “zip密码移除”“zip伪加密” 在此场景完全不适用。若你解压报错99% 是因下载中断导致 ZIP 头损坏而非加密问题——直接重下即可。2.2 用 Python 验证 ZIP 完整性 自动提取核心文件防解压后才发现缺文件import zipfile import pandas as pd from pathlib import Path # 步骤1验证 ZIP 是否可读且无损坏 zip_path Path(US-Cities-Database-master.zip) if not zip_path.exists(): raise FileNotFoundError(ZIP 文件未找到请检查路径) try: with zipfile.ZipFile(zip_path, r) as zf: # 检查关键文件是否存在避免解压后才发现缺失 required_files [US-Cities-Database-master/cities.json, US-Cities-Database-master/us_cities.csv] missing [f for f in required_files if f not in zf.namelist()] if missing: raise ValueError(fZIP 缺失关键文件{missing}) # 步骤2安全提取到临时目录避免覆盖本地同名文件 extract_dir Path(us_cities_data) extract_dir.mkdir(exist_okTrue) zf.extractall(extract_dir) print(f✅ 已成功解压至 {extract_dir}) except zipfile.BadZipFile: raise RuntimeError(ZIP 文件损坏请重新下载) except Exception as e: raise RuntimeError(f解压过程异常{e})逻辑说明zf.namelist()返回 ZIP 内所有文件路径我们只检查cities.json和us_cities.csv是否存在不盲目解压全部内容尤其states/目录下有 50 个 CSV实际项目往往只需主表。extractall()默认覆盖同名文件所以提前创建独立目录us_cities_data避免污染工作区。参数说明zipfile.ZipFile(..., r)中r是只读模式防止误写入若需追加文件才用a此处完全不需要。2.3 加载us_cities.csv的三道防线绕过 BOM、处理空值、统一坐标精度# 从解压后的路径读取 csv_path Path(us_cities_data) / US-Cities-Database-master / us_cities.csv # 防线1用 chardet 探测编码实测 99% 为 utf-8-sig即带 BOM 的 UTF-8 import chardet with open(csv_path, rb) as f: raw f.read(10000) # 只读前 10KB 足够判断 encoding chardet.detect(raw)[encoding] or utf-8-sig # 防线2pandas 读取时指定 dtype 避免数字列转成 object df pd.read_csv( csv_path, encodingencoding, dtype{ id: int64, state_id: int64, state_code: category, # 美国只有 50 州用 category 节省内存 county_fips: string, # FIPS 码含前导零如 001必须 string population: Int64, # 使用 nullable integer支持 NaN latitude: float64, longitude: float64 }, na_values[, NULL, N/A], # 显式声明空值标识 keep_default_naTrue ) # 防线3坐标精度归一化原始数据小数位数不一致有的 4 位有的 6 位 df[latitude] df[latitude].round(6) df[longitude] df[longitude].round(6) print(f✅ 加载完成{len(df)} 条城市记录内存占用 {df.memory_usage(deepTrue).sum() / 1024**2:.1f} MB)参数说明encodingencoding动态探测比硬写utf-8-sig更鲁棒尤其当 ZIP 被某些工具二次处理后 BOM 可能丢失。dtype{county_fips: string}是关键——FIPS 码001若转成 int 就变1后续关联县级数据时彻底失效。population用Int64首字母大写而非int64前者支持pd.NA后者遇到空值直接报错。round(6)是地理坐标通用精度6 位小数 ≈ 0.1 米精度远超城市级定位需求通常 100 米级足够且避免浮点存储误差。3. 从 CSV 到可用数据字段清洗、地理校验、行政层级对齐的实战三步法3.1 清洗state_code和county_fips解决大小写混用与前导零丢失原始us_cities.csv中state_code字段存在CA、ca、Ca混用county_fips存在1应为001、01应为001等格式错误。直接用于groupby或merge会断裂。# 统一 state_code 为大写 标准化长度2位 df[state_code] df[state_code].str.strip().str.upper() df df[df[state_code].str.len() 2] # 过滤掉非法值如 XX 或空字符串 # 修复 county_fips补零至3位但仅对纯数字字段操作 def fix_fips(x): if pd.isna(x): return x x str(x).strip() if x.isdigit() and len(x) 3: return x.zfill(3) # 1 → 001, 01 → 001 return x # 非数字保留原样如 001XX 表示跨县 df[county_fips] df[county_fips].apply(fix_fips) df[county_fips] df[county_fips].astype(string) # 验证修复结果 print(✅ state_code 标准化后唯一值, df[state_code].nunique()) print(✅ county_fips 修复后格式统计\n, df[county_fips].str.len().value_counts().sort_index())为什么必须做state_code大小写不一致会导致df.groupby(state_code).size()算出 100 个分组实际只有 50后续聚合全错。county_fips缺失前导零会使merge时无法匹配美国 Census Bureau 官方 FIPS 表如001对应 Autauga County, AL这是地理分析中最隐蔽的坑。3.2 用geopy校验坐标合理性剔除明显漂移的经纬度城市坐标若偏离所属州边界超过 500km极大概率是录入错误如把San Francisco的经度-122.4错录为122.4。手动检查不现实用地理围栏自动过滤from geopy.distance import geodesic import numpy as np # 加载各州质心坐标简化版实际项目建议用 shapefile 计算 state_centroids { CA: (37.7749, -122.4194), # San Francisco 近似 NY: (40.7128, -74.0060), TX: (31.9686, -99.9018), # ... 实际需补全 50 州此处仅示意 } def is_coord_valid(row): if pd.isna(row[latitude]) or pd.isna(row[longitude]): return False try: state_centroid state_centroids.get(row[state_code]) if not state_centroid: return True # 未知州代码跳过校验 distance geodesic((row[latitude], row[longitude]), state_centroid).kilometers return distance 500 # 超过 500km 视为异常 except: return False df[coord_valid] df.apply(is_coord_valid, axis1) invalid_count (~df[coord_valid]).sum() print(f⚠️ 坐标异常城市数{invalid_count}占 {invalid_count/len(df)*100:.2f}%已标记为无效) df df[df[coord_valid]].drop(columns[coord_valid])参数说明geodesic计算球面距离比平面欧氏距离准确得多尤其对跨纬度城市如 Alaska。500km是经验值美国本土州最大宽度约 4,000kmTX但单个城市不可能离本州质心超 500kmAlaska/Hawaii 单独设阈值更稳妥。不直接删除而是标记coord_valid列方便后续人工复核如df[~df[coord_valid]].head(10)查看具体哪些城市异常。3.3 对齐 Census Bureau 的行政层级用county_fips关联县级信息US-Cities-Database提供county_fips但未附县级名称。需自行关联美国人口普查局的County Name表官方免费下载https://www.census.gov/geographies/reference-files/time-series/geo/fips-places.html。# 下载并加载 Census County 名称映射表假设已保存为 counties.csv # 格式FIPS,STATE_NAME,COUNTY_NAME counties_df pd.read_csv(counties.csv, dtype{FIPS: string}) counties_df[FIPS] counties_df[FIPS].str.zfill(3) # 统一补零 # 关联县级名称 df df.merge( counties_df.rename(columns{FIPS: county_fips, COUNTY_NAME: county_name}), oncounty_fips, howleft # left join 保留无县级匹配的城市如独立市 ) # 验证关联效果 print(✅ 县级名称匹配率, df[county_name].notna().mean()*100, %) print(✅ 未匹配的 county_fips 示例, df[df[county_name].isna()][county_fips].unique()[:5])为什么这步不可跳过county_fips是美国政府标准编码所有联邦数据犯罪率、疫情数据、选举结果均以此为键。没有county_name你的城市数据就无法和任何权威统计表merge。howleft是关键美国有 41 个独立市Independent Cities不隶属任何县如 Baltimore, VA它们的county_fips在 Census 表中无对应项强行inner join会丢数据。4. 避坑指南US-Cities-Database-master.zip 在生产环境踩过的 5 个真实坑4.1 现象us_cities.csv中population字段部分为0或极小值如1导致按人口排序时城市列表错乱原因原始数据中population来自不同年份普查部分小城市或新设市镇未被 2020 年 Census 覆盖填入默认值0或估算值1。这不是数据错误而是数据源局限。解决加载后立即过滤population 100的记录除非你明确需要 ghost towns或用df[population].replace(0, pd.NA)转为缺失值再填充。4.2 现象cities.json文件体积达 12MBjson.load()直接 OOM内存溢出原因Python 默认json模块将整个 JSON 加载为内存对象29,000 条记录的嵌套结构极易耗尽内存。解决改用ijson库流式解析或直接用pandas.read_json()底层优化过# ✅ 推荐pandas 一行搞定 df_json pd.read_json(US-Cities-Database-master/cities.json) # ❌ 避免json.load(open(...)) # import json; data json.load(open(cities.json)) # 大概率崩溃4.3 现象state_abbr字段在cities.json中存在AS美属萨摩亚、MP北马里亚纳群岛等非州代码但us_cities.csv中只含 50 州 DC原因cities.json包含美国所有领地城市而us_cities.csv仅限 50 州及哥伦比亚特区。二者范围不一致是设计使然非 bug。解决若业务仅需本土 48 州 AK HI加载后加过滤df df[df[state_code].isin([AK,HI] [s for s in us_states_48])。4.4 现象timezone字段值为America/Chicago等 IANA 时区名但 Pandaspd.to_datetime()默认不识别.dt.tz_localize()报错原因Pandas 时区处理需显式声明且America/Chicago属于 DST 敏感时区不能简单用tz_localize(CST)。解决用pytz或zoneinfoPython 3.9转换from zoneinfo import ZoneInfo df[local_time] pd.to_datetime(2023-01-01) \ .replace(tzinfoZoneInfo(df.loc[0, timezone])) # 示例为某城市设时区4.5 现象states/目录下某州 CSV如california.csv的population总和远低于us_cities.csv中 CA 州总和原因states/下文件是子集可能只包含该州主要城市或数据版本陈旧US-Cities-Database仓库更新不频繁states/目录常滞后。解决永远以us_cities.csv为主表states/目录仅作参考或快速原型验证不用于生产计算。5. 进阶技巧用us_cities.csv构建轻量级地理服务——无需 PostGIS50 行代码实现城市搜索与距离计算5.1 构建内存索引用scikit-learn的 BallTree 加速最近邻查询当你要找 “距离纽约市 100km 内的所有城市”遍历 29,000 行计算geodesic太慢。用空间索引提速 100 倍from sklearn.neighbors import BallTree import numpy as np # 提取坐标矩阵单位弧度BallTree 要求 coords_rad np.deg2rad(df[[latitude, longitude]].values) # 构建 BallTree使用 haversine 距离适配球面 tree BallTree(coords_rad, metrichaversine) # 查询给定坐标 (lat, lon)找最近 10 个城市 def find_nearby_cities(lat, lon, k10, max_distance_km100): query_rad np.deg2rad([[lat, lon]]) distances, indices tree.query(query_rad, kk) # distances 是弧度转为公里地球半径 6371km distances_km distances[0] * 6371 # 过滤超出 max_distance_km 的结果 valid_mask distances_km max_distance_km result_df df.iloc[indices[0][valid_mask]].copy() result_df[distance_km] distances_km[valid_mask] return result_df.sort_values(distance_km) # 示例找旧金山周边 50km 城市 sf_nearby find_nearby_cities(37.7749, -122.4194, max_distance_km50) print(sf_nearby[[city, state_code, population, distance_km]].head())为什么选 BallTree 而非 KDTreeKDTree假设空间是欧氏平面而地球是球面用它算距离误差可达 10%BallTree支持haversine直接在球面上计算精度高且速度不输KDTree。5.2 构建前端城市下拉联动生成精简 JSON体积压缩 90%cities.json12MB 对前端不友好。按需裁剪字段并压缩# 生成前端专用精简版仅需 city, state_code, county_name, population frontend_data df[[ city, state_code, county_name, population, latitude, longitude ]].dropna(subset[city, state_code]).to_dict(records) # 移除空 county_name压缩 population 为整数 for r in frontend_data: r[population] int(r[population]) if pd.notna(r[population]) else 0 r[county_name] r[county_name] or # 写入 gzip 压缩 JSON体积从 12MB → 1.3MB import gzip with gzip.open(cities_frontend.min.json.gz, wt, encodingutf-8) as f: import json json.dump(frontend_data, f, separators(,, :)) # 去除空格换行 print(✅ 前端精简版生成, f{len(frontend_data)} 条记录gzip 后体积 {Path(cities_frontend.min.json.gz).stat().st_size / 1024:.1f} KB)落地价值前端可直接fetch(/cities_frontend.min.json.gz)加载现代浏览器原生支持 gzip 解压字段精简后JavaScriptJSON.parse()内存占用降低 80%渲染下拉框更快population强制转int避免前端typeof 12345.0 number导致的类型困惑。5.3 验证数据可信度用 Census Bureau 官方 API 交叉核验 3 个关键城市别全信 ZIP 包里的数据。抽样核验是最省力的可信度保障import requests def verify_city_from_census(city_name, state_code): # Census API 示例调用 ACS 5-Year Estimates 获取城市人口 # 注意需申请 API Key免费此处用 mock URL 演示逻辑 url fhttps://api.census.gov/data/2020/acs/acs5?getNAME,B01003_001Eforplace:{city_name}instate:{state_code}keyYOUR_KEY try: resp requests.get(url, timeout10) if resp.status_code 200: census_pop int(resp.json()[1][1]) # 第二行是数据行第二列是人口 our_pop df[(df[city]city_name) (df[state_code]state_code)][population].iloc[0] diff_pct abs(census_pop - our_pop) / census_pop * 100 return f{city_name}, {state_code}: Census{census_pop}, Our{our_pop}, Diff{diff_pct:.1f}% return f{city_name}, {state_code}: Census API error {resp.status_code} except Exception as e: return f{city_name}, {state_code}: Request failed: {e} # 验证三个典型城市 for city_state in [(New York, NY), (Los Angeles, CA), (Chicago, IL)]: print(verify_city_from_census(*city_state))我的血泪经验验证不是为了挑错而是建立数据信任链。我曾发现Chicago人口在 ZIP 包中比 Census 2020 少 12%追查发现是us_cities.csv用的是 2019 年估算值而cities.json是 2020 年终值——同一 ZIP 包内数据源版本不一致必须注明。永远在 README 或数据加载脚本开头写明“本数据基于 US-Cities-Database v2023.01.01人口字段取自 cities.json2020 Census坐标取自 us_cities.csv2022 年校准”。希望帮到你。本文还有配套的精品资源点击获取

相关推荐

Ubuntu 22.04在VMware 17安装Tools终极指南
Ubuntu 22.04在VMware 17安装Tools终极指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 6:10:51

oh-my-opencode-slim 桌面伴侣 Companion:浮动 Agent 状态叠加层配置、安装与自更新机制全解
oh-my-opencode-slim 桌面伴侣 Companion:浮动 Agent 状态叠加层配置、安装与自更新机制全解

人工智能AI AgentAgent 编排AI 技能 【免费下载链接】oh-my-opencode-slim Lean, fine tuned Opencode multi agent suite Mix any models Auto delegate tasks 项目地址: https://gitcode.com/gh_mirrors/oh/oh-my-opencode-slim 点击查看 免费下载 导读&#x… · 2026/9/25 6:10:51

Halcon 24.11安装配置全指南:运行时环境定制与插件管理实战
Halcon 24.11安装配置全指南:运行时环境定制与插件管理实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 6:10:51

Atlas 300V 24G推理卡部署YOLOv5实战:从环境配置到性能调优
Atlas 300V 24G推理卡部署YOLOv5实战:从环境配置到性能调优

最近好多人在问 Atlas 300V 24G 是不是一张“运算加速卡”,还有人问我能不能拿它来训练 YOLO。这个问题的答案其实就一句话:它是推理加速卡,不是训练卡,但搞定 YOLO 目标检测的线上部署,它确实是一把好手。我去年在 At… · 2026/9/25 6:52:25

Union Alpha限免实测:从zcode配置到机械臂操控全流程
Union Alpha限免实测:从zcode配置到机械臂操控全流程

最近圈子里被一个叫Union Alpha的模型刷屏了,宣传口径特别直接:性能逼近Astra,限免一周。我一开始以为又是哪个实验室放出来的营销烟雾弹,结果测了三天发现这玩意儿确实有点东西,尤其是在工具调用和视觉控制这块&#… · 2026/9/25 6:52:19

深度解析 Hypothesis 测试执行次数:`max_examples` 的完整运行语义与底层实现
深度解析 Hypothesis 测试执行次数:`max_examples` 的完整运行语义与底层实现

测试开发工具 【免费下载链接】hypothesis The property-based testing library for Python 项目地址: https://gitcode.com/gh_mirrors/hy/hypothesis 点击查看 免费下载 本指南聚焦 Hypothesis(Python 属性测试库)中一个看似简单实则微妙的… · 2026/9/25 6:52:13

BentoML Keras 集成实战:save_model、load_model 与 get 三大 API 全解析
BentoML Keras 集成实战:save_model、load_model 与 get 三大 API 全解析

模型推理服务人工智能后端大模型MLOpsLLMOps 【免费下载链接】BentoML The easiest way to serve AI apps and models - Build Model Inference APIs, Job queues, LLM apps, Multi-model pipelines, and more! 项目地址: https://gitcode.com/gh_mirrors/be/BentoM… · 2026/9/25 6:52:13

OctoPrint JavaScript 客户端库 printer 组件完全指南:通过 `OctoPrint.printer` 掌控你的 3D 打印机
OctoPrint JavaScript 客户端库 printer 组件完全指南:通过 `OctoPrint.printer` 掌控你的 3D 打印机

物联网后端 【免费下载链接】OctoPrint OctoPrint is the snappy web interface for your 3D printer! 项目地址: https://gitcode.com/gh_mirrors/oc/OctoPrint 点击查看 免费下载 导读 本文聚焦 OctoPrint JavaScript 客户端库(JS Client Library&am… · 2026/9/25 6:52:13

【Coze】在Coze平台使用源码创建工作流
【Coze】在Coze平台使用源码创建工作流

Coze 提供了图形化的工作流搭建平台,适用于低代码构建自动化任务流程。通过资源管理、节点配置与流程连接,可实现多种业务逻辑的在线部署。 本文介绍如何在 Coze 中创建工作流资源、导入流程 JSON 配置,并完成起止节点的连接与字段设置,直至试运行与发布上线的全过程。 文… · 2026/9/25 6:52:07

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码