geo数据库上传失败是不是让你头大如斗?明明文件没毛病,点一下就报错,急得直拍大腿。其实这锅多半不背在数据头上,而是配置和环境的事儿没整明白。
别慌,我这就给你掰扯清楚,怎么把这块硬骨头啃下来。
第一件要查的就是字段映射。很多兄弟喜欢偷懒,直接全量导入,结果 geo数据库上传失败 的提示弹出来,看都懒得看。你想想,GeoJSON 或者 Shapefile 里的经纬度,和你数据库里定义的 point 或者 geometry 类型对得上号吗?我有个朋友,上次就是少写了个 SRID,系统以为你玩的是火星坐标系,直接拒收。这时候别傻乎乎地重试,打开日志看最后一行报错信息,十有八九是指针指向字段类型不匹配。把源数据的字段名和数据库表结构一一对照,特别是那些带下划线的多义词,改完再试,通常能解决一半的疑难杂症。
第二,别忽略字符集和大文件问题。你以为 10MB 的文件不算啥?在云环境或者老版本的服务器上,这就是个坎。如果传的是超大 GeoDataFrame,内存爆了怎么办?要么拆包,分批次上传;要么调整 PHP 或者 Python 环境里的 max_execution_time 和 memory_limit。我就见过有人传个全国的 POI 点位,卡在 99% 然后超时断开。这时候 geo数据库上传失败 的原因根本不是逻辑错误,而是服务器在那儿“喘粗气”呢。你可以试着把文件切成几千条一条的小块,或者用命令行工具 psql 批量跑脚本,比在网页后台点鼠标稳妥多了。网页后台那是给人看演示用的,真干活还得靠脚本。
第三,权限和空间索引,这是最隐蔽的坑。数据写进去了,但是查不到?或者报错说“no permission”?那是你的数据库账号权限不够,特别是涉及到 GIST 索引建立的时候,需要 ALTER TABLE 的高级权限。普通用户只能 INSERT,不能 REINDEX。另外,千万别忘了建立空间索引。没索引的空间数据查询,简直就是对着大海捞针。记得执行 CREATE INDEX ON your_table USING GIST (geom); 这行代码。如果这一步没做,后续所有的空间查询性能都会烂成一坨翔。
还有个小细节,坐标范围。如果你的数据里混进了无效的经纬度,比如 999,888 这种鬼地方,PostGIS 直接抛异常。用 QGIS 或者 ArcGIS 先跑一遍拓扑检查,把坏数据刷掉再传。别问我怎么知道的,我当时就被这种“脏数据”折磨了半宿。
最后,如果是跨平台迁移,比如从 SQL Server 的 Geography 转到 PostGIS 的 Geometry,记得转换 WKT 格式中间层。直接搬二进制格式大概率会水土不服,导致 geo数据库上传失败 且数据乱码。转换 WKT 虽然慢点,但是稳。
搞定这些,你会发现所谓的“玄学错误”其实都有迹可循。下次再遇到这类问题,先别骂街,查查日志,看看映射,测测权限。搞定它,也就那么回事。别被一个小小的报错搞得心态崩盘,技术这行,就是不断试错不断修复的过程。希望这篇能帮你省下几杯咖啡的时间,直接开工。