做地图开发这几年,最头疼的不是算法多难,而是数据格式对不上。这篇主要解决OpenLayers里加载GeoJSON时坐标偏移、样式不生效以及大数据量卡顿的问题,看完直接能改代码。
我是老张,在GIS这行摸爬滚打八年,见过太多人拿着PostGIS导出的数据,直接扔进前端项目里,结果地图上一片空白或者乱成一锅粥。很多人以为GeoJSON就是简单的JSON加个坐标,其实里面的坑深得很。特别是当你用OpenLayers(简称OL)去解析它的时候,稍微不注意,你的项目上线就是灾难现场。
先说最让人头秃的坐标系问题。
很多新手拿到数据,发现点都在非洲或者大西洋中间,根本不在中国境内。这时候别急着骂数据提供方,先检查你的ol.geo.geojson解析器配置。OpenLayers默认解析的是EPSG:4326,也就是经纬度。如果你的数据源是EPSG:3857(墨卡托投影),直接解析肯定错。
我之前有个客户,做智慧园区的项目,甲方给的是CAD转出来的坐标,属于局部坐标系。我当时的做法是在加载数据前,强制转换坐标系。代码里加一行transform就行,但要注意性能。如果你一次性加载几万个点,全在前端转,浏览器直接卡死。正确的姿势是后端转好,或者前端用Web Worker异步处理。别偷懒,前端JS单线程,你转多了页面就假死了。
再说说样式渲染的坑。
有时候数据加载成功了,地图上也显示了,但颜色不对,或者图标不显示。这通常是因为GeoJSON里的属性字段名和样式配置对不上。比如数据里叫“area”,你样式里写的是“Area”,大小写敏感,直接导致样式失效。
还有个隐蔽的问题,就是几何类型的匹配。OpenLayers对MultiPolygon和Polygon的处理逻辑不一样。如果你的GeoJSON里混用了这两种类型,而你的样式只针对Polygon写了规则,那么MultiPolygon的部分就会用默认样式,看起来像漏数据。我上次排查一个项目,找了半天bug,最后发现是数据里有个别地块因为拓扑错误,被解析成了无效几何体,OL直接忽略了它们。解决这类问题,得在加载前做数据清洗,或者在OL的format里设置ignoreExtraDimensions之类的参数,虽然这招不推荐,但应急管用。
最后谈谈性能优化。
别以为GeoJSON比Shapefile轻量就随便用。如果一个县的边界数据,包含了几万个坐标点,直接塞进ol.geo.geojson解析,内存占用能飙到几百兆。这时候要么在后端做简化,用Douglas-Peucker算法简化线条;要么在前端用矢量切片(Vector Tiles)。如果非要全量加载,记得给FeatureCollection加个ID索引,方便后续查询和交互。
真实案例分享:去年给某物流公司做车辆轨迹回放,数据量是千万级的GeoJSON片段。一开始全量加载,页面加载要15秒。后来我把数据按区域分块,用户缩放地图时再按需加载ol.geo.geojson数据,加载时间缩短到2秒以内。虽然代码复杂了点,但用户体验提升巨大。这点投入值得。
总结一下,处理ol.geo.geojson不是简单的读文件,而是涉及坐标、样式、性能的系统工程。别指望一劳永逸,多测试不同边界情况。
如果你还在为地图数据加载发愁,或者遇到坐标偏移搞不定,别自己死磕了。可以找我聊聊,我手头有几套清洗数据的脚本,或许能帮到你。毕竟,解决问题比写代码重要。