2012-01-24 3 views
0

Я хочу отобразить KML-файл в Google Maps из моего приложения asp.net MVC 3.Как написать файл kml на общедоступный сервер?

Из API Google Maps JavaScript V3, я использую KmlLayer ('url') для отображения kml в картах google. Я читал, что файл kml должен находиться на общедоступном сервере. Я мог бы отображать файл kml локально с помощью сторонних javascripts, но они могут быть подвержены ошибкам. (Loading a local .kml file using google maps?)

Файлы kml, которые я хочу визуализировать, хранятся в базе данных SQL-сервера в виде массивов байтов. Поэтому для одного файла Kml я должен написать массив байтов в путь с расширением kml. Я сделал это с File.WriteAllBytes (путь, байт), где path = local path и byte = byte array из базы данных. Это делается в контроллере приложения 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 пройти URLs для яваскрипта метода KmlLayer (...). Но здесь есть только локальные пути.

Как приложение MVC может хранить файл kml на общедоступном сервере, чтобы он мог передать URL-адрес KmlLayer (...)? Это необходимо сделать программным путем.

Я в настоящее время получаю доступ к моему приложению MVC и базе данных с localhost. У меня статический Ip и имя. Я также хотел бы опубликовать приложение и базу данных для онлайн-доступа. Не знаете, как это сделать, пожалуйста, дайте мне несколько советов/рекомендаций. Благодарю.

ответ

0

Есть некоторая проблема, чтобы сделать файл kml общедоступным. Скажем, местоположение файла должно быть доступно google.

Если вы хотите внедрить Google Earth на веб-сайт, то есть три метода импорта KML в плагин. 1. KmlNetworkLink 2. fetchKml 3. ParseKml

Оба 1 & 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

+0

Хорошо, но я хочу, чтобы встроить Google Maps вместо этого. Приложение MVC должно показать простую дорожную карту, которая отображает файл kml. Я не уверен, что открытый слой имеет локальный метод KmlLayer рендеринга. С google earth рендеринг карты медленнее, а также нужен плагин google earth. Пользователи, которые обращаются к приложению MVC в своем браузере, могут не иметь готового плагина ... – Qwerty

+0

Я прочитал об использовании Server.MapPath («~/folder»). Но не знаю, как я могу хранить файл kml на веб-сервере и получить URL-адрес, где он хранится ... Я не хочу, чтобы KML хранился в системе пользователя, обращаясь к приложению MVC. – Qwerty

+0

Это должно быть просто. На основе вашей географической информации создайте файл kml с помощью 'System.IO.File.WriteAllText (путь, содержимое) '. Для чтения вы можете попробовать этот файл StreamReader = новый StreamReader (filePath); var kml = file.ReadToEnd(); ' – Shahdat

Смежные вопросы