- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我在文档中到处搜索以解释如何只显示融合表给定区域的标记。
此时所有标记都出现在 map 上,如下所示:
JSFiddle (note jsfiddle wont load the uri from website so markers wont show)
如果您单击融合表/谷歌地图的某个区域,我会按预期在弹出窗口中获得区域名称,但是我最初不想显示任何标记。单击融合表/ map 的某个区域时,我希望它仅显示该给定区域的标记,而不是整个 map 。
这是我从 Web Api 向 map 添加标记的方式:
var uri = 'http://mountainsandweather.azurewebsites.net/api/Mountains';
$(document).ready(function () {
//Get web api json data
$.getJSON(uri)
.done(function (data) {
// On success, 'data' contains a list of mountains.
$.each(data, function (key, item) {
// Add a list item for the mountain.
$('<li>', { text: formatItem(item) }).appendTo($('#mountains'));
//Put seperate data fields into one variable
var latLng = new google.maps.LatLng(item.Latitude, item.Longitude);
//Add info window to each marker
var infowindow = new google.maps.InfoWindow({
content: formatItemInfoWindow(item)
});
// Creating a marker and putting it on the map
var marker = new google.maps.Marker({
position: latLng,
title: formatItemInfoWindow(item.Name),
infowindow: infowindow
});
marker.setMap(map);
google.maps.event.addListener(marker, 'click', function () {
//this.infowindow.close(); //not working correctly info windows still show
this.infowindow.open(map, marker);
});
});
});
});
function formatItemInfoWindow(item) {
return item.Name + '<br />' + item.Height_ft + '<br />' + item.humidity + '<br />' + item.snowCover + '<br />' + item.temperature;
}
function formatItem(item) {
return item.Latitude +', '+ item.Longitude;
}
}
我确实在文档中看到了可以添加到融合表中的 where
语句。像这样:
var layer = new google.maps.FusionTablesLayer({
query: {
select: 'geometry',
from: '11RJmSNdTr7uC867rr2zyzNQ6AiE1hcREmGFTlvH3'
where: //not sure if I could use this or what to put.
},
然而,来自 Web Api 的数据并没有被分割成特定的区域,它只是一长串纬度和经度。像这样:
<Mountain>
<Height_ft>2999</Height_ft>
<Height_m>914</Height_m>
<ID>c1</ID>
<Latitude>57.588007</Latitude>
<Longitude>-5.5233564</Longitude>
<Name>Beinn Dearg</Name>
<humidity>0.81</humidity>
<snowCover>4.99</snowCover>
<temperature>63</temperature>
</Mountain>
Google 是否有任何方法可以将融合表几何与坐标混合?显示给定区域的所有标记的简单方法?或者谁能想到可以做到这一点的方法?
有关 webapi 的一些额外细节,以备不时之需:
private MountainContext db = new MountainContext();
// GET: api/Mountains
public IQueryable<Mountain> GetMountains()
{
return db.Mountains;
}
// GET: api/Mountains/5
[ResponseType(typeof(Mountain))]
public IHttpActionResult GetMountain(string id)
{
Mountain mountain = db.Mountains.Find(id);
if (mountain == null)
{
return NotFound();
}
return Ok(mountain);
}
public IQueryable<Mountain> GetMountainByName(string name)
{
return db.Mountains.Where(n => string.Equals(n.Name, name));
}
最佳答案
很遗憾,FusionTablesLayer 中没有 containsLocation 函数。
一种解决方案是从 FusionTablesLayer 创建 Google map 多边形,允许我们使用 containsLocation
来确定是否将标记添加到 map 。
首先我们需要坐标来创建多边形。我们可以使用 google.visualization.Query
从融合表中获取所选区域的坐标:
function getMountainPolygonFromFusionTable(label) {
// Return a new promise.
return new Promise(function(resolve, reject) {
var sql = encodeURIComponent("SELECT 'geometry' FROM 11RJmSNdTr7uC867rr2zyzNQ6AiE1hcREmGFTlvH3 WHERE label ='" + label + "'");
var query = new google.visualization.Query('http://www.google.com/fusiontables/gvizdata?tq=' + sql);
query.send(function (response) {
var data = response.getDataTable().getValue(0, 0);
// Create a XML parser
if (window.DOMParser) {
var parser = new DOMParser();
var kml = parser.parseFromString(data, "text/xml");
} else {
var kml = new ActiveXObject("Microsoft.XMLDOM");
kml.loadXML(data);
}
// Get the coordinates of Mountain Areas
var latLngs = kml.getElementsByTagName("coordinates")[0].childNodes[0].nodeValue.split(' ');
var mountainPolygonLatLngs = [];
for (var i = 0; i < latLngs.length; i++) {
var latLng = latLngs[i].split(',');
mountainPolygonLatLngs.push(new google.maps.LatLng(latLng[1], latLng[0]));
}
// Create the polygon
mountainPolygons = new google.maps.Polygon({
paths: mountainPolygonLatLngs,
fillColor: 'transparent',
strokeColor : 'transparent'
});
resolve(mountainPolygons);
});
});
}
然后我们循环遍历山脉数组并检查所选区域是否包含山脉:
// On mountain area click
google.maps.event.addListener(layer, 'click', function(event) {
// Clear all markers
while(markers.length) {
markers.pop().setMap(null);
}
// Get Polygon from FustionTable
getMountainPolygonFromFusionTable(event.row.label.value).then(function(mountainPolygons) {
// Loop through the mountains
for(var i = 0; i < mountains.length; i++) {
// Get the mountain LatLng
var mountain = mountains[i];
var mountainLat = mountain.getElementsByTagName("Latitude")[0].childNodes[0].nodeValue;
var mountainLng = mountain.getElementsByTagName("Longitude")[0].childNodes[0].nodeValue;
var mountainLatLng = new google.maps.LatLng(mountainLat, mountainLng);
// If mountain is in the selected polygon, create a marker for it.
if (google.maps.geometry.poly.containsLocation(mountainLatLng, mountainPolygons)) {
// @todo set infowindow, title...
var marker = new google.maps.Marker({
position: mountainLatLng,
title: 'Marker info here',
});
marker.setMap(map);
markers.push(marker);
}
}
});
});
这是 JSON 版本:
google.maps.event.addListener(layer, 'click', function(event) {
// Clear all markers
while(markers.length) {
markers.pop().setMap(null);
}
// Get Polygone from FustionTable
getMountainPolygonFromFusionTable(event.row.label.value).then(function(mountainPolygons) {
$.getJSON(uri).done(function (data) {
// On success, 'data' contains a list of mountains.
$.each(data, function (key, item) {
//Put seperate data fields into one variable
var latLng = new google.maps.LatLng(item.Latitude, item.Longitude);
if (google.maps.geometry.poly.containsLocation(latLng, mountainPolygons)) {
// @todo set infowindow, title...
var marker = new google.maps.Marker({
position: latLng,
title: 'Marker info here',
});
marker.setMap(map);
markers.push(marker);
}
});
});
});
});
关于javascript - 谷歌地图、融合表和标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38545692/
我输入了一个包含两个元素的 vector 。然后我将另一个元素 push_back 到它,并期望什么结果类型也是一个 vector 。但事实并非如此。 例子: typedef boost::fusio
首先让我先说,我以前在这里问过类似的问题,但从来没有得到解决我缺乏知识/问题的好答案。 首先,让我从一个分支策略提案开始。这就是我们的工作,我很高兴听到其他评论,以及为什么这很糟糕。但要明白它通常对我
所以我将一个带有 javascript 的字符串发送到 php 页面: if(cp.value!=''){ s+=cp.name +" LIKE '%"+ cp.value +"%'";
我有一个简单的问题,我该如何使用 which和 which.max同时。 我想选择最大值epnum为行 id == B13639J2 . 我需要检索 row number因为我需要对变量进行一些手动更
我想将带有 Groovy 脚本的文件上传到 Confluence。 As this Pythonscript example!我开始将代码翻译成 groovy, // Groovy def serve
我有一个融合 vector ,其元素具有多个不同类型的成员数据,我想创建一个新的融合 vector ,它将仅投影特定的数据成员。我已经对此进行了一段时间的研究,但没有任何进展。 #include #
我正在尝试使用 Python 的 xmlrpclib 创建一个新的页面以汇合。我已经知道如何更新现有页面的内容,但如何创建一个全新的页面? 我使用了以下脚本来更新内容: import xmlrpcli
我正在使用 Pow 在 Mac OS X 上为 Rack 应用程序提供服务。http://myapp.dev正确显示应用程序。在同一台机器上,我使用 VMware Fusion 运行 Windows
我检查了 Cassandra 和 Infinispan 的主要特性。它们似乎具有并提供非常相似的特性和功能: NoSQL 数据存储 坚持 去中心化 支持复制 可扩展性 容错 MapReduce 支持
我在Drupal 7网站中使用Search API和Elasticsearch Connector。我已经在AWS中托管了elasticsearch。搜索完美无误。但是我想像在Drupal.org搜索
我最近重新打开了几年前参与的一个项目。我写了一个小的 python 脚本来构建项目。我想将其移植到 CMake。 我遇到的问题是脚本使用了 pkg-config在 linux 上找到 fuse 头文件
我正在尝试访问 Yelp fusion API。我正在关注documentation并来到这段代码: const request = require('request'); // As you can
这是一个 vanilla Ubuntu 16.04 LTS,准确地说是基于 Xubuntu core。所以我需要自己安装包。除了 meld 之外,一切都很顺利,开始时,我会得到: (meld:4188
我正在尝试对惰性求值在 Java 流 API 中的应用形成一个简洁而连贯的理解。 这是我目前的理解: 元素仅在需要时才被消耗,即流是惰性的,中间操作也是惰性的,例如过滤器,仅在需要时进行过滤。 中间操
我使用 conluent jdbc-sink 将数据从 kafka 加载到 oracle。 但是我用数据编写了关于值(value)的模式。 我不想用数据编写模式,如何在 kafka 主题上编写模式,然
我在这里编写了一个 2D 融合套索代码。 [m n] = size(circle); cvx_begin variable theta(m, n); minimize( norm(ci
目前我正在开发一个使用 dx9 创建叠加层的应用程序。现在我遇到了一个问题,自从我将 Windows 10 升级到最新版本(Creators Update)后,它无法使用 alpha channel
我正在尝试编写类似 fiber 的代码,这样我就可以进入任务并从中退出。我试过的代码: class TaskActivity { CancellationTokenSource _m=new
我使用 NPM 在 React.js 中创建了一个前端。作为 IDE,我在这里使用 IntelliJ IDEA。该项目将使用我单独创建的 Spring Boot 编写的后端,也在 IntelliJ I
Cassandra 连接器在融合升级到 3.3.0 后失败。 Cassandra驱动的版本是3.3。堆栈如下。 [2017-09-14 08:56:28,123] ERROR java.lang.re
我是一名优秀的程序员,十分优秀!