Проблема с использованием NetworkLinkControl для обновлений в подключаемом модуле GE

Я использую KML для загрузки наложения изображения, а затем пытаюсь изменить значения обзора камеры, такие как высота, с помощью NetworkLinkControl. Ни одно из моих обновлений NetworkLinkControl не отражается в подключаемом модуле GE. Я провел довольно много исследований по этому вопросу, но безрезультатно. Любая помощь будет оценена.

Вот подробности:

Процесс начинается с загрузки файла NetworkLink KML:

google.earth.fetchKml(ge, href, function(kmlObject) { ... 

внутри которого .appendChild() делается так:

    walkKmlDom(kmlObject, function() {
        if(this.getType().match('KmlNetworkLink')) {
            ge.getFeatures().appendChild(this);

            //There are 2 NetworkLinks
            if(this.getLink().getHref().match('nodesc')) {
                networkLinkPhoto = this;
            }
            else if(this.getLink().getHref().match('control')){
                networkLinkControl = this; //will use this for updates later
            }
        }
    });

Приведенный выше .fetchKml() загружает следующий KML 1:

    <kml xmlns="http://www.opengis.net/kml/2.2">
        <Document>
            <name>Photos</name>
            <open>1</open>
            <Style id="photoStyle">
                <IconStyle>
                    <Icon>
                        <href>http://hostname/images/ge_icon.png</href>
                    </Icon>
                </IconStyle>
                <BalloonStyle>
                    <text>$[description]</text>
                </BalloonStyle>
            </Style>
            <Folder>
                <name>My Photo</name>
                <open>1</open>
                <visibility>1</visibility>
                <NetworkLink>
                    <name>My Photo</name>
                    <open>1</open>
                    <Link>
                        <href>http://hostname/images/10000244.kml?auth_key=e34962fce2df4829b0e86870c9e834da&amp;nodesc=1</href>
                    </Link>
                </NetworkLink>
                <NetworkLink>
                    <name>Updater</name>
                    <Link>
                        <href>http://hostname/placements/10000244/control?auth_key=e34962fce2df4829b0e86870c9e834da</href>
                        <refreshMode>onChange</refreshMode>
                    </Link>
                </NetworkLink>
            </Folder>
        </Document>
    </kml>

Каждый из двух NetworkLink загружает свой собственный файл KML через URL-адреса, определенные в <Link>.

Первый - Моя фотография (оверлей) KML 2:

    <kml xmlns="http://www.opengis.net/kml/2.2">
        <Document>
            <name>Photos</name>
            <open>1</open>
            <Style id="photoStyle">
                <IconStyle>
                    <Icon>
                        <href>http://hostname/images/ge_icon.png</href>
                    </Icon>
                </IconStyle>
                <BalloonStyle>
                    <text>$[description]</text>
                </BalloonStyle>
            </Style>
            <PhotoOverlay id="image_10000244">
                <name>My Photo</name>
                <Snippet maxLines="1">
                    <![CDATA[<a href="#image_10000244">Enter Photo</a>]]>
                </Snippet>
                <Camera>
                    <longitude>-122.668</longitude>
                    <latitude>45.5069</latitude>
                    <altitude>1.0</altitude>
                    <heading>66.0</heading>
                    <tilt>90.0</tilt>
                    <roll>0.0</roll>
                </Camera>
                <styleUrl>#photoStyle</styleUrl>
                <color>feffffff</color>
                <Icon>
                    <href>http://hostname/get_ge_tile/10000244/$[level]/$[y]/$[x]?auth_key=e34962fce2df4829b0e86870c9e834da</href>
                </Icon>
                <rotation>0.0</rotation>
                <ViewVolume>
                    <leftFov>-17.5</leftFov>
                    <rightFov>17.5</rightFov>
                    <bottomFov>0.0</bottomFov>
                    <topFov>17.5</topFov>
                    <near>550.0</near>
                </ViewVolume>
                <ImagePyramid>
                    <tileSize>256</tileSize>
                    <maxWidth>16000</maxWidth>
                    <maxHeight>8000</maxHeight>
                    <gridOrigin>upperLeft</gridOrigin>
                </ImagePyramid>
                <Point>
                    <coordinates>-122.668,45.5069</coordinates>
                </Point>
                <shape>sphere</shape>
            </PhotoOverlay>
        </Document>
    </kml>

Второй - Updater KML 3:

    <kml xmlns="http://www.opengis.net/kml/2.2">
        <Document>
            <name>Photos</name>
            <open>1</open>
            <Style id="photoStyle">
                <IconStyle>
                    <Icon>
                        <href>http://hostname/images/ge_icon.png</href>
                    </Icon>
                </IconStyle>
                <BalloonStyle>
                    <text>$[description]</text>
                </BalloonStyle>
            </Style>
            <NetworkLinkControl>
                <Update>
                    <targetHref>http://hostname/images/10000244.kml?auth_key=e34962fce2df4829b0e86870c9e834da&amp;nodesc=1</targetHref>
                    <Change>
                        <PhotoOverlay targetId="image_10000244">

                            <Camera></Camera>
                            <ViewVolume></ViewVolume>
                            <Point></Point>
                        </PhotoOverlay>
                    </Change>
                </Update>
            </NetworkLinkControl>
        </Document>
    </kml>

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

Чтобы изменить высоту фотографии, javascript API запрашивает обновление:

var updateHref='http://http://hostname/netlinkcontrol/10000244?&altitude=55&auth_key=e34962fce2df4829b0e86870c9e834da'
networkLinkControl.getLink().setHref(updateHref);

Сервер отвечает (указывается в журнале сервера) с помощью KML 4:

    <kml xmlns="http://www.opengis.net/kml/2.2">
        <Document>
            <name>Photos</name>
            <open>1</open>
            <Style id="photoStyle">
                <IconStyle>
                    <Icon>
                        <href>http://hostname/images/ge_icon.png</href>
                    </Icon>
                </IconStyle>
                <BalloonStyle>
                    <text>$[description]</text>
                </BalloonStyle>
            </Style>
            <NetworkLinkControl>
                <Update>
                    <targetHref>http://hostname/images/10000244.kml?auth_key=e34962fce2df4829b0e86870c9e834da&amp;nodesc=1</targetHref>
                    <Change>
                        <PhotoOverlay targetId="image_10000244">

                            <Camera>

                                <altitude>55</altitude>
                            </Camera>
                            <ViewVolume></ViewVolume>
                            <Point></Point>
                        </PhotoOverlay>
                    </Change>
                </Update>
            </NetworkLinkControl>
        </Document>
    </kml>

Это должно работать, потому что:

  1. <refreshMode>onChange</refreshMode> установлен для Updater <NetworkLink> в KML 1, и networkLinkControl.getLink().setHref() вносит изменения.
  2. <PhotoOverlay targetId="image_10000244"> в KML 4 правильно нацелен на <PhotoOverlay id="image_10000244"> в KML 2
  3. <targetHref> в KML 4 нацелен на правильный <href> в KML 1

Однако плагин GE не отображает изменение высоты. Я пробовал изменить это значение через javascript API, который работает. Но почему не работает метод KML? Любые идеи были бы хорошы.


person user1096589    schedule 13.12.2011    source источник


Ответы (1)


Попробуйте настроить таргетинг на сам элемент Camera, а не на родительский элемент PhotoOverlay. Обновления KML в Google Планета Земля не работают так хорошо, когда вы пытаетесь внести изменения на пару уровней ниже целевого родителя.

Другими словами, я бы попробовал это:

KML 1

<PhotoOverlay id="image_10000244">
  <name>My Photo</name>
  <Snippet maxLines="1">
      <![CDATA[<a href="#image_10000244">Enter Photo</a>]]>
  </Snippet>
  <Camera id="image_10000244_camera">
      <longitude>-122.668</longitude>
      <latitude>45.5069</latitude>
      <altitude>1.0</altitude>
      <heading>66.0</heading>
      <tilt>90.0</tilt>
      <roll>0.0</roll>
  </Camera>
  <ViewVolume id="image_10000244_viewvol" />
</PhotoOverlay>

а затем в обновлении вашей сетевой ссылки:

<NetworkLinkControl>
  <Update>
    <targetHref>http://hostname/images/10000244.kml?auth_key=e34962fce2df4829b0e86870c9e834da&amp;nodesc=1</targetHref>
    <Change>
      <Camera targetId="image_10000244">
        <altitude>55</altitude>
      </Camera>
    </Change>
    <Change>
      <ViewVolume targetId="image_10000244_viewvol">
        <!-- new values -->
      </ViewVolume>
    </Change>
  </Update>
</NetworkLinkControl>

В общем, лучше всего настроить таргетинг на непосредственного родителя простого элемента, который вы хотите изменить. Каскадные обновления работают не так хорошо.

Я также рекомендую вам попробовать это в чистом KML в самом Google Планета Земля, чтобы убедиться, что это работает. Затем, после выполнения обновления NLC, вы можете скопировать PhotoOverlay и вставить код в свой редактор и посмотреть, правильно ли было применено изменение.

Дай мне знать, если это работает...

person KML-chemist    schedule 14.12.2011