You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何访问HTML中加载的JSON值并提取坐标用于Mapbox标记绘制

你现有代码存在以下几个问题,修复后即可正常运行:

  • 重复解析JSON
    你调用callback(JSON.parse(xobj.responseText))的时候已经把响应内容转成了JS对象,回调函数里又执行了一次var actual_JSON = JSON.parse(json);,相当于给已经是对象的内容再次做JSON解析,会直接抛出错误,把这一行的JSON.parse()去掉,改成var actual_JSON = json;即可。
  • 跨域&文件路径问题
    你当前用的是本地绝对路径C:\Users\ArkPr\yelp\restaurants.json,浏览器出于同源策略限制,直接打开本地HTML文件时无法读取本地磁盘的JSON文件。你可以把restaurants.json放在和HTML文件同目录下,请求路径改成相对路径./restaurants.json,同时建议用本地静态服务器启动项目,避免跨域报错。
  • 异步逻辑顺序错误
    XMLHttpRequest是异步请求,标记渲染的for循环必须写在loadJSON的回调函数内部,否则外部代码执行时请求还没返回,actual_JSON还未完成赋值,会抛出变量未定义的错误。同时你现有代码的回调函数缺少闭合的花括号,需要补全。
  • JSON键名校验
    你给出的JSON结构里根节点的type是featurecollections,如果后续你要按标准GeoJSON规范使用的话,注意标准键名是首字母大写的FeatureCollection,如果你的实际JSON键名就是全小写,确认和代码里的访问路径一致即可。

另外需要确保这段代码执行的时候,Mapbox的map实例已经完成初始化,避免addTo(map)时找不到map对象。

修复后的完整代码参考:

function loadJSON(callback) {   
  var xobj = new XMLHttpRequest();
  xobj.overrideMimeType("application/json");
  // 替换为相对路径
  xobj.open('GET', './restaurants.json', true);
  xobj.onreadystatechange = function () {
    if (xobj.readyState == 4 && xobj.status == "200") {
      callback(JSON.parse(xobj.responseText));
    }
  };
  xobj.send(null);  
}

loadJSON(function(json) {
  // 去掉重复的JSON.parse
  var actual_JSON = json; 
  // 把标记循环放在回调内部
  for (const { geometry, properties } of actual_JSON.features) {
    const el = document.createElement('div');
    el.className = 'marker';
    new mapboxgl.Marker(el).setLngLat(geometry.coordinates).addTo(map);
  }
});

内容的提问来源于stack exchange,提问作者MeasMyself

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 04:21:01