120 个开发中真实遇到的问题,按现象分类,给出成因、排查顺序与解决代码。
看得懂,跑得起来
每个案例对应一个网页,网页里包含完整的现象描述、排查顺序与可直接复制的代码。 本手册是速查清单,用于快速定位问题;具体实现以网页版本为准。
用 GPS 采的点标到高德或百度地图上,整体偏出去几百米,而且不同城市偏的还不一样多。
jingweizhi.com/cookbook/coordinate-offset.html底图是自己接的,数据是业务方给的,两边单看都没问题,叠在一起整体偏出去一段。
jingweizhi.com/cookbook/basemap-misalign.htmlGPS 点位在高德底图上偏出去半公里,接口里明明已经转过坐标了,前端又转了一遍。
jingweizhi.com/cookbook/gcj02-double-convert.html从百度接口拿到的点是 BD-09,减掉 0.0065 和 0.006 之后仍然对不上 GPS 原始点,差 480 多米。
jingweizhi.com/cookbook/bd09-fixed-minus.html接口返回 13522390, 3669872,塞进 L.marker 后地图一 zoom 就飞到北极,标记也不见了。
jingweizhi.com/cookbook/epsg3857-as-4326.html数据按 49 带投影,地图却声明成 50 带,点位整体东移半个省。
jingweizhi.com/cookbook/utm-zone-off-by-one.htmlEPSG:4546 和 EPSG:4547 只差一个数字,位置差了近三个经度。
jingweizhi.com/cookbook/gauss-kruger-band.html文件能正常解析,features.length 也对,就是地图上什么都看不见。
jingweizhi.com/cookbook/geojson-no-crs.html小比例尺看不出来,一到 1:500 放样就发现控制点和实测点对不上。
jingweizhi.com/cookbook/cgcs2000-wgs84-mix.html天地图服务目录里写着 CGCS2000,选了 4479,拿到的却是 X/Y/Z 三个米值。
jingweizhi.com/cookbook/tdt-4490-4479.html为了「让坐标直出度」,把地图 CRS 换成 4326,结果圆变成了椭圆,省界也矮了一截。
jingweizhi.com/cookbook/leaflet-4326-stretch.html底图正常显示,叠加的规划图却整体偏右上,缩放越大偏得越多。
jingweizhi.com/cookbook/overlay-two-crs.html同样的转换代码,换一个 EPSG 码就抛异常,控制台只说「未知投影」。
jingweizhi.com/cookbook/proj4-defs-missing.html从 GeoServer 取同一块范围,1.1.1 正常,1.3.0 返回空白图或上下颠倒的图。
jingweizhi.com/cookbook/wms-130-axis-order.html地方坐标转 CGCS2000,近处看着还行,越往外偏得越离谱,像被整体放大了两倍多。
jingweizhi.com/cookbook/seven-param-scale-ppm.html一条连续的边界线,转了坐标之后在河中间断开,两侧相差 600 米。
jingweizhi.com/cookbook/gcj02-out-of-china.html用 lng * 20037508.34 / 180 自己算百度瓦片坐标,结果和百度的瓦片对不上。
jingweizhi.com/cookbook/bd09-mcband.html数据库字段是 decimal(9,2),存进去的点全被吸到 0.01 度的网格上。
jingweizhi.com/cookbook/coordinate-precision.html南极科考站的点一加进去,整个图层就不渲染了,控制台却一声不响。
jingweizhi.com/cookbook/mercator-lat-limit.html同一份投影代码,北半球的点正常,南半球的点 y 全是负的,排序时全跑到最前面。
jingweizhi.com/cookbook/utm-south-false-northing.html代码看起来没问题,库也加载了,页面就是一片白。最难查的一类问题,因为没有任何错误信息。
jingweizhi.com/cookbook/map-blank.html地图只在主页面正常,一放进弹窗、抽屉、标签页,就只画左上角一小块,或者整片空白。
jingweizhi.com/cookbook/map-in-modal.html地图框架加载正常,但底图是一格一格的灰色方块,网络面板里一片红色。
jingweizhi.com/cookbook/tile-404-cors.html文件不大,但打开页面后转圈八秒,期间点击任何按钮都没反应。
jingweizhi.com/cookbook/geojson-large-freeze.html边界线画得一丝不差,属性弹窗里的地名却是「鍖椾含甯傚湴鍥炬」。
jingweizhi.com/cookbook/shp-gbk-garbled.html一批北京的点,加载后坐标显示 39.9, 116.4,落点在印度洋。
jingweizhi.com/cookbook/csv-lonlat-swapped.html后端拼的 GeoJSON 在 QGIS 里打不开,前端有时报错、有时什么都不画。
jingweizhi.com/cookbook/geojson-multipolygon-depth.html图层能显示,但比例尺总比底图大一级,设施点位与影像对不上。
jingweizhi.com/cookbook/wmts-tilematrix-offset.html同一份数据直接读文件正常,从 GeoServer 出图就整体平移,差半米,肉眼几乎看不出。
jingweizhi.com/cookbook/geoserver-srs-mismatch.html接口里混进两条 geometry 为 null 的记录,整个地图初始化就中断了。
jingweizhi.com/cookbook/geojson-null-geometry.html文件从 20 MB 压到 3 MB,转换后却画不出任何东西,坐标是 7823、4210 这样的整数。
jingweizhi.com/cookbook/topojson-missing-transform.html斐济的专属经济区,在地图上变成一条横跨太平洋的细长条,中间还穿透了非洲。
jingweizhi.com/cookbook/antimeridian-polygon.html同事只发了 .shp、.shx、.dbf 三个文件,打开后数据跑到非洲西海岸。
jingweizhi.com/cookbook/shapefile-prj-missing.html数据表里明明有 population_total,导出的 Shapefile 里只剩 population。
jingweizhi.com/cookbook/dbf-field-name-limit.htmlKML 在 Google Earth 里正常,放进网页地图后每个点都变成一个破碎的小图标。
jingweizhi.com/cookbook/kml-relative-icon.html三百个点还算流畅,八百个点开始掉帧,两千个点拖动像放幻灯片。这是矢量图层最常见的性能瓶颈。
jingweizhi.com/cookbook/marker-performance.html用户打开页面,先看到空白背景几秒,再看到一堆灰块慢慢变成地图,最后才是数据。 每一段都在流失人。
jingweizhi.com/cookbook/first-screen-slow.html从 OpenStreetMap 换成国内底图,不只是把 URL 换掉。坐标系、Key、协议、配额四处都要动。
jingweizhi.com/cookbook/domestic-basemap.html代码没报错,tileset.json 也请求成功了,地球上就是什么都不显示。
jingweizhi.com/cookbook/tileset-load-fail.html直接访问 GeoServer 的 8080 端口一切正常,走 Nginx 就返回 502,刷新几次偶尔又成功。
jingweizhi.com/cookbook/wms-502-bad-gateway.html查询瓦片正常,一提交分析任务就报跨域;网络面板里多出一条 OPTIONS 请求,返回 405。
jingweizhi.com/cookbook/wms-cors-preflight.html数据库里新增的道路已经入库,WMS 直连能看到,瓦片服务却还是旧图,局部甚至出现新旧拼接的接缝。
jingweizhi.com/cookbook/tile-cache-inconsistent.html直连 GeoServer 正常,经过公司网关后所有请求都变成“缺少 LAYERS 参数”,服务端日志里看不到 BBOX。
jingweizhi.com/cookbook/nginx-proxy-drop-params.html在 GeoServer 里上传了 SLD,预览页面能看到效果,自己的 WMS 请求出来还是那套默认灰填充。
jingweizhi.com/cookbook/geoserver-sld-not-applied.html加载图层树时转圈,最后报“服务不可用”。直接打开能力文档地址,等了 58 秒才出来。
jingweizhi.com/cookbook/wms-getcapabilities-timeout.html站点切到 HTTPS 后,底图整片空白,控制台刷满 “Mixed Content” 警告,瓦片一个都没下下来。
jingweizhi.com/cookbook/mixed-content-block.html早上九点业务高峰,所有图层一起变慢,随后整站返回 503,重启 GeoServer 才能恢复。
jingweizhi.com/cookbook/geoserver-db-pool-exhausted.html手机上想拖地图,结果整页跟着滚;想双指缩放,页面被放大;地图在页面中间,永远滚不过去。
jingweizhi.com/cookbook/mobile-gesture.html地球能出来,底图是黑的,网络面板里所有 api.cesium.com 请求都返回 401。
jingweizhi.com/cookbook/cesium-ion-token-401.html模型加载成功了,相机也对准了,但建筑是一片纯白,和白色底图几乎融在一起,只能靠阴影分辨。
jingweizhi.com/cookbook/cesium-3dtiles-white-model.html坐标填的是地面点,模型却飘在半空十几米;换成另一个视角,又有一半埋进了山体。
jingweizhi.com/cookbook/cesium-model-float-sink.html用户按住右键向上拖,视角越过地平线,屏幕突然全黑,再拖几下地球从另一侧翻出来。
jingweizhi.com/cookbook/cesium-camera-underground.html影像早就铺满了,地形却一直有锯齿状的空洞,进度条停在一半,请求队列常年两百多条。
jingweizhi.com/cookbook/cesium-terrain-slow.html五百个站点时很流畅,加到两千个站点后拖动明显卡顿,性能面板里 update 阶段占了大头。
jingweizhi.com/cookbook/cesium-entity-drop-frame.html页面一打开就报错,容器明明写了 width: 100%; height: 100%, 浏览器算出来的却是 0×0。
jingweizhi.com/cookbook/cesium-widget-zero-size.html点击“导出图片”,拿到一张纯黑或全透明的 PNG;同一段代码在别的页面又是正常的。
jingweizhi.com/cookbook/cesium-screenshot-black.html想让夜景灯光有一点辉光,结果整屏像蒙了一层雾,建筑边界全糊了,帧率也掉了三分之一。
jingweizhi.com/cookbook/cesium-postprocess-black.htmlGLTFLoader 没有报错,进度条也走到了 100%,但屏幕上只有一个黑色剪影,完全看不出材质。
jingweizhi.com/cookbook/three-model-all-black.html同一张地面标牌贴图,用 TextureLoader 加载是正的,换成 canvas 或二进制数据生成之后就倒过来了。
jingweizhi.com/cookbook/three-texture-flipY.html模型在建模软件里是站着的,导进 three.js 后躺倒;按地图点位摆放后,楼的朝向又整体偏了 90 度。
jingweizhi.com/cookbook/three-y-up-vs-map.html地面模型上叠了一层道路面,近处还好,相机拉远之后整片道路像被噪声覆盖,来回闪烁。
jingweizhi.com/cookbook/three-z-fighting.html给玻璃幕墙设了 opacity: 0.4,结果每一层玻璃都像实心板,后面的楼完全被挡住。
jingweizhi.com/cookbook/three-material-transparent.htmlPLY 文件 1.8 GB,加载后浏览器内存涨到 3 GB,帧率 3 fps,动一下鼠标要等两秒。
jingweizhi.com/cookbook/three-pointcloud-lag.html一栋 60 米高的楼,导入后和 1 米的地面网格差不多大;换一个模型,又大得把相机包在里面。
jingweizhi.com/cookbook/three-gltf-scale.html用实例化渲染种树,位置大致对,但每棵树的旋转和缩放完全不受控制,还有一半根本不出现。
jingweizhi.com/cookbook/three-instanced-transform.html点了筛选按钮,控制台里的数组确实变了,地图上的点一个没少,颜色也没变。
jingweizhi.com/cookbook/deckgl-layer-not-refresh.html鼠标明明停在点上,onClick 里的 info.object 一直是空值, 只有 info.index 有时是 -1。
jingweizhi.com/cookbook/deckgl-pick-fail.htmlCSV 解析完内存就到 2.4 GB,浏览器标签页变白,标题变成“页面无响应”。
jingweizhi.com/cookbook/deckgl-oom-large-data.html底图拖动很顺,数据层慢半拍;缩放时点阵先变大再回弹,边界始终差一截。
jingweizhi.com/cookbook/deckgl-maplibre-view-sync.html数据是北京的点,图层却画在南极附近;换成另一个图层,控制台直接报顶点长度错误。
jingweizhi.com/cookbook/deckgl-coord-dimension.html图例里关掉“基站”层,结果“告警”层也一起消失;再打开,两个层都回来了。
jingweizhi.com/cookbook/deckgl-layer-id-duplicate.html地图能出现,也能拖动,但只有一个灰色背景,道路、水系、标注全都没有。
jingweizhi.com/cookbook/maplibre-style-load-fail.html没有报错,getLayer 也能查到,但屏幕上就是看不到任何新增的图形。
jingweizhi.com/cookbook/maplibre-layer-not-show.html符号图层加好了,样式里也写了 icon-image,地图上却一个图标都没有, 网络面板里一片红色 404。
jingweizhi.com/cookbook/maplibre-icon-404.html按照文档加了地形源,倾斜视角后山脉毫无起伏,建筑也没有跟着贴到坡面上。
jingweizhi.com/cookbook/maplibre-terrain-not-work.html换成自建样式后,道路编号、机场、地铁站图标全变成空白方块,地图其余部分完全正常。
jingweizhi.com/cookbook/maplibre-sprite-missing.html页面顶部是标题栏,下面留一格放地图,结果地图只有几个像素高,瓦片挤成一条线。
jingweizhi.com/cookbook/leaflet-flex-height-zero.html本地开发时标记是正常的定位针,打包上线后全部变成浏览器默认的破图图标。
jingweizhi.com/cookbook/leaflet-marker-icon-404.html同一个站点搜索五次,图标边缘越来越毛,点击一次弹出五个相同的气泡。
jingweizhi.com/cookbook/leaflet-duplicate-addlayer.html查到一个站点后调用 map.fitBounds,地图纹丝不动; 换成一堆点,又缩到了世界地图级别。
jingweizhi.com/cookbook/leaflet-fitbounds-no-effect.html为了提升性能打开了 preferCanvas,结果平移时老的圆形没擦掉,缩小时整片线网糊成一团。
jingweizhi.com/cookbook/leaflet-canvas-ghost.html主图上的“已选站点”清空了,对比窗口里的同一批点也消失了,两个地图明明互不相关。
jingweizhi.com/cookbook/ol-source-reuse-pollution.html听说 WebGL 渲染更快,在 ol.layer.Vector 上加了 renderer: 'webgl', 结果控制台报错,点一个都不显示。
jingweizhi.com/cookbook/ol-renderer-wrong.html图层加进去了,瓦片请求全是 200,但图片是透明的;点开一张请求,返回的是一段 XML 报错。
jingweizhi.com/cookbook/ol-wms-params-wrong.html按属性给不同颜色的点,结果只有一类点显示,其余全部消失,控制台还报了一个读属性失败的错误。
jingweizhi.com/cookbook/ol-style-function-undefined.html为了拖动时也能看到数据,打开了实时重绘,结果每次平移画布都先清空,再一块块补回来。
jingweizhi.com/cookbook/ol-feature-flicker.html本地 npm run build 一切正常,传到服务器后页面白屏,HTML 里的资源地址全部 404。
jingweizhi.com/cookbook/build-static-404.html项目挂到 /gis/ 下,首页能打开,但图标、瓦片、接口全部请求到了根路径。
jingweizhi.com/cookbook/base-path-wrong.html子系统单独跑正常,嵌进主站后地图能显示,调用 map.remove() 却报“不是函数”。
jingweizhi.com/cookbook/global-variable-conflict.html把两万个点的聚合计算放进 Worker,想解放主线程,结果 Worker 刚启动就挂掉。
jingweizhi.com/cookbook/webworker-dom-library.html引入 proj4 做坐标换算,开发环境正常,构建时提示模块没有默认导出,打包中断。
jingweizhi.com/cookbook/esm-cjs-mixed.html模型能显示,但点击拾取永远不命中;控制台第一条就是“Multiple instances of Three.js being imported”。
jingweizhi.com/cookbook/duplicate-library-instance.html新版本上线十分钟,客服收到反馈:一部分用户打开是白屏,清缓存后又正常。
jingweizhi.com/cookbook/cdn-static-cache.html数据看着没错,点位也落在正确的位置,质检报告却写着“坐标系与要求不符,平面位置超限”。
jingweizhi.com/cookbook/compliant-coord-violation.html例行安全检查发现,构建产物里能直接搜到设施名称与坐标,对象存储的瓦片目录不需要登录就能访问。
jingweizhi.com/cookbook/sensitive-data-leak.html瓦片全部能加载出来,拼接也严丝合缝,就是整张图上下翻转。
jingweizhi.com/cookbook/tms-y-flip.html离线包只有 1~19 级目录,前端按 0 级起算,画面始终比实际大一号,19 级还缺图。
jingweizhi.com/cookbook/tile-z-offset.html把瓦片地址贴到浏览器地址栏能打开,放进地图里就全部 403。
jingweizhi.com/cookbook/tile-403-referer.html截图按钮一点就抛 SecurityError,地图本身显示得好好的。
jingweizhi.com/cookbook/tile-cors-canvas.html网络面板里全是 204,看着像「没有错误」,可地图上缺了一大片。
jingweizhi.com/cookbook/tile-204-blank.html每张瓦片都完整加载了,但拼起来满屏细白线,缩放级别越小越明显。
jingweizhi.com/cookbook/tile-seam-gap.html滚轮滚一下,级别跳过 18 直接到 19,中间两级的地图从来没出现过。
jingweizhi.com/cookbook/minzoom-maxzoom-jump.html子域配了 0 到 7,网络面板里同时进行的请求依然是 6 个,其余全部排队。
jingweizhi.com/cookbook/tile-subdomain-concurrency.html换了一份高清瓦片,地图反而变糊,还跟矢量数据差了半个屏幕。
jingweizhi.com/cookbook/tile-512-retina.html按 Google 的公式算百度瓦片编号,每个级别都差几十张瓦片,拼出来的图像条带错位。
jingweizhi.com/cookbook/baidu-tile-origin.html服务端已经重新切片,本地开发清缓存也没用,用户那边照样是两周前的底图。
jingweizhi.com/cookbook/tile-cache-maxage.html缩到最小级别,屏幕上并排出现三个中国,左右两边还是镜像拼接的。
jingweizhi.com/cookbook/tile-nowrap-out-of-range.html图层加上去了,图例也有,地图上却一个要素都没有,控制台只给了一条警告。
jingweizhi.com/cookbook/style-expression-missing-property.html一个带湖的行政区面,渲染后湖面也被涂成了行政区的颜色,卫星底图看不见了。
jingweizhi.com/cookbook/polygon-hole-winding.html城市名互相压住,打开允许重叠后,八百个名字同时糊在屏幕上。
jingweizhi.com/cookbook/label-overlap.html「乌鲁木齐高新技术产业开发区」只显示成「乌鲁木齐高新」,后面的字全没了。
jingweizhi.com/cookbook/label-text-clipped.html道路线被行政区面压在下面,设了 zIndex: 999 依旧没变,甚至整条线消失了。
jingweizhi.com/cookbook/layer-order-cover.html两个 50% 透明的图层叠上去,重叠区看起来像 75% 不透明,设计稿完全对不上。
jingweizhi.com/cookbook/opacity-multiply.html12 级时道路像主干道,17 级时同样的道路细得几乎看不见。
jingweizhi.com/cookbook/line-width-zoom-interpolate.html点位落在路口,图钉的针尖却指在马路中间,放大到 18 级差出十几米。
jingweizhi.com/cookbook/icon-anchor.html同一份样式,Chrome 最新版正常,客户的内嵌浏览器里整个图层透明。
jingweizhi.com/cookbook/color-format-invalid.html明明有 40 个区县人口超过一万,图层上一个都没画出来,也没有报错。
jingweizhi.com/cookbook/filter-number-vs-string.html图标正常、面正常,只有文字一个都出不来,网络面板里一排 glyphs 请求全是 404。
jingweizhi.com/cookbook/glyphs-404.htmlicon-image 写了一个名字,地图上什么都不出现,也没有任何报错。
jingweizhi.com/cookbook/sprite-icon-missing.html屏幕上刚好铺满 A4 的地图,打印出来只占左上角四分之三,比例尺也对不上。
jingweizhi.com/cookbook/print-dpi-misalign.html