public bool IsEqual(GeoportailLayer layer, int row, int col, GeoportailLayerLevel level) { bool retVal = false; if(this.layer == layer && this.row == row && this.col == col && this.level == level) { retVal = true; } return retVal; }
public GeoTile(GeoportailLayer layer, ArrayList layerComponents, int row, int col, GeoportailLayerLevel level) { this.layer = layer; this.layerComponents = layerComponents; this.row = row; this.col = col; this.level = level; }
private void AddGeoTile(DrawArgs drawArgs, GeoportailLayer layer, int row, int col, GeoportailLayerLevel zoomLevel) { ArrayList geoTiles = layer.GeoTiles; bool tileFound = false; lock(geoTiles.SyncRoot) { foreach(GeoTile geoTile in geoTiles) { if(geoTile.IsNeeded == true) { continue; //we don't want to do the next test } if(geoTile.IsEqual(layer,row, col, zoomLevel) == true) { geoTile.IsNeeded = true; tileFound = true; break; } } } if(tileFound == false) { //exit if zoom level has changed double arcDistance = drawArgs.WorldCamera.TrueViewRange.Radians * EarthRadius; double scale = Scale(arcDistance); GeoportailLayerLevel curZoomLevel = layer.GetLevelByArcDistance(arcDistance); if(curZoomLevel != zoomLevel) { return; } //Calculate the extent of the current tile so we can know if it intersects any components of the layer double xTL = col * zoomLevel.WorldPerTile.U + layer.LayerExtent.TopLeftUV.U; double yTL = layer.LayerExtent.TopLeftUV.V - (row * zoomLevel.WorldPerTile.V); double xBR = xTL + zoomLevel.WorldPerTile.U; double yBR = yTL - zoomLevel.WorldPerTile.V; Extent extent = new Extent(xTL,yTL,xBR,yBR); ArrayList components = layer.FindComponentsForScaleAndExtent(scale,extent); if(components.Count == 0) return; GeoTile newGeoTile = new GeoTile(layer, components, row, col, zoomLevel); //thread to download new tile(s) or just load from cache newGeoTile.GetTexture(drawArgs); newGeoTile.UL = new UV(xTL,yTL); newGeoTile.UR = new UV(xBR,yTL); newGeoTile.LL = new UV(xTL,yBR); newGeoTile.LR = new UV(xBR,yBR); //create mesh byte opacity = this.Opacity; //from RenderableObject float verticalExaggeration = World.Settings.VerticalExaggeration; newGeoTile.CreateMesh(opacity, verticalExaggeration); newGeoTile.CreateDownloadRectangle(drawArgs, World.Settings.DownloadProgressColor.ToArgb()); newGeoTile.IsNeeded = true; lock(geoTiles.SyncRoot) { geoTiles.Add(newGeoTile); } } }
private void AddNeighborTiles(DrawArgs drawArgs, GeoportailLayer layer, int row, int col, GeoportailLayerLevel zoomLevel, int range) { int minRow = row - range; int maxRow = row + range; int minCol = col - range; int maxCol = col + range; for(int i=minRow; i<=maxRow; i++) { for(int j=minCol; j<=maxCol; j++) { //only outer edges, inner tiles should already be added if(i == minRow || i == maxRow || j == minCol || j == maxCol) { AddGeoTile(drawArgs, layer, i, j, zoomLevel); } } } }
public void ForceRefresh() { PrevRow = -1; PrevCol = -1; PrevLevel = null; }