Any experts on google earth here?

Need help with an engine or coding not on the list? Need help with a game or the website and forums here? Direct all questions here.
Post Reply
User avatar
kaos78414
Posts: 507
Joined: Thu Jul 22, 2010 5:36 am

Any experts on google earth here?

Post by kaos78414 »

I'm trying to resolve some issues in dynamically created folders, each with an associated region (lod, latlonaltbox) and a crapload of placemarks. All the code sits in an angular directive and looks like this at the moment:

Code: Select all

        var ge,
            loaded = false;

        google.setOnLoadCallback(google.earth.createInstance('map3d', function (instance) {
          ge = instance;

          var uscontainer = {n:50,s:20,e:-60,w:-126};
          var folders = [];

          // Create all folders for consumption by placemarks
          for (var ns = uscontainer.n; ns <= uscontainer.n && ns >= uscontainer.s; ns -= 2) {
            folders[ns] = [];
            for (var we = uscontainer.e; we <= uscontainer.e && we >= uscontainer.w; we -= 2) {
              var latLonAltBox = ge.createLatLonAltBox(weightedRandom.guid());
              latLonAltBox.setAltBox(ns, ns - 2, we - 2, we, 0, 0, 0, ge.ALTITUDE_RELATIVE_TO_GROUND);

              // close
              var lodClose = ge.createLod(weightedRandom.guid());
              lodClose.set(131072, -1, 0, 0);
              var regionsClose = ge.createRegion(weightedRandom.guid());
              regionsClose.set(latLonAltBox, lodClose);
              var regionFoldersClose = ge.createFolder(weightedRandom.guid());
              regionFoldersClose.setRegion(regionsClose);
              ge.getFeatures().appendChild(regionFoldersClose);

              // medium
              var lodMed = ge.createLod(weightedRandom.guid());
              lodMed.set(32768, -1, 0, 0);
              var regionsMed = ge.createRegion(weightedRandom.guid());
              regionsMed.set(latLonAltBox, lodMed);
              var regionFoldersMed = ge.createFolder(weightedRandom.guid());
              regionFoldersMed.setRegion(regionsMed);
              ge.getFeatures().appendChild(regionFoldersMed);

              // far
              var regionFoldersFar = ge.createFolder(weightedRandom.guid());
              ge.getFeatures().appendChild(regionFoldersFar);

              folders[ns][we] = {
                close: regionFoldersClose,
                far: regionFoldersFar,
                med: regionFoldersMed
              };
            }
          }

          var icon = ge.createIcon(weightedRandom.guid());
          var offIcon = ge.createIcon(weightedRandom.guid());
          var style = ge.createStyle(weightedRandom.guid());
          var offStyle = ge.createStyle(weightedRandom.guid());

          icon.setHref(window.location.href + '/assets/images/lightbulb.png');
          offIcon.setHref(window.location.href + '/assets/images/lightbulb_off.png');
          icon.setViewRefreshMode(ge.VIEW_REFRESH_ON_REGION);
          offIcon.setViewRefreshMode(ge.VIEW_REFRESH_ON_REGION);
          icon.setW(16);
          icon.setH(16);
          offIcon.setW(16);
          offIcon.setH(16);
          style.getIconStyle().setIcon(icon);
          offStyle.getIconStyle().setIcon(offIcon);
          style.getIconStyle().setScale(1);
          offStyle.getIconStyle().setScale(1);

          weightedRandom.set(['close', 'med', 'far'], [0.7, 0.2, 0.1]);

          var roundUp = function (n, to) {
            return Math.ceil(n / to) * to;
          };

          scope.control.createPlacemark = function (lat, lng, sale, to) {
            to = to || 0;
            var placemark = ge.createPlacemark(weightedRandom.guid());
            var point = ge.createPoint(weightedRandom.guid());
            point.setLatitude(+lat);
            point.setLongitude(+lng);
            placemark.setGeometry(point);
            placemark.setStyleSelector(style);

            // lat = NS, lng = EW
            var ceiled = roundUp(lat, 2);
            var floored = roundUp(lng, 2);

            if (folders[ceiled]) {
              if (folders[ceiled][floored]) {
                var distance = weightedRandom.get();
                folders[ceiled][floored][distance].getFeatures().appendChild(placemark);
              } else {
                console.log('not found!');
              }
            } else {
              console.log('not found!');
            }

            $timeout(function () {
              placemark.setStyleSelector(offStyle);
            }, to);
            return placemark;
          };

          ge.getLayerRoot().enableLayerById(ge.LAYER_BORDERS, true);
          ge.getWindow().setVisibility(true);
          scope.control.setLookAt(null, null, 7000000); // 7,000,000

          scope.initialized = true;
        }, function (err) {
          console.error(err); // something went wrong!
        }));
The problem is that only the close and far regions show up! For some reason the second layer / LoD doesn't display any of its folder features on the map. I have no idea why that may be occurring. If anyone has any experience with google earth I would totally buy you a beer or three for some help :)
w00t
User avatar
kaos78414
Posts: 507
Joined: Thu Jul 22, 2010 5:36 am

Re: Any experts on google earth here?

Post by kaos78414 »

Just following up to let you guys know I resolved this using KML layers and just having them generate dynamically in node (used swig templating engine for the views). If you are working with google earth for some reason I can probably help to some degree, especially if you are trying (like my case) to show millions of points on the map at once.
w00t
Post Reply

Return to “Advanced Help and Support”