Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在谷歌地图API搜索结果中显示自定义位置?_Javascript_Google Maps_Google Maps Api 3_Google Maps Markers_Search Box - Fatal编程技术网

Javascript 如何在谷歌地图API搜索结果中显示自定义位置?

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数据发送到哪

下面是一个带有搜索框的谷歌地图的基本示例:

我想做一些非常简单的事情。 我只想硬编码一些位置(可能是一些带有纬度和经度的简单数组/对象),然后当您搜索位置时,例如“华盛顿”,如果其中一些位置确实位于华盛顿,则显示这些位置(带有标记)。如果我搜索“非洲”并且我的一些位置在非洲境内,我希望它们被显示出来。如果我搜索的地方没有我的位置,那么它们应该不会显示出来

我还发现了这个-。 但我不确定这是否是我应该用于我的目的(或者我应该?)。如果是的话,我不知道如何使用它——我应该将建议的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);
  }
}