Javascript 如何访问和隐藏loadGeoJson()创建的标记?

Javascript 如何访问和隐藏loadGeoJson()创建的标记?,javascript,google-maps-api-3,Javascript,Google Maps Api 3,我正在通过JSON将自定义坐标加载到地图应用程序中。我已经能够找到如何根据要素属性对标记进行颜色编码,但我接下来的步骤之一是创建过滤器,以根据属性显示或隐藏标记 我的代码是这样开始的: var map; var infowindow = new google.maps.InfoWindow(); function initialize() { var mapCanvas = document.getElementById('map'); var mapOptions = {

我正在通过JSON将自定义坐标加载到地图应用程序中。我已经能够找到如何根据要素属性对标记进行颜色编码,但我接下来的步骤之一是创建过滤器,以根据属性显示或隐藏标记

我的代码是这样开始的:

var map;
var infowindow = new google.maps.InfoWindow();

function initialize()
{
    var mapCanvas = document.getElementById('map');
    var mapOptions = {
      mapTypeId: google.maps.MapTypeId.ROADMAP
    }
    map = new google.maps.Map(mapCanvas, mapOptions);
    map.data.loadGeoJson('/map_json.php', null, SetBounds);

    map.data.setStyle(function(feature) {
        var color = 'FF0000';
        var symbol = '%E2%80%A2';  // dot
        // color selection code here [...]

        return /** @type {google.maps.Data.StyleOptions} */ {
            icon: 'http://chart.apis.google.com/chart?chst=d_map_pin_letter_withshadow&chld=' + symbol + '|' + color
        };
}
{"type":"Feature","geometry":{"type":"Point","coordinates":[0,0]},"properties":{"name":"Customer 1","id":"1001","address":"1234 Test Street, Test City, TX 12345, USA","category":"vendor","active":1}}
我已经找到了通过jquery自动完成搜索访问导入数据的方法:

$(input).autocomplete({
    minLength: 0,
    source: function(request, response) {
        data = [];
        map.data.forEach(function(feature)
        {
            var str = request.term.toUpperCase();
            if (String(feature.getProperty('name')).toUpperCase().indexOf(str) > -1)
            {
                data.push({id: feature.getProperty('id'), name: feature.getProperty('name'), address: feature.getProperty('address')});
            }
        });
        response(data);
    },
    select: function(event, ui)
    {
        map.data.forEach(function(feature)
        {
            if (feature.getProperty('id') == ui.item.id)
            {
                var content = GetContent(feature);
                infowindow.setContent(content);
                infowindow.setPosition(feature.getGeometry().get());
                infowindow.setOptions({pixelOffset: new google.maps.Size(0, -34)});
                infowindow.open(map);

                // zoom in
                map.setZoom(15);
                map.panTo(feature.getGeometry().get());

                return false;
            }
        });
    }
})
.autocomplete().data('uiAutocomplete')._renderItem = function(ul, item)
{
    return $('<li>')
        .append('<a>' + item.name + ' (ID: ' + item.id + ')<br>' + item.address + '</a>')
        .appendTo(ul)
};
但我没有这个功能-我使用
getGeoJson()
加载整个数据集

如何使用
map.data.forEach()
访问标记并根据可以访问的信息对其进行操作(例如隐藏或显示)

---更新---

下面是关于这个项目的更多细节

地图将显示从客户列表生成的标记。客户具有不同的类别和属性,因此GeoJSON字符串的典型条目形式如下所示:

var map;
var infowindow = new google.maps.InfoWindow();

function initialize()
{
    var mapCanvas = document.getElementById('map');
    var mapOptions = {
      mapTypeId: google.maps.MapTypeId.ROADMAP
    }
    map = new google.maps.Map(mapCanvas, mapOptions);
    map.data.loadGeoJson('/map_json.php', null, SetBounds);

    map.data.setStyle(function(feature) {
        var color = 'FF0000';
        var symbol = '%E2%80%A2';  // dot
        // color selection code here [...]

        return /** @type {google.maps.Data.StyleOptions} */ {
            icon: 'http://chart.apis.google.com/chart?chst=d_map_pin_letter_withshadow&chld=' + symbol + '|' + color
        };
}
{"type":"Feature","geometry":{"type":"Point","coordinates":[0,0]},"properties":{"name":"Customer 1","id":"1001","address":"1234 Test Street, Test City, TX 12345, USA","category":"vendor","active":1}}
地图上还有一个过滤器框,其中包含默认选中的复选框。单击其中任何一个将运行筛选代码,该代码应隐藏或删除与匹配该筛选的任何客户关联的标记

因此,如果我禁用过滤“非活动”的复选框,则只有属性为“活动”:1的客户将保留在地图上。如果我禁用筛选“供应商”的复选框,则所有类别为“供应商”的客户都将被隐藏

稍后再次选中复选框将撤消隐藏这些条目

在我的研究中,我发现了很多关于标记的内容,但前提是它们是手动添加的,而不是通过GeoJSON导入

我可以看到我的问题的一些潜在解决方案——我可以忽略GeoJSON格式,而是手动将客户机列表导入jQuery并将其解析为标记,然后放入数组中。但是为什么要使用GeoJSON格式呢

我目前使用
map.data.setStyle()
(参见注释)的解决方案似乎很有效。但我很好奇是否还有其他更直接的方法

我想,filter函数将遍历所有数据(
map.data.forEach()
),根据过滤器定位任何应该隐藏的项,然后每个项都将与它的关联标记通信,说明该标记需要隐藏。但到目前为止,我还没有弄清楚这种联系

当我遍历所有功能(
map.data.forEach()
)时,我可以访问我上载的数据,但不能访问作为导入结果放置的标记

我的问题是,是否有直接的方法从功能访问标记

我希望这一点现在更清楚了

---更新---

我为它创建了一个非常简单的JSFIDLE:


这是我想要实现的概念,它按原样工作。我唯一的问题是,是否有其他方法可以通过直接访问放置的标记来实现相同的结果,而不是使用
setStyle()
隐藏/显示标记。

您不需要使用
forEach
,因为
setStyle
已经遍历了这些特性

如果将样式设置功能声明为:

map.data.setStyle(function(feature) {
    var color = 'FF0000';
    var symbol = '%E2%80%A2';  // dot

    return /** @type {google.maps.Data.StyleOptions} */ {
        visible: feature.getProperty('active'), // this links visibility to feature property
        icon: 'http://chart.apis.google.com/chart?chst=d_map_pin_letter_withshadow&chld=' + symbol + '|' + color
    };
});
无需再次调用该方法,因为样式已绑定到要素属性。将
active
属性设置为false将无缝地传播到标记样式

在那之后,你可以让你的过滤器像(粗略的例子)

例如调用
setFilter('name','John')


同样,这是一个粗略的例子。我更愿意在
google.maps.Data
原型上实现过滤方法,但这应该为您指明了正确的方向。

您不需要使用
forEach
,因为
setStyle
已经遍历了这些特性

如果将样式设置功能声明为:

map.data.setStyle(function(feature) {
    var color = 'FF0000';
    var symbol = '%E2%80%A2';  // dot

    return /** @type {google.maps.Data.StyleOptions} */ {
        visible: feature.getProperty('active'), // this links visibility to feature property
        icon: 'http://chart.apis.google.com/chart?chst=d_map_pin_letter_withshadow&chld=' + symbol + '|' + color
    };
});
无需再次调用该方法,因为样式已绑定到要素属性。将
active
属性设置为false将无缝地传播到标记样式

在那之后,你可以让你的过滤器像(粗略的例子)

例如调用
setFilter('name','John')


同样,这是一个粗略的例子。我宁愿在
google.maps.Data
prototype上实现过滤方法,但这应该为您指明正确的方向。

FYI,我已经研究了好几天了,还没有找到一种方法来连接这两个概念-我想我至少应该被告知为什么在发布后的5分钟内我得到了-1…我找到了一个临时解决方案,可以通过设置标记的样式来满足我现在的需要。也许这是唯一的办法
map.data.setStyle(函数(feature){if(feature.getProperty('active')!=1){return{visible:false};}否则{return null;//将更改为保留原始格式})
如果我周末没有得到任何其他答案,我会用这个作为答案并结束问题。你能提供一个例子来说明你的代码做了什么以及你想完成什么吗?@geocodezip我会的,但我的主要问题是我使用的是
loadGeoJson()
这需要一个外部url,除非我将该文件存储在公共位置,否则我无法将其直接实现到JSFIDLE中。。。不过,我会在我的原始帖子中添加更多细节。您可以使用addGeoJson方法加载data.FYI的简单测试版本,我已经研究了好几天了,还没有找到一种方法来连接这两个概念-我想我至少应该被告知为什么在发布后的5分钟内我得到了-1…我找到了一个临时解决方案,可以通过设置标记的样式来满足我现在的需要。也许这是唯一的办法
map.data.setStyle(函数(功能){if(功能.getProperty('active')!=1){return{visible:false};}else{returnnull;//w