API-интерфейс API Карт Google и KML файлы LocalHost

Документация по документации библиотеки Google Maps JavaScript версии 3 объясняется:

API Карт Google поддерживает KML и форматы данных GeoRSS для отображения географическая информация. Эти данные форматы отображаются на карте с использованием Объект KmlLayer, конструктор которого принимает URL-адрес общедоступногоKML или GeoRSS.

Есть даже несколько вопросов о том, как загружать локальные данные:

Некоторые ответы указывают на сторонние библиотеки, которые могут анализировать KML локально без файла, который должен быть общедоступным:

И хотя эти решения хороши, если у вас есть необходимость хранить данные конфиденциальными, я просто хочу сделать разработку проще. При запуске локально я, очевидно, не могу разобрать мой KML и, следовательно, потерять функциональность, которую я пытаюсь проверить. Я опубликовал один универсальный KML файл на общедоступном сайте, но затем должен иметь другой код разработки, чтобы отображать одну вещь или что-то еще при запуске для реального.

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

Ответы

Ответ 1

Похоже, вы хорошо описали варианты:

Если вы хотите работать с локальными данными без привлечения общедоступного веб-сервера, вам нужно будет использовать подход на основе javascript для анализа KML и загрузки его на карту. Хотя это не будет полностью воспроизводить функциональность Google, это, скорее всего, достаточно хорошо для начальной разработки, если вы только заботитесь о отображении функций KML. В этом случае я бы, вероятно, создал класс заглушки, например:

    // I'll assume you have a global namespace called MyProject
    MyProject.LOCAL_KML = true;

    MyProject.KmlLayer = function(url) {
        // parse the KML, maybe caching an array of markers or polygons,
        // using one of the libraries you list in your question
    };

    // now stub out the methods you care about, based on
    // http://code.google.com/apis/maps/documentation/javascript/reference.html#KmlLayer
    MyProject.KmlLayer.prototype.setMap = function(map) {
        // add the markers and polygons to the map, or remove them if !map
    }
    // etc

Теперь либо поставьте переключатель в код, либо комментируйте/раскомментируйте, либо используйте конструкцию script для переключения или какой бы то ни было ваш текущий процесс для переключения между dev и производственным кодом:

    var kmlPath = "/my.kml";
    var kmlLayer =  MyProject.LOCAL_KML ?
        new MyProject.KmlLayer(MyProject.LOCAL_KML_HOST + kmlPath) :
        new google.maps.KmlLayer(MyProject.PRODUCTION_KML_HOST + kmlPath);
    kmlLayer.setMap(myMap);

Если, с другой стороны, вам нужны все функции в Google KmlLayer, или вы хотите убедиться, что все работает с производственной настройкой, или вы не хотите, чтобы чтобы не нарушать функциональность, предоставляемую Google, тогда вам нужно будет загрузить ее на общедоступный сервер, чтобы Google мог выполнять обработку на стороне сервера.

Помимо очевидных опций (FTP, командная строка script для загрузки вашего нового файла KML и т.д.), большинство из которых требуют, чтобы вы делали что-то вручную, прежде чем загружать свою карту, вы можете подумать о создании обновления на страницу, которую вы загружаете. В зависимости от платформы, которую вы используете, это может быть проще сделать на внутреннем или внешнем интерфейсе; ключ был бы иметь script на вашем общедоступном сервере, который позволит обновлять KML:

  • Получить строку KML из запроса. POST
  • Подтвердите строку KML (просто чтобы вы не открывали свой сервер для атак)
  • Запись в один файл, например. "My.kml"

Затем, когда вы просматриваете страницу своей карты, обновите удаленный KML на основе данных из localhost. Здесь версия на стороне клиента, использующая jQuery:

// again, you'd probably have a way to kill this block in production
if (MyProject.UPDATE_KML_FROM_LOCALHOST) {
    // get localhost KML
    $.get(MyProject.LOCAL_KML_HOST + kmlPath, function(data) {
        // now post it to the remote server
        $.post(
            MyProject.DEV_KML_HOST + '/update_kml.php', 
            { kml: data }, 
            function() {
                // after the post completes, get the KML layer from Google
                var kmlLayer new google.maps.KmlLayer(MyProject.DEV_KML_HOST + kmlPath);
                kmlLayer.setMap(myMap);
            }
        );
    })
}

По общему признанию, здесь много круговых поездок (страница → локальный, страничный → удаленный сервер, Google → удаленный сервер, Google → страница), поэтому это будет медленным. Но это позволит вам правильно отображать код Google для динамических данных KML, созданных на локальном хостинге, без необходимости выполнять отдельный ручной шаг при каждой перезагрузке страницы.