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

在Google Maps API中使用本地PHP返回的JSON并解决Feature获取报错问题

解决Google Maps API中本地PHP动态JSON加载的属性设置问题

看起来你遇到的核心问题是异步加载的顺序冲突,加上可能的PHP响应配置问题,导致无法正确获取地图要素并更新属性。咱们一步步来解决:

一、最关键的问题:异步操作的执行顺序

map.data.loadGeoJson()是异步方法——它不会等待GeoJSON文件加载完成才继续执行后面的代码。而你的XHR请求也是异步的,这就可能出现一种情况:XHR请求先拿到了PHP返回的JSON数据,但此时地图的GeoJSON要素还没加载完毕,map.data.getFeatureById(stationName)自然找不到对应的要素,返回undefined,进而触发Cannot read property 'setProperty'的错误。

修复方案:把数据请求放到GeoJSON加载完成的回调里

修改loadGeoJson的调用,加上回调函数,确保只有当地图要素加载完成后,才发起PHP数据请求:

function showStation(crimeType) { 
  var map; 
  map = new google.maps.Map(document.getElementById('map'),{ 
    zoom:9, 
    center: {lat: 32.815939, lng: 73.305297} 
  }); 

  // 把loadGeoJson改成带回调的形式,确保要素加载完成后再处理数据
  map.data.loadGeoJson('stations.js', { idPropertyName: 'name' }, function() {
    // 这里才发起PHP数据请求
    var xhr = new XMLHttpRequest(); 
    xhr.open('GET', './data/stationdata.php', true); 
    
    xhr.onload = function() { 
      // 先检查请求是否成功
      if (xhr.status === 200) {
        try {
          var crimeData = JSON.parse(xhr.responseText); 
          crimeData.forEach(function(row){ 
            var crimeVariable = row[crimeType]; 
            var stationName = row.stationName; 
            
            var feature = map.data.getFeatureById(stationName);
            if (feature) { // 先判断要素是否存在,避免报错
              feature.setProperty(crimeType, crimeVariable); 
            } else {
              console.warn(`找不到名为${stationName}的地图要素`);
            }
          }); 
        } catch(e) {
          console.error('JSON解析错误:', e);
        }
      } else {
        console.error(`请求失败,状态码:${xhr.status}`);
      }
    };

    // 处理请求错误的情况
    xhr.onerror = function() {
      console.error('请求stationdata.php时发生网络错误');
    };

    xhr.send(); 
  }); 

  map.data.setStyle(styleFeature); 
}

二、检查PHP文件的响应配置

确保你的stationdata.php返回正确的HTTP响应头,否则可能导致JSON解析异常:
在PHP文件的最顶部添加以下代码,设置正确的Content-Type:

<?php
header('Content-Type: application/json; charset=utf-8');
// 你的数据库查询和JSON输出代码...
?>

另外,确认./data/stationdata.php的路径是正确的——可以打开浏览器的开发者工具(F12),切换到Network标签,查看这个请求的状态码:如果是404,说明路径错误;如果是200,再看Response里的内容是否是正确的JSON格式。

三、额外的调试建议

  • 在浏览器控制台的Network标签,检查stationdata.php的请求是否成功,返回的JSON是否和你提供的一致。
  • 在map.data.loadGeoJson的回调里,可以先打印map.data.getFeatures(),确认所有要素都已经加载完毕。

这样调整后,应该就能解决你遇到的两个错误了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:41:18