示例#1
0
 public override void Dispose()
 {
     if (m_terrainTileService != null) {
         m_terrainTileService.Dispose();
         m_terrainTileService = null;
     }
 }
示例#2
0
 public override void Dispose()
 {
     if (m_terrainTileService != null)
     {
         m_terrainTileService.Dispose();
         m_terrainTileService = null;
     }
 }
示例#3
0
 public override void Dispose()
 {
     if (this.m_terrainTileService != null)
     {
         this.m_terrainTileService.Dispose();
         this.m_terrainTileService = null;
     }
 }
 /// <summary>
 /// Initializes a new instance of the <see cref= "T:WorldWind.Terrain.TerrainDownloadRequest"/> class.
 /// </summary>
 /// <param name="tile"></param>
 /// <param name="owner"></param>
 /// <param name="row"></param>
 /// <param name="col"></param>
 /// <param name="targetLevel"></param>
 public TerrainDownloadRequest(TerrainTile tile, TerrainTileService owner, int row, int col, int targetLevel) : base(owner)
 {
     TerrainTile  = tile;
     download.Url = String.Format(CultureInfo.InvariantCulture,
                                  "{0}?T={1}&L={2}&X={3}&Y={4}",
                                  owner.ServerUrl,
                                  owner.DataSet,
                                  targetLevel, col, row);
 }
示例#5
0
 /// <summary>
 /// Initializes a new instance of the <see cref= "T:WorldWind.Terrain.NltTerrainAccessor"/> class.
 /// </summary>
 /// <param name="name"></param>
 /// <param name="west"></param>
 /// <param name="south"></param>
 /// <param name="east"></param>
 /// <param name="north"></param>
 /// <param name="terrainTileService"></param>
 /// <param name="higherResolutionSubsets"></param>
 public NltTerrainAccessor(string name, double west, double south, double east, double north, TerrainTileService terrainTileService, TerrainAccessor[] higherResolutionSubsets)
 {
     m_name = name;
     m_west = west;
     m_south = south;
     m_east = east;
     m_north = north;
     m_terrainTileService = terrainTileService;
     m_higherResolutionSubsets = higherResolutionSubsets;
 }
示例#6
0
 /// <summary>
 /// Initializes a new instance of the <see cref= "T:WorldWind.Terrain.NltTerrainAccessor"/> class.
 /// </summary>
 /// <param name="name"></param>
 /// <param name="west"></param>
 /// <param name="south"></param>
 /// <param name="east"></param>
 /// <param name="north"></param>
 /// <param name="terrainTileService"></param>
 /// <param name="higherResolutionSubsets"></param>
 public NltTerrainAccessor(string name, double west, double south, double east, double north, TerrainTileService terrainTileService, TerrainAccessor[] higherResolutionSubsets)
 {
     m_name  = name;
     m_west  = west;
     m_south = south;
     m_east  = east;
     m_north = north;
     m_terrainTileService      = terrainTileService;
     m_higherResolutionSubsets = higherResolutionSubsets;
 }
