Javascript 如何访问和隐藏loadGeoJson()创建的标记?
我正在通过JSON将自定义坐标加载到地图应用程序中。我已经能够找到如何根据要素属性对标记进行颜色编码,但我接下来的步骤之一是创建过滤器,以根据属性显示或隐藏标记 我的代码是这样开始的: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 = {
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