Проблема с использованием NetworkLinkControl для обновлений в плагине GE - PullRequest
1 голос
/ 14 декабря 2011

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

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

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

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>.

Первый - My Photo (overlay) 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, однако, не отображает изменение высоты.Я пытался изменить это значение через API JavaScript, который работает.Но почему не работает метод KML?Любые идеи будут оценены.

1 Ответ

1 голос
/ 15 декабря 2011

Попробуйте настроить таргетинг на сам элемент 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>

и затем в networklinkupdate:

<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 и вставить код в ваш редактор и посмотреть, было ли изменение применено правильно.

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

...