Javascript 如何在谷歌地图API搜索结果中显示自定义位置?
下面是一个带有搜索框的谷歌地图的基本示例: 我想做一些非常简单的事情。 我只想硬编码一些位置(可能是一些带有纬度和经度的简单数组/对象),然后当您搜索位置时,例如“华盛顿”,如果其中一些位置确实位于华盛顿,则显示这些位置(带有标记)。如果我搜索“非洲”并且我的一些位置在非洲境内,我希望它们被显示出来。如果我搜索的地方没有我的位置,那么它们应该不会显示出来 我还发现了这个-。 但我不确定这是否是我应该用于我的目的(或者我应该?)。如果是的话,我不知道如何使用它——我应该将建议的JSON数据发送到哪里Javascript 如何在谷歌地图API搜索结果中显示自定义位置?,javascript,google-maps,google-maps-api-3,google-maps-markers,search-box,Javascript,Google Maps,Google Maps Api 3,Google Maps Markers,Search Box,下面是一个带有搜索框的谷歌地图的基本示例: 我想做一些非常简单的事情。 我只想硬编码一些位置(可能是一些带有纬度和经度的简单数组/对象),然后当您搜索位置时,例如“华盛顿”,如果其中一些位置确实位于华盛顿,则显示这些位置(带有标记)。如果我搜索“非洲”并且我的一些位置在非洲境内,我希望它们被显示出来。如果我搜索的地方没有我的位置,那么它们应该不会显示出来 我还发现了这个-。 但我不确定这是否是我应该用于我的目的(或者我应该?)。如果是的话,我不知道如何使用它——我应该将建议的JSON数据发送到哪
提前谢谢 好了,我已经解决了!我想分享一下这是怎么做到的。。。我必须说,编程世界对我来说是新的,而且非常有趣:)这是我第一次使用任何类型的API。。。以下是一个工作示例: 解释: 所以,你要知道的第一件事是如何添加标记。可以在maps API文档中轻松找到。添加的标记如下所示:
var marker=new google.maps.marker({marker\u properties})代码>
好的,那么我们如何为你拥有的地方添加所有标记呢?好吧,你只需遍历有坐标的地方。首先,让我们创建places数组:
好的,现在让我们遍历这些位置,每次添加一个标记:
for (var i = 0; i < random_places.length; i++) {
var beach = random_places[i];
var myLatLng = new google.maps.LatLng(beach[1], beach[2]);
var marker = new google.maps.Marker({
position: myLatLng,
map: map,
title: beach[0],
});
};
就这样!现在,仅当标记位于地图的可见部分时,才会创建标记!
您可能已经注意到,我还创建了一个空的place\u markers
对象,然后将所有已创建的标记都推入其中。为什么?因为我们还需要做一件事。我们希望删除所有创建的标记,如果它们超出当前边界!
因此,每次更改边界时,我们都希望执行以下代码:
// Remove out of bounds markers
for (var k = 0; k < place_markers.length; k++) {
var one_marker = place_markers[k];
if (!bounds.contains(one_marker.getPosition())) {
one_marker.setMap(null);
}
}
//删除越界标记
对于(var k=0;k
您可以看到,这里我使用了一个内置的bounds.contains()
函数来检查创建的标记是否在边界内。创建标记时也可以使用相同的函数,但我决定将代码保留为这样,以显示找到正确解决方案的过程。
最重要的是,标记现在在超出边界时被移除,在边界内时被创建
我还有一件事要说。这不是完成我想要的任务的唯一方法。这可以通过许多其他方式实现。我找到了一个使用PHP和MySQL的高级方法的逐步解释:
我希望这对像我一样不熟悉谷歌地图api的人有用 我从来没有用过,但我会加上这些地方,是的。不过,如果你在非洲的某个地方添加一个位置,我不认为搜索非洲会返回这些位置,但我可能错了。嗯,最终我没有使用“添加位置”功能。我怀疑它应该用于稍微不同的目的。当您想添加您认为应该对所有google地图用户可见的位置时,而不仅仅是对使用您的应用程序的用户而言,这可能更合适。也许我错了。我想主要目的是让所有用户都能使用它。但是新的地方被缓和了。如果它们没有在全球范围内添加,它们仍然可以用于您的应用程序。也就是说,您可以在应用程序中管理位置,而无需使用添加位置功能;那是肯定的。你公布了你的发现,这是一个很好的观点。你说得对,这可能不是最好的方法,但如果它符合你的需要,那么一切都好。关于PHP/MySQL解决方案,这个例子是一个很好的开始,但我强烈建议您不要使用XML作为输出,而是使用JSON,因为JSON更易于处理。当我键入“Moscow1”时,它没有向我显示自动完成建议。纽约1号和纽约2号等也一样。是吗?是的,它不应该显示来自我的随机位置的建议。我的目标行为是,如果标记落在当前视口的范围内,则显示标记,如果标记落在当前视口的范围外,则卸载标记,这与用户搜索的内容无关。
var place_markers = [];
google.maps.event.addListener(map, 'bounds_changed', function() {
var bounds = map.getBounds();
searchBox.setBounds(bounds); // not needed for our purpose, it adds bias to new searches
var NE = bounds.getNorthEast();
var SW = bounds.getSouthWest();
// Iterate through all places
for (var i = 0; i < random_places.length; i++) {
var place_arr = random_places[i];
// Check if a place is within bounds - not best way, explained later
if ( (NE.lat() > place_arr[1] && place_arr[1] > SW.lat()) &&
(NE.lng() > place_arr[2] && place_arr[2] > SW.lng()) ) {
var myLatLng = new google.maps.LatLng(place_arr[1], place_arr[2]);
var marker = new google.maps.Marker({
position: myLatLng,
map: map,
title: place_arr[0],
});
place_markers.push(marker);
}
};
});
// Remove out of bounds markers
for (var k = 0; k < place_markers.length; k++) {
var one_marker = place_markers[k];
if (!bounds.contains(one_marker.getPosition())) {
one_marker.setMap(null);
}
}