如何在PHP中获取MongoDB查询返回的坐标数组中的经纬度值?
解决PHP提取MongoDB坐标用于Google Maps的问题
我来帮你梳理下问题所在,以及如何解决这个提取坐标的需求:
首先,你原代码里的两个小问题
游标耗尽的问题:MongoDB的
find()返回的是一个游标对象,当你执行$array = iterator_to_array($document, false)时,已经把游标从头到尾遍历了一遍,后续再用foreach($document as $k => $row)是不会有任何输出的——你说之前能输出三个JSON,大概率是代码顺序写反了(先foreach再转数组),或者你测试时的代码和你贴的不一样。for循环直接打印数组的问题:
$array[$i]是一个关联数组(结构是['coordinates' => ['coordinates' => [经度, 纬度]]]),直接用print或者echo打印数组,PHP只会输出Array,而不是你想要的坐标值,必须访问数组的具体键才能提取数据。
正确的代码实现(提取坐标并适配Google Maps)
下面是完整的代码,既可以用for循环,也可以用更简洁的foreach,同时帮你处理MongoDB和Google Maps的坐标顺序差异:
<?php // 1. 查询MongoDB,只获取坐标字段,排除_id $cursor = $collection->find([], ['_id' => 0, 'coordinates.coordinates' => 1]); // 2. 将游标转换为数组(游标只能遍历一次,转成数组后可以反复操作) $coordinateDocs = iterator_to_array($cursor, false); // 方法一:用for循环提取坐标 $length = count($coordinateDocs); for ($i = 0; $i < $length; $i++) { // 获取当前文档的GeoJSON坐标数组 $geoCoords = $coordinateDocs[$i]['coordinates']['coordinates']; // 重点:MongoDB的GeoJSON是[经度, 纬度],Google Maps需要[纬度, 经度] $longitude = $geoCoords[0]; $latitude = $geoCoords[1]; // 可以直接输出,或者存入数组给Google Maps API用 echo "第".($i+1)."个坐标:纬度{$latitude},经度{$longitude}<br>"; } // 方法二:用foreach(更推荐,PHP遍历数组的常规写法) $mapMarkers = []; // 用于存储Google Maps可用的标记数据 foreach ($coordinateDocs as $doc) { $geoCoords = $doc['coordinates']['coordinates']; $mapMarkers[] = [ 'lat' => $geoCoords[1], // Google Maps需要纬度在前 'lng' => $geoCoords[0] // 经度在后 ]; } // 输出成JSON格式,可直接传给Google Maps API echo "<hr>适合Google Maps的JSON数据:<br>"; echo json_encode($mapMarkers); ?>
输出结果说明
运行上面的代码,你会得到类似这样的输出:
第1个坐标:纬度11.96795331,经度121.9197351 第2个坐标:纬度11.96795331,经度121.9197351 第3个坐标:纬度11.96795331,经度121.9197351 适合Google Maps的JSON数据: [{"lat":11.96795331,"lng":121.9197351},{"lat":11.96795331,"lng":121.9197351},{"lat":11.96795331,"lng":121.9197351}]
这个JSON数组可以直接用于Google Maps的标记创建,比如结合google.maps.Marker来生成地图上的点位。
内容的提问来源于stack exchange,提问作者codex
相关产品推荐
相关产品推荐

