我想从我的asp.net MVC 3应用程序中在谷歌地图中呈现一个KML文件。
从谷歌地图JavaScript API V3,我使用KmlLayer('url')在谷歌地图中渲染kml。 我已经读过kml文件需要位于可公开访问的服务器中。我可以使用第三方javascripts在本地渲染kml文件,但它们可能容易出错。 (Loading a local .kml file using google maps?)
我要渲染的kml文件作为字节数组存储在SQL Server数据库中。因此,对于一个Kml文件,我必须将字节数组写入具有kml扩展名的路径中。我用File.WriteAllBytes(path,byte)完成了这个,其中path = local path和byte = byte数组来自Database。这是在MVC应用程序的控制器中完成的。 这是代码:
public ActionResult MapView(int id)
{
Incident inc = db.Incidents.Find(id);
if (inc.IncidentDatas.Count != 0)
{
ViewBag.ListKmlUrls = kmlFileStore(inc);
}
return View(inc);
}
public List<string> kmlFileStore(Incident inc)
{
List<string> listKmlUrls = new List<string>();
// Specify a "currently active folder"
string activeDir = @"c:\incident" + inc.incId + @"\incidentData";
//Create a new subfolder under the current active folder
string newPath = System.IO.Path.Combine(activeDir, "kmlFiles");
// Create the subfolder
System.IO.Directory.CreateDirectory(newPath);
String url;
foreach(var d in inc.IncidentDatas) {
url = @"c:\incident" + inc.incId + @"\incidentData\kmlFiles\" + d.id + ".kml";
//dataContent is byte[]
System.IO.File.WriteAllBytes(url, d.dataContent);
listKmlUrls.Add(url);
}
return listKmlUrls;
}
这个想法是视图将通过viewbag访问url列表,将url传递给javascript方法KmlLayer(...)。但这里的网址只是本地路径。
那么MVC应用程序如何将kml文件存储到可公开访问的服务器,以便它可以将URL传递给KmlLayer(...)?这必须以编程方式完成。
我目前正在从localhost访问我的MVC应用和数据库。我有一个静态的IP和名字。我还想发布应用程序和数据库以进行在线访问。不知道怎么办,请给我一些建议/指导。感谢。
答案 0 :(得分:0)
将kml文件公开访问存在一些问题。假设谷歌必须可以访问文件位置。
如果您想在网站中嵌入Google地球,那么有三种方法可以将KML导入到插件中。 1. KmlNetworkLink 2. fetchKml 3. ParseKml
1&amp; 2需要存储在服务器中的kml文件,该文件必须可公开访问,但3. ParseKml的工作方式更好。
<head>
<title>parsekml_example.html</title>
<script src="//www.google.com/jsapi?key=ABQIAAAA5El50zA4PeDTEMlv-sXFfRSsTL4WIgxhMZ0ZK_kHjwHeQuOD4xTdBhxbkZWuzyYTVeclkwYHpb17ZQ"></script>
<script type="text/javascript">
var ge;
var placemark;
var object;
google.load("earth", "1");
function init() {
google.earth.createInstance('map3d', initCB, failureCB);
}
function initCB(instance) {
ge = instance;
ge.getWindow().setVisibility(true);
var kmlString = ''
+ '<?xml version="1.0" encoding="UTF-8"?>'
+ '<kml xmlns="http://www.opengis.net/kml/2.2">'
+ '<Document>'
+ ' <Camera>'
+ ' <longitude>-122.444633</longitude>'
+ ' <latitude>37.801899</latitude>'
+ ' <altitude>139.629438</altitude>'
+ ' <heading>-70.0</heading>'
+ ' <tilt>75</tilt>'
+ ' </Camera>'
+ ' <Placemark>'
+ ' <name>Placemark from KML string</name>'
+ ' <Point>'
+ ' <coordinates>-122.448425,37.802907,0</coordinates>'
+ ' </Point>'
+ ' </Placemark>'
+ '</Document>'
+ '</kml>';
var kmlObject = ge.parseKml(kmlString);
ge.getFeatures().appendChild(kmlObject);
ge.getView().setAbstractView(kmlObject.getAbstractView());
}
function failureCB(errorCode) {
}
google.setOnLoadCallback(init);
</script>
</head>
<body>
<div id="map3d" style="height: 400px; width: 600px;">
</div>
</body>
有关详细信息,请参阅http://code.google.com/apis/earth/documentation/kml.html