2016-05-18 9 views
1

Ich habe ein Cäsiumjs Display, und ich habe ein Kontrollkästchen (Klasse .checkbox), die ich möchte die Anzeige eines Artikels auf der Karte zu steuern. :Laden und entladen GeoJSON von Caesium Display

 var loadedGeometries = {}; 

     // We want to load/unload geometries when clicking on the checkboxes 
     $('.checkbox').on('click', function (event) { 
      var geometryID = id; // some unique database ID for the object to be displayed 
      if ($(this).prop('checked')) { 
       // it's checked, load it onto the map 
       $.get('/geometry/' + geometryID, function (data) { 
        var myDataSource = Cesium.GeoJsonDataSource.load(data['points'], { 
         markerSize: 24, 
         markerColor: Cesium.Color.RED, 
         markerSymbol: 't' 
        }); // data['points'] is GeoJSON 
        // Add it to the viewer 
        viewer.dataSources.add(myDataSource); 
        // Remember the data source by ID so we can delete later 
        loadedGeometries[geometryID] = myDataSource; 
       }, 'json'); 
       // SUCCESS! THIS PART WORKS!! 
      } else { 
       // unchecked, unload it from the map 
       viewer.dataSources.remove(loadedGeometries[geometryID], true); 
       delete loadedGeometries[geometryID]; 
       // FAILURE: OBJECT STILL ON THE MAP?! 
      } 
     }); 

Die Geometrie Belastungen und angezeigt wird, wie ich erwarten würde, aber wenn ich das Kontrollkästchen deaktivieren, bleiben die Daten auf der Karte. Ich bin unklar, ob die remove Funktion auf der dataSource tut, was ich erwarte es zu tun. Ist das der richtige Weg, um eine DataSource aus dem Display zu entfernen?

Antwort

2

Das Hauptproblem hier ist, dass Cesium.GeoJsonDataSource.load ein Versprechen zurückgibt, keine echte dataSource. Das bedeutet, dass Sie versuchen, das Versprechen aus der Liste der DataSources, und das funktioniert nicht. Interessanterweise fügt das Hinzufügen des Versprechens zur Liste der dataSources Arbeit hinzu, es wird nur asynchron hinzugefügt. Auf jeden Fall versuchen Sie dies:

Cesium.GeoJsonDataSource.load(data['points'], { 
    markerSize: 24, 
    markerColor: Cesium.Color.RED, 
    markerSymbol: 't' 
}).then(function(myDataSource) { 
    // Add it to the viewer 
    viewer.dataSources.add(myDataSource); 
    // Remember the data source by ID so we can delete later 
    loadedGeometries[geometryID] = myDataSource; 
}); 

Ein weiterer Kommentar Ich werde die dataSource.show Flagge machen Besuche. Wenn Sie glauben, dass der Benutzer eine Quelle aus- und wieder einschalten wird, möchten Sie sie möglicherweise nicht von Grund auf neu laden und neu laden. Sie können show einfach auf false setzen, während es ausgeschaltet ist, und es wird viel schneller wieder anschalten. Es wird weiterhin Speicher verbrauchen, aber das ist keine große Sache, es sei denn, es ist ein halbes Gigabyte Daten oder mehr. Es wird die CPU oder GPU nicht unnötigerweise steuern, wenn Show falsch ist.

+0

Danke, genagelt! Ich stimme dem Laden/Entladen von Grund auf zu. An diesem Punkt versuche ich nur einige grundlegende Funktionen zu bekommen. Danke noch einmal! – fiveclubs

Verwandte Themen