过去我不得不做一些非常相似的事情。
我所做的是,我绘制了各种颜色的多边形,添加了地标、形状等,然后使用 Json 将所有内容保存到一个字符串中。
我使用 javascript 来保存所有数据,如下所示:
var feature = MapToolbar.features[type+'Tab'][id];
var vertices = MapToolbar.getLatLngVertices(feature.getPath());
allData[id] = { color: feature.fillColor, data: vertices}; });
var allDataJson = JSON.stringify(allData);
var hfPolyPath = $("div.hiddenVars input").get(0);
getLatLngVertices:
getLatLngVertices: function(path) {
var pathArray = path.getArray();
var vertices = [];
for( var i = 0, n = pathArray.length; i < n; i++ ) {
var latLng = pathArray[i];
vertices.push({ lat: latLng.lat(), lng: latLng.lng() });
}
return vertices;
},
我将代码包装到一个名为“SaveBounds()”的函数中,它会为我生成 Json 字符串并将其保存在隐藏字段中。
然后我使用 google api 生成了一个静态图像。
这可以在服务器端完成,也可以使用 jQuery。在我的情况下,我需要将图像作为电子邮件的附件发送,所以我必须在服务器端进行,但使用 jQuery 应该更容易。
您需要做的是使用http://maps.googleapis.com/maps/api/staticmap
您可以将所有查询字符串参数添加到其中,以生成与动态地图看起来相同的图像。
我在 C# 中的代码是:
sb.Append("http://maps.googleapis.com/maps/api/staticmap?");
sb.Append("center=" + centerMap.Value.Substring(1, centerMap.Value.Length - 1));
sb.Append("&zoom" + zoom.Value);
sb.Append("&size=450x450");
sb.Append("&mapType=" + mapType.Value);
var decodedMapData = Server.UrlDecode(polyPath.Value);
var dataObject = JsonConvert.DeserializeObject<dynamic>(decodedMapData);
string staticImgSrc = sb.ToString();
foreach (var key in dataObject)
{
var color = key.Value["color"];
var array = key.Value["data"];
var fillcolor = "0x" + color.ToString().Substring(1) + "80";
staticImgSrc += "&path=color:0x00000080|weight:2|fillcolor:" + fillcolor;
var count = 0;
var lat = string.Empty;
var lng = string.Empty;
foreach (var arrayItem in array)
{
staticImgSrc += "|" + arrayItem.lat.ToString() + "," + arrayItem.lng.ToString();
if (count == 0)
{
lat = arrayItem.lat.ToString();
lng = arrayItem.lng.ToString();
}
count++;
}
staticImgSrc += "|" + lat + "," + lng;
}
staticImgSrc += "&sensor=false";
您可以使用最终图像 url 来保存图像、通过电子邮件发送或任何您喜欢的方式。您可以根据需要添加任意数量的形状和地标,并且可以将它们填充为您想要的任何颜色。您可以控制地图类型、定位、缩放等,因此最终结果是与您开始使用的动态地图完全相同的图像。