Openlayers пишут и сохраняют KML на основе вашей карты - PullRequest
7 голосов
/ 20 февраля 2012

Можно ли написать и сохранить KML из OpenLayers? Кто-нибудь знает пример экспорта одного?

Ответы [ 3 ]

9 голосов
/ 20 февраля 2012

Вы можете экспортировать только векторные объекты в KML.

function GetKMLFromFeatures(features) {
    var format = new OpenLayers.Format.KML({
        'maxDepth':10,
        'extractStyles':true,
        'internalProjection': map.baseLayer.projection,
        'externalProjection': new OpenLayers.Projection("EPSG:4326")
    });

    return format.write(features);
}

UPDATE

Чтобы заставить браузер загружать строку KML в виде файла KML, необходимо отправить эту строку обратно на сторону сервера, чтобы ее можно было вернуть в браузер в качестве файла для загрузки.

Вы не указали, какой язык / платформу / и т.д. вы используете на стороне сервера, но это то, что я делал в C #.

Я создал обработчик, который получает имя файла из строки запроса и KML из формы textarea.

KMLDownload.ashx:

<%@ WebHandler Language="C#" Class="KMLDownload" %>

using System;
using System.Web;

public class KMLDownload : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {


        HttpResponse response = context.Response;

        string kml = context.Request["kml"];
        string filename = context.Request.QueryString["filename"];

        if (String.IsNullOrEmpty(kml))
        {
            context.Response.ContentType = "text/plain";
            context.Response.Write("{\"error\":\"No files recevied\"}");
        }
        else
        {

            if (String.IsNullOrEmpty(filename)){
                filename = "Features_KML.kml";
            }

            // force a download of the kml file.
            response.Clear();
            response.ContentType = "application/kml";
            response.AddHeader("Content-Disposition", "attachment; filename=" + filename);
            response.AddHeader("content-legth", kml.Length.ToString());
            response.Write(kml.ToString());
            response.End();
        }

    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }

}

Затем, с моей стороны JavaScript, я просто вызываю это, чтобы начать загрузку:

var filename = "NameofKMLfileI_WANT.kml";

var url = "secure/KMLDownload.ashx";
if (filename) {
    url += "?filename=" + filename;
}

var input = '<TEXTAREA name="kml">' + kml + '</TEXTAREA>';

//send request
jQuery('<form action="' + url + '" method="post">' + input + '</form>').appendTo('body').submit().remove();
3 голосов
/ 20 февраля 2012

Вот некоторые действия JQuery для сохранения:

$('#saveKML').click(function() {
 var kmlFormat = new OpenLayers.Format.KML();
 var newWindow = window.open('', 
  'KML Export ' + (new Date()).getTime(), "width=300,height=300");
   newWindow.document.write('<textarea id="kml" style="width: 100%; height: 100%">' + 
   kmlFormat.write(features) + '</textarea>');
});
0 голосов
/ 15 октября 2017

Если вы используете Openlayers 3 или 4, вы обнаружите, что синтаксис предыдущих (2012) ответов больше не работает.

Это работает:

        function GetKMLFromFeatures(features) {
            var format = new ol.format.KML();
            var kml = format.writeFeatures(features, {featureProjection: 'EPSG:3857'});
            return kml;
        }
        function GetGeoJSONFromFeatures(features) {
            var format = new ol.format.GeoJSON();
            var geoJSON = format.writeFeatures(features, {featureProjection: 'EPSG:3857'});
            return geoJSON;
        }
        function GetFeaturesFromLayer(layer) {
            var source = layer.getSource();
            var features = source.getFeatures();
            return features;
        }
...