Показать иерархию меток в Google Планета Земля - PullRequest
1 голос
/ 17 февраля 2012

Я пытаюсь использовать kml для реализации иерархии регионов, как описано в Учебное пособие по KML 2.1

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

Примером может быть, если у меня есть регион, представляющий Канаду и метку всередина региона.Когда регион Канады станет активным, я хочу, чтобы метка канады исчезла, и хочу отобразить метки над провинциями Канады (регион и метка для Британской Колумбии, т. Д. Альберта).Затем, когда регион BC стал активным, я хотел бы заменить метку bc метками для городов в до н.э.

Любая помощь будет принята с благодарностью.Спасибо.

Ответы [ 2 ]

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

Вы на правильном пути, Регионы - это то, что вы хотите.Посетите эту страницу для получения дополнительной информации о том, как их использовать

http://code.google.com/apis/kml/documentation/regions.html

В частности, вам необходимо понимать уровень детализации (LOD).LOD определяет границы вида, которые активируют и деактивируют регион.В конце вам нужно создать Регионы в этом формате.

<Region> 
  <LatLonAltBox> 
    <north>50</north> 
    <south>45</south> 
    <east>28</east> 
    <west>22</west> 
  </LatLonAltBox> 
  <Lod>
    <minLodPixels>128</minLodPixels> 
    <maxLodPixels>1024</maxLodPixels> 
  </Lod>
</Region> 

Вы можете установить -1, так что регион ВСЕГДА отображается, независимо от того, как далеко кто-то увеличивает масштаб или если вы используете значение выше (128)это означает, что ограничивающая рамка, которую вы установили, должна занять 128x128 пикселей экрана зрителей, прежде чем он активируется (видно).

Это то, что вы используете, чтобы отключить вид при увеличении. Или оставьте в-1, поэтому он никогда не выключается, независимо от того, как далеко кто-то увеличивает IN.

По вашему вопросу у вас будет регион, содержащий метку в центре Канады.Этот регион будет иметь minlodpixels -1 и maxlodpixels, который соответствует minlodpixels другого региона (который показывает метки в провинциях). Я бы сделал регион для каждой провинции отдельно.

Трюк работаетГраницы - я использую квадратный многоугольник с четырьмя точками, а затем смотрю на его код, чтобы извлечь etc

На самом деле, здесь есть отличная страница, чтобы показать вам, как создавать регионы - убедитесь, что вы загрузили kmlназывается «Руководство по размеру наложения экрана» - это облегчает задачу

http://earth.google.ca/intl/en_ca/outreach/tutorial_region.html

0 голосов
/ 27 апреля 2012

Я пытаюсь сделать то же самое и придумала решение, которое работает, однако оно требует много обращений к серверу.

В вашей базовой базе данных kml, загруженной с http://example.com/zones.kml, вы получите

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Document id="base">
  <Folder id="1_folder">
    //Region responsible for hiding the current (Canada) Placemark when zoomed in and made inactive ALSO responsible for hiding children(BC, Alberta...) Placemarks when active
    <Region>
      <LatLonAltBox>
          <north>74.79903411865234</north>
          <south>41.508766174316406</south>
          <east>-52.03630065917969</east>
          <west>-139.96746826171875</west>
        </LatLonAltBox>
      <Lod>
        <maxLodPixels>
          1024
        </maxLodPixels>
      </Lod>
    </Region>

    //NetworkLink that hides children Placemarks when zooming out
    <NetworkLink>
      <refreshVisibility>1</refreshVisibility>
      <Link>
        <href>http://example.com/1/hide_children.kml</href>            
        <viewRefreshMode>onRegion</viewRefreshMode>
      </Link>
    </NetworkLink>

    //The Canada Placemark
    <Placemark id="1">
      <name>Canada</name>
      <Point>
        <coordinates>-96.00188446044922,58.153900146484375</coordinates>
      </Point>
    </Placemark>

    //Networklink for Loading Children While Zooming in
    <NetworkLink>
      <refreshVisibility>1</refreshVisibility>
      // Same Region as above but with minLodPixels instead of maxLodPixels
      <Region>
        <LatLonAltBox>
          <north>74.79903411865234</north>
          <south>41.508766174316406</south>
          <east>-52.03630065917969</east>
          <west>-139.96746826171875</west>
        </LatLonAltBox>
        <Lod>
         <minLodPixels>1024</minLodPixels>
        </Lod>
      </Region>
      <Link>
        <href>http://example.com/zones/1.kml</href>                
        <viewRefreshMode>onRegion</viewRefreshMode>
      </Link>
    </NetworkLink>
  </Folder>
</Document>
</kml>

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

kml для скрытия дочерних элементов будет загружен из http://example.com/1/hide_children.kmlи содержит элемент управления networklink, чтобы скрыть дочерние элементы

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
  <NetworkLinkControl>
    <Update>
      <targetHref>http://example.com/zones.kml</targetHref>
      <Change>
        <Folder targetId="1_children"><visibility>0</visibility></Folder>
      </Change>
    </Update>
  </NetworkLinkControl>
</kml>

kml для отображения дочерних элементов будет загружен из http://example.com/1.kml, и содержит элемент управления networklink, чтобы показать дочерним элементам дочерние элементы

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
  <NetworkLinkControl>
    <Update>
      <targetHref>http://example.com/zones.kml</targetHref>
      <Create>
        <Folder targetId="1_folder">
          <Folder id='1_children'>
            //This folder is the same as the original zone
            <Folder id="2_folder">
              //Empty region if the zone has no children
              <Region></Region>

              //No need for networklink to hide children if zone has no children

              //Placemark
              <Placemark id="2">
              <name>BC</name>
              <Point>
                <coordinates>-122.95623779296875, 50.06098937988281</coordinates>
              </Point></Placemark>
            </Folder>

            //Same for other Provinces
            //<Folder id="3_folder"></Folder>
            //<Folder id="4_folder"></Folder>

          </Folder>
        </Folder>
      </Create>
    </Update>
  </NetworkLinkControl>
</kml>

Было бы лучше, если бы вы могли определить 2 разных региона, один для minLod и один для maxLod, чтобы вам не нужно было так много обращений к серверам, и вам не нужно было вызывать сервер для загрузки уже загруженных дочерних элементов.но я еще не понял, как это сделать.

Это нужно оптимизировать совсем немного.Пожалуйста, дайте мне знать, если кто-нибудь может помочь найти более прямой способ сделать это.Спасибо

...