示例#7
0
 /// <summary>
 /// Get fast terrain elevation at specified location from already loaded data.
 /// Will not trigger any download or data loading from files in cache - just memory.
 /// </summary>
 /// <param name="latitude">Latitude in decimal degrees.</param>
 /// <param name="longitude">Longitude in decimal degrees.</param>
 /// <returns>Returns NaN if no tile is available in cache.</returns>
 public override float GetCachedElevationAt(double latitude, double longitude)
 {
     try
     {
         if (m_terrainTileService == null)
         {
             return(0);
         }
         // Use higher res subset if any
         if (m_higherResolutionSubsets != null)
         {
             foreach (TerrainAccessor higherResSub in m_higherResolutionSubsets)
             {
                 if (!higherResSub.IsOn)
                 {
                     continue;
                 }
                 if (latitude > higherResSub.South && latitude < higherResSub.North &&
                     longitude > higherResSub.West && longitude < higherResSub.East)
                 {
                     return(higherResSub.GetCachedElevationAt(latitude, longitude));
                 }
             }
         }
         // Look for a tile starting from higher res level, moving down the levels
         TerrainTileCacheEntry ttce = null;
         for (int targetLevel = m_terrainTileService.NumberLevels - 1; targetLevel >= 0; targetLevel--)
         {
             // File name and path for that level
             double tileSize            = m_terrainTileService.LevelZeroTileSizeDegrees * Math.Pow(0.5, targetLevel);
             int    row                 = TerrainTileService.GetRowFromLatitude(latitude, tileSize);
             int    col                 = TerrainTileService.GetColFromLongitude(longitude, tileSize);
             string terrainTileFilePath = string.Format(CultureInfo.InvariantCulture,
                                                        @"{0}\{4}\{1:D4}\{1:D4}_{2:D4}.{3}",
                                                        m_terrainTileService.TerrainTileDirectory, row, col, m_terrainTileService.FileExtension, targetLevel);
             // Look in cache
             ttce = (TerrainTileCacheEntry)m_tileCache[terrainTileFilePath];
             if (ttce != null)
             {
                 // Tile found, get elevation from it
                 ttce.LastAccess = DateTime.Now;
                 return(ttce.TerrainTile.GetElevationAt(latitude, longitude));
             }
         }
     }
     catch (Exception)
     {
     }
     // No tile found - sorry.
     return(float.NaN);
 }
