我在谷歌地图上遇到多个标记问题 - 我目前有一个存储信息的MySQL数据库(位置信息)。在php中,我然后提取此信息并循环遍历每个邮政编码,以动态创建所需的javascript,为我的数据库中的每个地方放置一个标记。
这样做成功,所以我知道我正在将正确的信息传递给js函数 - 现在我想要实现的是在点击标记时添加附加信息,但它在每个标记窗口显示相同的信息。 / p>
这是我正在使用的js(我在顶部启动了一个图标,但现在将其排除在代码之外):
function usePointFromPostcode(postcode, callbackFunction, text) {
localSearch.setSearchCompleteCallback(null,
function() {
if (localSearch.results[0])
{
var resultLat = localSearch.results[0].lat;
var resultLng = localSearch.results[0].lng;
var point = new GLatLng(resultLat,resultLng);
callbackFunction(point, text);
}else{
alert("Postcode not found!");
}
});
localSearch.execute(postcode + ", UK");
}
function placeMarkerAtPoint(point, html, icon)
{
var marker = new GMarker(point,{icon: icon});
GEvent.addListener(marker,"click",function() {
marker.openInfoWindowHtml(html);
});
map.addOverlay(marker);
}
我的PHP代码是:
$query = "SELECT * FROM hospitalInfo";
$result = mysql_query($query);
if($result) {
while ($row = mysql_fetch_assoc($result)) {
$code .= "usePointFromPostcode('".$row['Postcode']."', placeMarkerAtPoint,
'".$row['placeName']."');";
}
}
$ code然后回显。
对于为什么会发生这种情况的任何建议都将非常感谢!谢谢!
答案 0 :(得分:2)
您可能遇到范围/结束问题,类似于所讨论的问题here。
尝试替换此代码:
GEvent.addListener(marker,"click",function() {
marker.openInfoWindowHtml(html);
});
用这个:
marker.bindInfoWindowHtml(html);
如果这不起作用,我猜测闭包问题来自setSearchCompleteCallback()函数。没有看到实际的页面就很难猜到。
答案 1 :(得分:1)
我认为您的Google地图代码没有问题。我建议你尝试将placeMarkerAtPoint和文本参数中的html参数记录到localSearch回调中。谷歌有一个非常有用的日志API,你可以使用:
GLog参考
我会在placeMarkerAtPoint函数的开头添加:
GLog.write ("placeMarkerAtPoint - " + html);
并在localSearch回调中:
GLog.write ("SearchCompleteCallback - " + text);
我认为这两个回调(尤其是第二个回调)的日志记录将使html丢失的地方显而易见。
更新:好的,基于您的日志记录,您的PHP代码很好。您正在生成三个使用PointFromPostcode的调用。
这里的问题是你的google.search.SearchControl回调。我假设搜索工作正常,你得到的结果数组适用于每个相应的邮政编码?
如果是这样,那么问题在于setSearchCompleteCallback中的text参数。我没有使用Google AJAX Search的东西,但问题在于如何触发这些回调。看起来你可以获得multiple callbacks一次执行。
答案 2 :(得分:1)
正如您在评论中提到的,问题是您在获得任何结果之前发送了多个请求,并且每次发送请求时标记文本的值都会更改。我认为你可以通过使用GClientGeocoder大大简化你的代码 - 除非绝对有必要使用GLocalSearch,它不是Maps API的一部分。这是地理编码器的Google's tutorial。
首先像这样创建地理编码器:
var geocoder = new GClientGeocoder();
接下来,这是您的新 usePointFromPostcode()功能:
function usePointFromPostcode(postcode, text) {
geocoder.getLatLng(postcode, function(point) {
if (!point) {
//alert('address not found');
} else {
var marker = new GMarker(point, {icon: icon});
GEvent.addListener(marker, "click", function() {
marker.openInfoWindowHtml(text);
});
map.addOverlay(marker);
}
});
}
这对我很有用。尝试一下,让我们知道它是怎么回事。
如果您需要有关返回点的更多信息,例如准确性,请使用getLocations()而不是getLatLng()。该教程解释了它的工作原理。
答案 3 :(得分:0)
您正在重复使用名称标记,因此您放置的最后一个文本最终会附加到所有文本。创建一个索引,并将它们命名为marker1,marker2等。在php循环中很容易做到。