ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

GeoPandas 1.1.4 数据结构实战指南:GeoSeries 与 GeoDataFrame 的构造、索引对齐与状态审计

GeoPandas 1.1.4 数据结构实战指南:GeoSeries 与 GeoDataFrame 的构造、索引对齐与状态审计 GeoPandas 1.1.4 数据结构实战指南GeoSeries 与 GeoDataFrame 的构造、索引对齐与状态审计【免费下载链接】scientific-agent-skillsTurn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 190,000 scientists worldwide. 165 ready-to-use validated skills plus 100 scientific databases covering biology, chemistry, medicine, and drug discovery. Compatible with Cursor, Claude Code, Codex, Pi, Antigravity, and the open Agent Skills standard.项目地址: https://gitcode.com/GitHub_Trending/cl/scientific-agent-skillsGeoPandas 1.1.4 以geometry扩展 dtype 扩展了 pandas底层由 Shapely 2 提供几何运算支持GeoSeries是值为几何对象的 pandas SeriesGeoDataFrame是带有一个活动几何列、并可携带多个附加几何列的 DataFrame。本文基于 scientific-agent-skills 仓库中>uv venv --python 3.12 uv pip install \ geopandas1.1.4 \ numpy2.5.1 \ pandas3.0.5 \ shapely2.1.2 \ pyproj3.7.2 \ pyogrio0.13.0 \ pyarrow25.0.0 \ packaging26.2从仓库源码看scripts/_common.py 中的PINNED_STACK正是把geopandas 1.1.4、shapely 2.1.2、pyproj 3.7.2、pyogrio 0.13.0、pyarrow 25.0.0等版本钉死为一个可验证快照所有运行时分析 CLI 都会用package_versions()检查当前环境是否与该快照匹配。这意味着本文涉及的构造、对齐与审计语义都以该版本栈为基准。构造构造期即显式声明 CRS规范第一条铁律当 CRS 已知来自权威元数据时必须在构造阶段直接赋值绝不允许从坐标数值范围反推 CRS。原因在于地理坐标范围与投影坐标范围高度相似猜测极易把 EPSG:3857 与地理坐标混为一谈而 CRS 语义错误会在后续 buffer、distance、area 计算中静默放大。三种典型构造方式import geopandas as gpd import pandas as pd from shapely import Point, box # 1. 直接构造 GeoSeries带索引、CRS 与列名 points gpd.GeoSeries( [Point(0, 0), Point(1, 1), None], index[feature-a, feature-b, feature-c], crsEPSG:3857, namelocation, ) # 2. 直接构造 GeoDataFrame显式指定活动几何列 gdf gpd.GeoDataFrame( { feature_id: [feature-a, feature-b], value: [10, 20], geometry: [Point(0, 0), Point(1, 1)], }, geometrygeometry, crsEPSG:3857, ) # 3. 从普通 DataFrame 用 points_from_xy 派生几何列 table pd.DataFrame({x: [0.0, 1.0], y: [0.0, 1.0]}) from_xy gpd.GeoDataFrame( table, geometrygpd.points_from_xy(table[x], table[y]), crsEPSG:3857, )一个高频踩坑点points_from_xy的参数顺序是先 x 后 y。对于地理数据即坐标数组中通常是经度在前、纬度在后即使 EPSG:4326 的权威定义宣称其轴顺序是纬度在前、经度在后。GeoPandas 的坐标数组一律使用传统 GIS 的(x, y)顺序参见 SKILL.md 的 CRS and antimeridian rules 一节只有在需要显式坐标数组管线时才用Transformer(..., always_xyTrue)并记录该选择。活动几何列与附加几何列谁驱动帧级空间运算GeoDataFrame可以同时持有多个几何列每个几何列都携带自己的 CRS 元数据但帧级空间方法buffer、intersects、centroid 等只作用于活动几何列。gdf[buffered] gdf.geometry.buffer(10) gdf gdf.set_geometry(buffered) assert gdf.active_geometry_name buffered assert gdf.geometry.name buffered gdf gdf.rename_geometry(analysis_geometry)需要牢牢记住的关键区别gdf.geometry永远返回当前活动几何列并不一定是一个字面名为geometry的列rename_geometry()会同步更新活动列簿记如果用的是普通 pandasrename(columns...)则必须随后调用set_geometry()重新声明活动列多个几何列可以拥有不同的 CRS 元数据。切换活动列会同步切换gdf.crs暴露出的 CRS——这是最常见的CRS 悄悄变化来源常规矢量格式GeoPackage、Shapefile、GeoJSON通常每个图层只支持一个几何列GeoParquet 与 Feather 可以保留多个几何列data-io.md 中明确to_parquet会保留全部几何列且默认geometry_encodingWKB以最大化互操作性GeoPandas 1.0 改变了set_geometry(named_series)的语义传入命名的 Series 时Series 的名字会成为新的活动列名旧几何列会被保留。避免使用已弃用的drop参数改名/删除请显式完成。检查每个几何列时不能只检查gdf.geometry要独立遍历所有geometrydtype 列geometry_columns [ name for name, dtype in gdf.dtypes.items() if str(dtype) geometry ] column_crs {name: gdf[name].crs for name in geometry_columns}仓库中的inspect_geoparquet见 scripts/_common.py在读取 GeoParquet 时同样按每一几何列统计 CRS 元数据状态missing/null/present印证了逐列独立核验的必要性一个文件中crs键缺失规范默认OGC:CRS84与显式crs: null未知是两种不同的状态绝不能混为一谈。缺失、空、无效三种截然不同的几何状态很多分析结果的错误源于把三种状态混为一谈状态判定含义缺失 Missingseries.isna()几何未知以None表示空 Emptyseries.is_empty一个没有坐标的几何对象无效 Invalid~series.is_valid先排除缺失坐标违反拓扑规则标准分离写法missing gdf.geometry.isna() empty gdf.geometry.is_empty invalid (~missing) (~empty) (~gdf.geometry.is_valid) usable ~(missing | empty | invalid)语义要点缺失值通常会沿逐元素运算传播并被union_all()这类归约操作忽略空几何则作为真正的几何对象参与运算——它的面积可以是0.0求交后仍然是空的。因此绝不能只用dropna()来清除不可用几何因为它只处理了None空与无效几何仍然留在数据中。这一三态分离在仓库脚本中得到了完全一致的实现scripts/_common.py 的geometry_state()分别统计missing、empty、invalid、valid_nonempty并额外统计几何类型计数与有效性原因类别输出 JSON 时明确声明coordinates_emitted: False、identifiers_emitted: False。也就是说先分三态、再定可用性既是数据处理规范也是仓库内置审计工具的实现事实。索引对齐二元几何运算是行式的不是全配对二进制几何方法intersects、within、distance等是逐行row-wise操作绝不是两两全配对。当传入 GeoSeries 参数时alignNone默认按标签对齐left gpd.GeoSeries([Point(0, 0), Point(1, 1)], index[a, b]) right gpd.GeoSeries([Point(1, 1), Point(0, 0)], index[b, a]) by_label left.intersects(right, alignTrue) by_position left.intersects(right, alignFalse)使用alignFalse的前提是已证明两侧长度相等、且行顺序确实是预期的位置配对。GeoPandas 1.0 起对某些未对齐的 pandas Series 方法参数会直接抛错以避免歧义的自动对齐。真正的全配对匹配请使用空间连接sjoin或空间索引查询sindex.query它们才回答左侧每一个要素是否与右侧任意要素相交。赋值同样按索引对齐result gdf.copy() derived result.geometry.buffer(10) result.loc[:, buffered] derived # label-aligned规范给出的纪律是在进行位置性工作positional work之前有意识地重置或保留索引永远不要把 pandas 索引当作稳定的要素标识符。这一点与 geometric-operations.md 中二元 GeoSeries 调用是 1:1 且默认索引对齐的描述相互印证。要素身份与基数控制穿过 joins、explode、overlay、dissolve 的稳定 ID规范要求在工作流中跨越读取、连接、explode、overlay、dissolve 与导出全程保留一个非空且稳定的要素 ID 列ids gdf[feature_id] if ids.isna().any() or ids.duplicated(keepFalse).any(): raise ValueError(feature_id must be non-null and unique for this workflow)改变行基数的操作需要显式的谱系provenance记录explode(ignore_indexFalse, index_partsFalse)GeoPandas 1.0 默认不生成部件级 MultiIndex如果部件也需要身份请自行创建部件编号列空间连接sjoin可能让任意一侧重复出现两侧的源 ID 都要保留overlay 会把一个要素切分成多个overlay之前先加上源 ID之后再生成派生 IDdissolve 有意合并 ID记录分组键与聚合规则pd.concat要求各几何列的 CRS 元数据兼容且除非ignore_indexTrue否则会保留重复索引。仓库审计脚本把这一原则落到了参数层geometry_validity_report.py与spatial_join_audit.py都提供--id-column/--left-id/--right-id参数底层调用duplicate_column_state()scripts/_common.py只输出空行数、重复行数计数不输出任何 ID 值——这正是ID 可审计、但 ID 内容保密的隐私化实现。几何类型与维度geom_type、has_z、has_mgeom_type、has_z以及Shapely 2.1 起has_m描述的是不同维度的属性。混合几何类型在内存中是合法的但可能破坏 overlay 或导出契约Z 与 M 坐标不参与 GeoPandas 的平面拓扑运算参见 geometric-operations.md 开篇Operations are planar, two-dimensional, and expressed in CRS coordinate units. Z/M ordinates may be carried but are not part of topology.。summary { types: gdf.geometry.geom_type.value_counts(dropnaFalse).to_dict(), has_z: int(gdf.geometry.has_z.sum()), has_m: int(gdf.geometry.has_m.sum()), }不要静默丢弃 Z/M。如果目标格式或运算只能处理二维必须记录这次降维损失并创建一个新的派生产物源数据保持不变。仓库实现同样如此geometry_state()对has_z、has_m分别fillna(False)后求和计数且set_precision只对 x/y 取整、不圆整 Zgeometric-operations.md。复制与转换read_file、merge、to_numpy 的正确姿势替换活动几何列之前先gdf.copy()避免在原始帧上就地修改merge()要从GeoDataFrame 一侧调用plain_df.merge(gdf, ...)可能返回一个非空间 DataFrameGeoPandas 1.0 中read_file()读取不含几何列的图层时返回普通 pandas DataFramenp.asarray(gdf.geometry)或gdf.geometry.to_numpy()用于替换已移除的GeometryArray.data访问不要用 pickle 序列化几何进行交换应使用 GeoPackage、GeoParquet、WKB 或 WKT并显式约定 CRS。从仓库源码看scripts/_common.py 的load_geodataframe()正是这样做的它先用gpd.read_file(..., enginepyogrio, rowsslice(0, max_features 1), use_arrowTrue)读取并校验isinstance(frame, gpd.GeoDataFrame)不满足即报所选图层没有几何列——印证了非空间图层返回 DataFrame这一 1.x 行为是引擎层的既定事实。它同时示范了两种安全读法rowsslice(0, max_features1)读取上限加一行超出即 fail closeduse_arrowTrue加速 bulk 传输但不改变解析信任边界。最小结构审计不输出坐标与标识符的元数据清单规范要求在不发出坐标或标识符的前提下记录以下六项行数与列数活动几何列与附加几何列的名称每个几何列的 CRS缺失、空、无效、Z/M 与各几何类型的计数索引唯一性、稳定 ID 的空值与重复计数源文件哈希、解析器/驱动、包/原生库版本、操作时间戳。仓库为此提供了两个开箱即用的审计 CLI路径均在 SKILL.md 的 Bundled local CLIs 表中登记python skills/geopandas/scripts/vector_inventory.py --help python skills/geopandas/scripts/vector_inventory.py data.gpkg python skills/geopandas/scripts/geometry_validity_report.py data.gpkg python skills/geopandas/scripts/geometry_validity_report.py data.gpkg \ --id-column feature_id --method structure --repair-output repaired.gpkgscripts/vector_inventory.py输出脱敏的本地矢量/GeoParquet 技术清单。源码显示其输出包含源文件 basename 的 SHA-256、后缀、主文件字节数与哈希、technical_inventory驱动、图层数、声明的要素数、字段类型计数、敏感字段名计数、几何类型、编码、CRS 摘要、资源上限、堆栈版本对照PINNED_STACK以及coordinates_emitted: False、identifiers_emitted: False、network_accessed: False三面旗帜scripts/vector_inventory.py。scripts/geometry_validity_report.py有界的三态几何审计。默认 dry-run--repair-output时才把make_valid(method...)的结果写入新的GeoPackage。其report()实现会先统计before三态再用make_valid(method, keep_collapsed...)生成simulated_after并统计修复前后的几何类型跳变行数type_transition_rows写入后立即重新读取并比对几何状态不一致则删除输出并报错scripts/geometry_validity_report.py——这就是重新打开并验证每个导出的可执行版本。在调用前注意这些 CLI 是仅本地工具会拒绝 URL、GDAL/vsi*路径、归档、符号链接、路径穿越与白名单外的后缀ALLOWED_INPUT_SUFFIXES仅含 GDAL/Parquet/Feather 后缀见 scripts/_common.py并且把max_input_bytes默认限制在 64 MiB、要素数默认限制在 100,000 条。版本迁移注意事项0.14 及更早版本如果你的代码来自 GeoPandas 0.14 或更早版本SKILL.md 的迁移清单与本主题直接相关的要点有explode()现在默认index_partsFalse传给set_geometry()的命名 Series 会提供新的活动列名不要再依赖弃用的set_geometry(drop...)改用显式的set_crs()与 rename/drop 步骤不要用.crs赋值来覆盖元数据命名右索引可以替代sjoin输出中的index_right旧unary_union属性已弃用改用union_all()GeometryArray.data用to_numpy()/np.asarray取代。小结GeoPandas 1.1.4 的数据结构看似只是带几何的 DataFrame但正确的工程实践取决于三个关键认识CRS 必须在构造期显式赋值、活动几何列才是帧级运算的锚点、缺失/空/无效与 Z/M 是必须逐项审计的不同状态。索引对齐默认是行式标签对齐、pandas 索引不能充当稳定要素身份、改变行基数的操作必须保留源 ID 谱系——这些纪律配合仓库提供的vector_inventory.py与geometry_validity_report.py等脱敏审计 CLI可以在不泄露坐标与标识符的前提下把结构正确性变成每个工作流可重复验证的关卡。如需继续深入可阅读仓库中的 crs-management.md、geometric-operations.md、spatial-analysis.md、data-io.md 与 visualization.md 等系列参考文档。【免费下载链接】scientific-agent-skillsTurn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 190,000 scientists worldwide. 165 ready-to-use validated skills plus 100 scientific databases covering biology, chemistry, medicine, and drug discovery. Compatible with Cursor, Claude Code, Codex, Pi, Antigravity, and the open Agent Skills standard.项目地址: https://gitcode.com/GitHub_Trending/cl/scientific-agent-skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表