Как правильно обновить Google Планета Земля KML с помощью NetworkLinkControl и Java API для KML (JAK)? - PullRequest
3 голосов
/ 31 августа 2011

Я создаю приложение, которое передает данные автономному клиенту Google Планета Земля.Я хочу отправить исходный набор данных, а затем динамически обновлять его, используя теги <NetworkLinkControl> и <Update><cookie> по мере изменения ситуации на сервере.Я генерирую KML с использованием библиотеки Java API для KML (JAK).К сожалению, хотя я могу подтвердить, что GE обновляет мой NetworkLink и загружает обновления, которые я отправляю, ни одно из моих обновлений не отображается в GE.После долгих чтений может показаться, что проблема может быть в <targetHref> в обновлении, но я на 99,9% уверен, что посылаю ту же строку.

Часть того, что меня смутилоЯ видел противоречивую информацию о том, нужно ли добавлять <cookie> значение элемента к <targetHref>.Я действительно видел одно раннее обновление прототипа, когда обслуживал рукописные тестовые KML-файлы со статического URL-адреса сервера, поэтому я подозреваю, что это не так.На самом деле, это то, что разочаровывает в данный момент: я видел обновление работы на своем собственном компьютере, но не могу заставить его работать сейчас с тем, что выглядит как правильный и правильный KML.

Текущая настройка выглядит следующим образом (посторонние пространства имен XML выделены для ясности; "$ CLIENT_ID" - строка, подобная GUID):

Корневой файл KML, отправленный из http://server/kml/${CLIENT_ID}:

<kml  xmlns="http://www.opengis.net/kml/2.2" 
      xmlns:gx="http://www.google.com/kml/ext/2.2" 
      xmlns:atom="http://www.w3.org/2005/Atom"     
      xmlns:xal="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"><NetworkLink>
  <Link>
    <href>http://server/kmlupdates/${CLIENT_ID}</href>
    <refreshMode>onInterval</refreshMode>
    <refreshInterval>1.0</refreshInterval>
    <viewRefreshTime>0.0</viewRefreshTime>
    <viewBoundScale>0.0</viewBoundScale>
  </Link>
</NetworkLink></kml>

Исходное содержимое KML, отправленное с http://server/kmlupdates/${CLIENT_ID}:

<kml><NetworkLinkControl>
    <minRefreshPeriod>0.0</minRefreshPeriod>
    <maxSessionLength>-1.0</maxSessionLength>
    <cookie>cookie=0|kmlRequestType=updates|projectID=6|lastUpdateSeenIndex=-1</cookie>
  </NetworkLinkControl>
  <Document id="myProject">
    <name>My ProjectProject</name>
    <Placemark id="pm1"><name>point1</name>
        <Point><coordinates>-117.0,35.0</coordinates></Point>
    </Placemark>
</Document></kml>

Позднее обновление KML подается с http://server/kmlupdates/${CLIENT_ID}:

<kml><NetworkLinkControl>
    <minRefreshPeriod>0.0</minRefreshPeriod>
    <maxSessionLength>-1.0</maxSessionLength>
    <cookie>cookie=0|kmlRequestType=updates|projectID=6|lastUpdateSeenIndex=0</cookie>
    <Update>
        <targetHref>http://server/kmlupdates/${CLIENT_ID}</targetHref>
        <Change>
            <Placemark targetId="pm1">
                <name>Name changed by Update Change</name>
            </Placemark>
        </Change>
    </Update>
</NetworkLinkControl></kml>

Если у кого-нибудь есть какие-либо предложения по поводу того, что мне здесь не хватает, я был бы очень признателен.Спасибо!

Ответы [ 2 ]

4 голосов
/ 31 августа 2011

Моя первоначальная версия вопроса не учитывала два факта: 1) я использую Java API для KML для генерации этого и 2) пространства имен XML внутри <kml>. Я наконец-то понял это после прочтения этого сообщения группы Google KML в сотый раз.

Проблема в последнем пространстве имен XML, "xmlns:xal". По какой-то причине удаление этого из KML позволяет тегам <Update> фактически изменять элементы в Google Планета Земля. JAK не позволяет вам изменять пространства имен, но вы можете убрать его вручную из маршалированной строки.

Абсолютно странно, но, по крайней мере, я нашел решение.

0 голосов
/ 06 октября 2015

У меня есть пример, использующий другой подход, чтобы сделать что-то еще здесь, возможно, связанное с вашим (поскольку ваша цель «отправить начальный набор данных, а затем динамически обновить его с помощью тегов»):

https://sites.google.com/site/canadadennischen888/home/kml/auto-refresh-3d-tracking

Подход заключается в том, что все изменения происходят с сервера Restful Service. Надеюсь, поможет. Детали как:

Как сделать динамическое автоматическое обновление 3D трекинга:

  1. подготовить сервис RestFul для генерации KML-файла из БД (образец KML, как внутри ссылки выше)

  2. Мой другой код jsp создаст файл KMZ, который содержит ссылку на мою службу Restful. Файл KMZ имеет значение onInterval (как внизу)

  3. Веб-страница Jsp позволяет пользователю загружать файл KMZ.

  4. Когда Google Планета Земля откроет файл KMZ, Google Планета Земля автоматически обновится, чтобы получить новые данные из этой службы Restful

  5. При каждом обновлении сервер отправляет последние обновленные данные KML с новыми данными в GE.

КМЗ образца:

    <?xml version="1.0" encoding="UTF-8"?>
     <kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" 
     xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
     <NetworkLink> 
     <name>Dennis_Chen_Canada@Hotmail.com</name> 
     <open>1</open> 
     <Link> 
     <href>http://localhost:9080/google-earth-project/rest/kml/10001/20002</href> 
     <refreshMode>onInterval</refreshMode> 
     </Link>
     </NetworkLink>
     </kml>
...