public static Tile GetNewTile(IImageSet imageset, int level, int x, int y, Tile parent) { switch (imageset.Projection) { case ProjectionType.Mercator: { MercatorTile newTile = new MercatorTile(level, x, y, imageset, parent); return(newTile); } case ProjectionType.Equirectangular: { return(new EquirectangularTile(level, x, y, imageset, parent)); } case ProjectionType.Spherical: { return(new SphericalTile(level, x, y, imageset, parent)); } case ProjectionType.Toast: { return(new ToastTile(level, x, y, imageset, parent)); } case ProjectionType.SkyImage: { return(new SkyImageTile(level, x, y, imageset, parent)); } case ProjectionType.Plotted: { return(new PlotTile(level, x, y, imageset, parent)); } default: case ProjectionType.Tangent: { TangentTile newTile = new TangentTile(level, x, y, imageset, parent); return(newTile); } } }
protected void ComputeBoundingSphere(MercatorTile parent, double altitude) { var tileDegrees = 360 / (Math.Pow(2, level)); latMin = AbsoluteMetersToLatAtZoom(y * 256, level); latMax = AbsoluteMetersToLatAtZoom((y + 1) * 256, level); lngMin = ((x * tileDegrees) - 180.0); lngMax = (((x + 1) * tileDegrees) - 180.0); var latCenter = AbsoluteMetersToLatAtZoom(((y * 2) + 1) * 256, level + 1); var lngCenter = (lngMin + lngMax) / 2.0; if (level == 12 || level == 17 ) { localCenter = Coordinates.GeoTo3dDouble(latCenter, lngCenter); } else if (level > 12) { localCenter = parent.localCenter; } demIndex = 0; if (parent != null && parent.DemData != null) { sphereCenter = GeoTo3dWithAltitude(latCenter, lngCenter, parent.GetAltitudeAtLatLng(latCenter, lngCenter, 1), false); TopLeft = GeoTo3dWithAltitude(latMin, lngMin, parent.GetAltitudeAtLatLng(latMin, lngMin, 1), false); BottomRight = GeoTo3dWithAltitude(latMax, lngMax, parent.GetAltitudeAtLatLng(latMax, lngMax, 1), false); TopRight = GeoTo3dWithAltitude(latMin, lngMax, parent.GetAltitudeAtLatLng(latMin, lngMax, 1), false); BottomLeft = GeoTo3dWithAltitude(latMax, lngMin, parent.GetAltitudeAtLatLng(latMax, lngMin, 1), false); } else { sphereCenter = GeoTo3dWithAltitude(latCenter, lngCenter, altitude, false); TopLeft = GeoTo3dWithAltitude(latMin, lngMin, altitude, false); BottomRight = GeoTo3dWithAltitude(latMax, lngMax, altitude, false); TopRight = GeoTo3dWithAltitude(latMin, lngMax, altitude, false); BottomLeft = GeoTo3dWithAltitude(latMax, lngMin, altitude, false); } center = sphereCenter; if (Y == 0) { TopLeft = new Vector3d(0, 1, 0); TopRight = new Vector3d(0, 1, 0); } if (Y == Math.Pow(2, level) - 1) { BottomRight = new Vector3d(0, -1, 0); BottomLeft = new Vector3d(0, -1, 0); } var distVect1 = TopLeft; distVect1.Subtract(sphereCenter); var distVect2 = BottomRight; distVect2.Subtract(sphereCenter); var distVect3 = TopRight; distVect3.Subtract(sphereCenter); var distVect4 = BottomLeft; distVect4.Subtract(sphereCenter); sphereRadius = Math.Max(Math.Max(distVect1.Length(),distVect2.Length()),Math.Max(distVect3.Length(),distVect4.Length())); tileDegrees = lngMax - lngMin; // if (level > 14) { // this.sphereCenter.Add(localCenter); } }
public static Tile GetNewTile(IImageSet imageset, int level, int x, int y, Tile parent) { switch (imageset.Projection) { case ProjectionType.Mercator: { var newTile = new MercatorTile(level, x, y, imageset, parent); return newTile; } case ProjectionType.Equirectangular: { return new EquirectangularTile(level, x, y, imageset, parent); } case ProjectionType.Spherical: { return new SphericalTile(level, x, y, imageset, parent); } case ProjectionType.Toast: { return new ToastTile(level, x, y, imageset, parent); } case ProjectionType.SkyImage: { return new SkyImageTile(level, x, y, imageset, parent); } case ProjectionType.Plotted: { return new PlotTile(level, x, y, imageset, parent); } default: case ProjectionType.Tangent: { var newTile = new TangentTile(level, x, y, imageset, parent); return newTile; } } }
public override bool CreateDemFromParent() { MercatorTile parent = Parent as MercatorTile; if (parent == null || parent.DemData == null) { return(false); } DemGeneration = parent.DemGeneration + 1; if (DemGeneration < 4 && parent.isHdTile) { if (MakeDemFromHDParent()) { return(true); } } int offsetX = ((X % 2) == 1 ? 16:0); int offsetY = ((Y % 2) == 1 ? 16:0); DemData = new double[demSize]; // Interpolate accross for (int y = 0; y < 33; y += 2) { bool copy = true; for (int x = 0; x < 33; x++) { if (copy) { DemData[(32 - y) * 33 + x] = parent.GetDemSample((x / 2) + offsetX, (y / 2) + offsetY); } else { DemData[(32 - y) * 33 + x] = ( ( parent.GetDemSample((x / 2) + offsetX, (y / 2) + offsetY) + parent.GetDemSample(((x / 2) + offsetX) + 1, (y / 2) + offsetY) ) / 2); } copy = !copy; } } // Interpolate down for (int y = 1; y < 33; y += 2) { for (int x = 0; x < 33; x++) { DemData[(32 - y) * 33 + x] = ( ( GetDemSample(x, y - 1) + GetDemSample(x, y + 1) ) / 2); } } foreach (double sample in DemData) { demAverage += sample; } demAverage /= DemData.Length; DemReady = true; return(true); }
protected void ComputeBoundingSphere(MercatorTile parent, double altitude) { double tileDegrees = 360 / (Math.Pow(2, this.level)); latMin = AbsoluteMetersToLatAtZoom(y * 256, level); latMax = AbsoluteMetersToLatAtZoom((y + 1) * 256, level); lngMin = (((double)this.x * tileDegrees) - 180.0); lngMax = ((((double)(this.x + 1)) * tileDegrees) - 180.0); double latCenter = AbsoluteMetersToLatAtZoom(((y * 2) + 1) * 256, level + 1); double lngCenter = (lngMin + lngMax) / 2.0; if (level == 12 || level == 17) { localCenter = Coordinates.GeoTo3dDouble(latCenter, lngCenter); } else if (level > 12) { localCenter = parent.localCenter; } demIndex = 0; if (parent != null && parent.DemData != null) { this.sphereCenter = GeoTo3dWithAltitude(latCenter, lngCenter, parent.GetAltitudeAtLatLng(latCenter, lngCenter, 1), false); TopLeft = GeoTo3dWithAltitude(latMin, lngMin, parent.GetAltitudeAtLatLng(latMin, lngMin, 1), false); BottomRight = GeoTo3dWithAltitude(latMax, lngMax, parent.GetAltitudeAtLatLng(latMax, lngMax, 1), false); TopRight = GeoTo3dWithAltitude(latMin, lngMax, parent.GetAltitudeAtLatLng(latMin, lngMax, 1), false); BottomLeft = GeoTo3dWithAltitude(latMax, lngMin, parent.GetAltitudeAtLatLng(latMax, lngMin, 1), false); } else { this.sphereCenter = GeoTo3dWithAltitude(latCenter, lngCenter, altitude, false); TopLeft = GeoTo3dWithAltitude(latMin, lngMin, altitude, false); BottomRight = GeoTo3dWithAltitude(latMax, lngMax, altitude, false); TopRight = GeoTo3dWithAltitude(latMin, lngMax, altitude, false); BottomLeft = GeoTo3dWithAltitude(latMax, lngMin, altitude, false); } center = sphereCenter; if (Y == 0) { TopLeft = new Vector3d(0, 1, 0); TopRight = new Vector3d(0, 1, 0); } if (Y == Math.Pow(2, level) - 1) { BottomRight = new Vector3d(0, -1, 0); BottomLeft = new Vector3d(0, -1, 0); } Vector3d distVect1 = TopLeft; distVect1.Subtract(sphereCenter); Vector3d distVect2 = BottomRight; distVect2.Subtract(sphereCenter); Vector3d distVect3 = TopRight; distVect3.Subtract(sphereCenter); Vector3d distVect4 = BottomLeft; distVect4.Subtract(sphereCenter); this.sphereRadius = Math.Max(Math.Max(distVect1.Length(), distVect2.Length()), Math.Max(distVect3.Length(), distVect4.Length())); tileDegrees = lngMax - lngMin; // if (level > 14) { // this.sphereCenter.Add(localCenter); } }