Page 1 of 1

Any experts on google earth here?

Posted: Wed Oct 08, 2014 8:48 pm
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 :)

Re: Any experts on google earth here?

Posted: Mon Oct 20, 2014 6:59 pm
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.