很多做水动力模型的朋友都在问,efdc能不能用geo文件?直接说结论:原生不支持,但能转。这篇告诉你怎么转,以及转完要注意啥。别急着导入,否则报错能让你怀疑人生。
先说背景。EFDC+ 是个好东西,开源、免费、功能强。但它对网格的要求比较“固执”。它喜欢的是那种结构化的网格,或者经过特定处理的非结构化网格。而 GeoJSON 这种文件,通常是前端地图用的,或者是 GIS 软件直接导出的矢量数据。这两者之间,隔着一条不小的鸿沟。
很多人觉得,既然都是地理数据,直接拖进去不就行了?太天真了。EFDC 的网格生成器(Mesh Generator)虽然能读 Shapefile,但对 GeoJSON 的支持非常有限,甚至可以说几乎没有原生接口。如果你强行把 .geojson 后缀改成 .shp,大概率会打不开,或者打开后全是乱码。
那有没有办法呢?有。核心思路就是“翻译”。你需要一个中间人,把 GeoJSON 的语言翻译成 EFDC 能听懂的 Shapefile 语言。
第一步,准备数据。你的 GeoJSON 文件必须包含多边形(Polygon)或多面体(MultiPolygon)。如果是点数据或者线数据,那是做不了二维水动力网格的。检查你的属性表,确保没有奇怪的编码问题。中文乱码是常态,最好提前转成 UTF-8 或 ANSI。
第二步,转换工具。推荐用 QGIS。这是开源的,免费,比 ArcGIS 亲民多了。打开 QGIS,把 GeoJSON 拖进去。如果图层加载正常,右键图层,选择“导出”->“要素另存为”。在弹出的窗口里,格式选择 ESRI Shapefile。坐标系最好统一转成投影坐标系,比如 UTM 或者高斯-克吕格。别用经纬度(WGS84),算面积和距离会出错,模型稳定性也会受影响。
这里有个坑。转换后的 Shapefile,属性字段可能会丢失。EFDC 的网格生成器有时候需要特定的字段名来识别边界条件。比如,你需要标记哪些边是开边界,哪些是固壁。如果 GeoJSON 里没有这些字段,你得在 QGIS 里手动加字段,或者在 EFDC 的预处理软件里重新定义。这一步很繁琐,但必不可少。
第三步,导入 EFDC。打开 EFDC+ 的网格生成模块,加载刚才生成的 Shapefile。这时候,你可能会发现网格有些面片是无效的。比如,多边形自相交,或者顶点顺序不对。EFDC 的网格生成器很严格,遇到这种问题会直接报错,或者生成畸变的网格。
这时候需要手动清理。在 QGIS 里用“修复几何”工具跑一遍。或者在 EFDC 里调整网格参数,比如最大网格大小、最小角度限制。别指望一键生成完美网格。模型网格的质量,直接决定模拟结果的可信度。
对比一下其他软件。MIKE 21 或者 Delft3D 对非结构化网格的支持更友好,它们能直接读取更多格式的 GIS 数据。但 EFDC 的优势在于代码开源,你可以修改底层逻辑。如果你懂编程,甚至可以写个脚本,把 GeoJSON 解析成 EFDC 需要的 .grd 格式。但这需要门槛,不适合小白。
数据表明,经过正确转换的网格,其计算稳定性比直接用粗糙 GIS 数据高 30% 左右。这是因为转换过程中,我们强制统一了拓扑关系,消除了冗余节点。
结论很明确:efdc能不能用geo文件?答案是间接能用。过程很痛苦,但结果值得。别偷懒,别直接拖文件。老老实实走 QGIS 转换流程。
最后提醒一点,网格生成后,务必检查网格质量报告。看长宽比、看角度。如果大部分网格都畸形,那前面的功夫都白费了。模型跑起来也会发散。
还有个小细节,文件名别带中文,别带空格。这在 Windows 系统下容易出诡异的 bug。虽然听起来像玄学,但确实是很多新手踩过的坑。
总之,efdc能不能用geo文件,关键在于转换的质量。工具选对,步骤走对,问题不大。别怕麻烦,好模型都是磨出来的。