Fusion Tables层URL请求限制(2048个字符)
Fusion Tables layer URL request limit (2048 chars)
我使用谷歌地图来突出显示使用Fusion Tables来获取几何图形的一群国家。你可以在这里看到一个例子:
http://jsfiddle.net/4mtyu/689/
var layer = new google.maps.FusionTablesLayer({
query: {
select: locationColumn,
from: tableId,
where: "ISO_2DIGIT IN ('AF','AL','DZ','AD','AO','AG','AR','AM','AU','AT','AZ','BS','BH','BD','BB','BY','BE','BZ','BJ','BT','BO','BA','BW','BR','BN','BG','BF','BI','KH','CM','CA','CV','CF','TD','CL','CN','CO','KM','CG','CD','CR','HR','CU','CY','CZ','DK','DJ','DM','DO','EC','EG','SV','GQ','ER','EE','ET','FJ','FI','FR','GA','GM','GE','DE','GH','GR','GD','GT','GN','GW','GY','HT','HN','HU','IS','IN','ID','CI','IR','IQ','IE','IL')"
},
options : {suppressInfoWindows:true},
styles: [{
polygonOptions: {
fillColor: "#000000",
strokeWeight: "0",
fillOpacity: 0.4
}
}]
});
当我试图从桌子上抓太多的东西时,问题就开始了。谷歌使用一个包含所有查询值的URL来获取所需的数据,并且通过URL编码,它的长度可以增长到相当大。
如果你打开控制台并检查错误中抛出的URL,你可以在这里看到URL的例子:
http://jsfiddle.net/4mtyu/690/
在这个特定的例子中,它生成的URL是3749个字符,远远超过了2048个字符的限制。
有人有什么想法吗?我可以防止URL变大,但同时仍然可以选择150多个项目?
最简单的解决方案是将东西移动到客户端:http://jsfiddle.net/4mtyu/725/
第1部分:初始化映射表和融合表
你可以随心所欲地这样做,只需确保融合表中选择了所有国家。示例:
function initialize() {
//settings
var myOptions = {
zoom: 2,
center: new google.maps.LatLng(10, 0),
mapTypeId: google.maps.MapTypeId.ROADMAP
};
//get map div
map = new google.maps.Map(document.getElementById('map_div'),
myOptions);
// Initialize padded JSON request
var script = document.createElement('script');
var url = ['https://www.googleapis.com/fusiontables/v1/query?'];
url.push('sql=');
//select all the countries!!
var query = 'SELECT name, kml_4326 FROM ' +
'1foc3xO9DyfSIF6ofvN0kp2bxSfSeKog5FbdWdQ';
var encodedQuery = encodeURIComponent(query);
//generate URL
url.push(encodedQuery);
url.push('&callback=drawMap');//Callback
url.push('&key=AIzaSyAm9yWCV7JPCTHCJut8whOjARd7pwROFDQ');//select all countries
script.src = url.join('');
//Add Script to document
var body = document.getElementsByTagName('body')[0];
body.appendChild(script);
}
第2部分:对国家/地区进行排序并渲染
(a( 一旦你有了完整的国家名单,你就必须对它们进行排序。一个简单的
indexOf
检查就可以了。(b( 排序后,我们需要将我们的国家转换为LatLon坐标,这是在
constructNewCoordinates
函数中完成的(见下文((c( 然后剩下的就是生成多边形并将其添加到我们的地图中!
示例:
var countries = [...];
//This is the callback from the above function
function drawMap(data) {
//Get the countries
var rows = data['rows'];
for (var i in rows) {
// (a) //
//If the country matches our filled countries array
if (countries.indexOf(rows[i][0]) !== -1)
var newCoordinates = [];
// (b) //
// Generate geometries and
// Check for multi geometry countries
var geometries = rows[i][1]['geometries'];
if (geometries) {
for (var j in geometries) {
//Calls our render function, returns Polygon Coordinates (see last step);
newCoordinates.push(constructNewCoordinates(geometries[j]));
}
} else {
//Calls our render function, returns Polygon Coordinates (see last step);
newCoordinates = constructNewCoordinates(rows[i][1]['geometry']);
}
// (c) //
//Generate Polygon
var country = new google.maps.Polygon({
paths: newCoordinates,
strokeWeight: 0,
fillColor: '#000000',
fillOpacity: 0.3
});
//add polygon to map
country.setMap(map);
}
}
}
}
第3部分::生成坐标
// (b) //
function constructNewCoordinates(polygon) {
var newCoordinates = [];
var coordinates = polygon['coordinates'][0];
for (var i in coordinates) {
newCoordinates.push(
new google.maps.LatLng(coordinates[i][1], coordinates[i][0]));
}
return newCoordinates;
}
相关文章:
- 拆分文本以每隔n个字符添加一行新行,并注意空格
- 使用Google Maps API向标记添加多个字符
- 单元格的工具提示或标题不显示超过2000个字符
- 如何显示字符串中最多 200 个字符
- 使用正则表达式匹配长度为六个字符的字母数字字符串
- 第一个字第一个字符第二个字第二个字符,一直到数组结束
- 将字符串分组为n个字符的块,并应用替换
- 如何在ajax中检查密码是否小于8个字符
- 在字符串列表中搜索任何出现的单词,如果单词的第一个字符匹配,则高亮匹配单词.Javascript正则表达式
- 如何使用正则表达式限制字符串的第一个字符
- 如何使用至少一个数字、一个大写字母和6-20个字符验证密码
- 如何在输入文本字段中输入10个字符时自动提交表单
- 如何从日期中分割x个字符
- 在跨度中每3个字符添加一个空格
- 跳过x个字符后,如何打印特定字符串
- 如何在JavaScript中每隔第n个字符分割一个字符串
- jQuery:从数据属性中删除除前4个字符外的所有字符
- 如何在jQuery中搜索两个字符之间的字符串
- 使用 JavaScript 中的正则表达式替换大文本中两个字符之间的每个出现的字符串
- Fusion Tables层URL请求限制(2048个字符)