示例#8
0
 public TerrainTile(TerrainTileService owner)
 {
     this.m_owner = owner;
 }
        /*
        private static void addWater(XPathNodeIterator iter, World parentWorld, RenderableObjectList parentRenderable)
        {
            if (iter.Count > 0)
            {
                while (iter.MoveNext())
                {
                    string name = getInnerTextFromFirstChild(iter.Current.Select("Name"));
                    bool isBumpMapped = getInnerTextFromFirstChild(iter.Current.Select("EffectType")).Equals("Bump");
                    float lat = Convert.ToSingle(getInnerTextFromFirstChild(iter.Current.Select("Latitude")));
                    float lon = Convert.ToSingle(getInnerTextFromFirstChild(iter.Current.Select("Longitude")));
                    float alt = Convert.ToSingle(getInnerTextFromFirstChild(iter.Current.Select("DistanceAboveSurface")));
                    float scaleFactor = Convert.ToSingle(getInnerTextFromFirstChild(iter.Current.Select("ScaleFactor")));
                    /*
                    float rotX = Convert.ToSingle(getInnerTextFromFirstChild(iter.Current.SelectSingleNode("Orientation")
                        .Select("RotationX")));
                    float rotY = Convert.ToSingle(getInnerTextFromFirstChild(iter.Current.SelectSingleNode("Orientation")
                        .Select("RotationY")));
                    float rotZ = Convert.ToSingle(getInnerTextFromFirstChild(iter.Current.SelectSingleNode("Orientation")
                        .Select("RotationZ")));
                    */
	    /*
                    Water waterbody = new Water(name, parentWorld,isBumpMapped,lat,lon,alt,scaleFactor);
                    parentRenderable.Add(waterbody);
                }
            }
        }
        */ 

		private static TerrainAccessor[] getTerrainAccessorsFromXPathNodeIterator(XPathNodeIterator iter, string cacheDirectory)
		{
			System.Collections.ArrayList terrainAccessorList = new System.Collections.ArrayList();

			while(iter.MoveNext())
			{
				string terrainAccessorName = iter.Current.GetAttribute("Name", "");
				if(terrainAccessorName == null)
				{
					// TODO: Throw exception?
					continue;
				}

				XPathNodeIterator latLonBoxIter = iter.Current.Select("LatLonBoundingBox");
				if(latLonBoxIter.Count != 1)
				{
					// TODO: Throw exception?
					continue;
				}
				
				double north = 0;
				double south = 0;
				double west = 0;
				double east = 0;

				latLonBoxIter.MoveNext();

				north = ParseDouble(getInnerTextFromFirstChild(latLonBoxIter.Current.Select("North")));
				south = ParseDouble(getInnerTextFromFirstChild(latLonBoxIter.Current.Select("South")));
				west = ParseDouble(getInnerTextFromFirstChild(latLonBoxIter.Current.Select("West")));
				east = ParseDouble(getInnerTextFromFirstChild(latLonBoxIter.Current.Select("East")));
				

				TerrainAccessor[] higerResolutionSubsets = getTerrainAccessorsFromXPathNodeIterator(
					iter.Current.Select("HigherResolutionSubsets"),
					Path.Combine(cacheDirectory, terrainAccessorName));

				XPathNodeIterator tileServiceIter = iter.Current.Select("TerrainTileService");
				if(tileServiceIter.Count == 1)
				{
					string serverUrl = null;
					string dataSetName = null;
					double levelZeroTileSizeDegrees = double.NaN;
					uint numberLevels = 0;
					uint samplesPerTile = 0;
					string dataFormat = null;
					string fileExtension = null;
					string compressionType = null;

					tileServiceIter.MoveNext();
					
					serverUrl = getInnerTextFromFirstChild(tileServiceIter.Current.Select("ServerUrl"));
					dataSetName = getInnerTextFromFirstChild(tileServiceIter.Current.Select("DataSetName"));
					levelZeroTileSizeDegrees = ParseDouble(getInnerTextFromFirstChild(tileServiceIter.Current.Select("LevelZeroTileSizeDegrees")));
					numberLevels = uint.Parse(getInnerTextFromFirstChild(tileServiceIter.Current.Select("NumberLevels")));
					samplesPerTile = uint.Parse(getInnerTextFromFirstChild(tileServiceIter.Current.Select("SamplesPerTile")));
					dataFormat = getInnerTextFromFirstChild(tileServiceIter.Current.Select("DataFormat"));
					fileExtension = getInnerTextFromFirstChild(tileServiceIter.Current.Select("FileExtension"));
					compressionType = getInnerTextFromFirstChild(tileServiceIter.Current.Select("CompressonType"));

					TerrainTileService tts = new TerrainTileService(
						serverUrl,
						dataSetName,
						levelZeroTileSizeDegrees,
						(int)samplesPerTile,
						fileExtension,
						(int)numberLevels,
						Path.Combine(cacheDirectory, terrainAccessorName),
						World.Settings.TerrainTileRetryInterval,
						dataFormat);

					TerrainAccessor newTerrainAccessor = new NltTerrainAccessor(
						terrainAccessorName,
						west,
						south,
						east,
						north,
						tts,
						higerResolutionSubsets);

					terrainAccessorList.Add(newTerrainAccessor);
				}
				//TODO: Add Floating point terrain Accessor code
				//TODO: Add WMSAccessor code and make it work in TerrainAccessor (which it currently doesn't)
			}

			if(terrainAccessorList.Count > 0)
			{
				return (TerrainAccessor[])terrainAccessorList.ToArray(typeof(TerrainAccessor));
			}
			else
			{
				return null;
			}
		}
示例#10
0
 internal TerrainTile(TerrainTileService owner)
 {
     m_owner = owner;
 }
示例#11
0
		public TerrainTile( TerrainTileService owner )
		{
			m_owner = owner;
		}
示例#12
0
 /// <summary>
 /// Initializes a new instance of the <see cref= "T:WorldWind.Terrain.TerrainDownloadRequest"/> class.
 /// </summary>
 /// <param name="tile"></param>
 /// <param name="owner"></param>
 /// <param name="row"></param>
 /// <param name="col"></param>
 /// <param name="targetLevel"></param>
 public TerrainDownloadRequest(TerrainTile tile, TerrainTileService owner, int row, int col, int targetLevel)
     : base(owner)
 {
     TerrainTile = tile;
     download.Url = String.Format(CultureInfo.InvariantCulture, "{0}?T={1}&L={2}&X={3}&Y={4}", owner.ServerUrl, owner.DataSet, targetLevel, col, row);
 }