private Renderable.ImageLayer CreateImageLayer(double north, double south, double west, double east, DrawArgs drawArgs, string imagePath) { Bitmap b = null; Graphics g = null; Renderable.ImageLayer imageLayer = null; GeographicBoundingBox geoBB = new GeographicBoundingBox(north, south, west, east); int numberPolygonsInTile = 0; FileInfo imageFile = new FileInfo(imagePath); if (!m_parentProjectedLayer.EnableCaching || !imageFile.Exists ) { if (m_parentProjectedLayer.LineStrings != null) { for (int i = 0; i < m_parentProjectedLayer.LineStrings.Length; i++) { if (!m_parentProjectedLayer.LineStrings[i].Visible) { continue; } GeographicBoundingBox currentBoundingBox = m_parentProjectedLayer.LineStrings[i].GetGeographicBoundingBox(); if (currentBoundingBox != null && !currentBoundingBox.Intersects(geoBB)) { continue; } else { if (b == null) { b = new Bitmap( m_parentProjectedLayer.TileSize.Width, m_parentProjectedLayer.TileSize.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); } if (g == null) { g = Graphics.FromImage(b); } drawLineString( m_parentProjectedLayer.LineStrings[i], g, geoBB, b.Size ); numberPolygonsInTile++; } } } if (m_parentProjectedLayer.Polygons != null) { for (int i = 0; i < m_parentProjectedLayer.Polygons.Length; i++) { if (!m_parentProjectedLayer.Polygons[i].Visible) { continue; } GeographicBoundingBox currentBoundingBox = m_parentProjectedLayer.Polygons[i].GetGeographicBoundingBox(); if (currentBoundingBox != null && !currentBoundingBox.Intersects(geoBB)) { continue; } else { if (b == null) { b = new Bitmap( m_parentProjectedLayer.TileSize.Width, m_parentProjectedLayer.TileSize.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); } if (g == null) { g = Graphics.FromImage(b); } drawPolygon( m_parentProjectedLayer.Polygons[i], g, geoBB, b.Size); numberPolygonsInTile++; } } } } if (b != null) { System.Drawing.Imaging.BitmapData srcInfo = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); bool isBlank = true; unsafe { int *srcPointer = (int *)srcInfo.Scan0; for (int i = 0; i < b.Height; i++) { for (int j = 0; j < b.Width; j++) { int color = *srcPointer++; if (((color >> 24) & 0xff) > 0) { isBlank = false; break; } } srcPointer += (srcInfo.Stride >> 2) - b.Width; } } b.UnlockBits(srcInfo); if (isBlank) { numberPolygonsInTile = 0; } } // if(!m_parentProjectedLayer.EnableCaching) // { string id = System.DateTime.Now.Ticks.ToString(); if (b != null && numberPolygonsInTile > 0) { MemoryStream ms = new MemoryStream(); b.Save(ms, System.Drawing.Imaging.ImageFormat.Png); //must copy original stream into new stream, if not, error occurs, not sure why m_ImageStream = new MemoryStream(ms.GetBuffer()); imageLayer = new MFW3D.Renderable.ImageLayer( id, m_parentProjectedLayer.World, 0, m_ImageStream, System.Drawing.Color.Black.ToArgb(), (float)south, (float)north, (float)west, (float)east, 1.0f //(float)m_parentProjectedLayer.Opacity / 255.0f , m_parentProjectedLayer.World.TerrainAccessor); ms.Close(); } /* } * else if(imageFile.Exists || numberPolygonsInTile > 0) * { * string id = System.DateTime.Now.Ticks.ToString(); * * if(b != null) * { * MemoryStream ms = new MemoryStream(); * b.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); * if(!imageFile.Directory.Exists) * imageFile.Directory.Create(); * * //must copy original stream into new stream, if not, error occurs, not sure why * m_ImageStream = new MemoryStream(ms.GetBuffer()); * ImageHelper.ConvertToDxt3(m_ImageStream, imageFile.FullName); * * ms.Close(); * } * * imageLayer = new WorldWind.Renderable.ImageLayer( * id, * m_parentProjectedLayer.World, * 0, * imageFile.FullName, * //System.Drawing.Color.Black.ToArgb(), * (float)south, * (float)north, * (float)west, * (float)east, * 1.0f,//(float)m_parentProjectedLayer.Opacity / 255.0f, * m_parentProjectedLayer.World.TerrainAccessor); * * imageLayer.TransparentColor = System.Drawing.Color.Black.ToArgb(); * } */ if (b != null) { b.Dispose(); } if (g != null) { g.Dispose(); } b = null; g = null; //might not be necessary //GC.Collect(); return(imageLayer); }
public BMNG(MFW3D.WorldWindow worldWindow) { // // Required for Windows Form Designer support // InitializeComponent(); int lastSelectedDatasetIndex = 1; try { using (StreamReader reader = new StreamReader(Path.GetDirectoryName(Application.ExecutablePath) + "\\Plugins\\BlueMarble\\settings.txt")) { lastSelectedDatasetIndex = MFW3D.World.Settings.BmngVersion; } } catch { } comboBoxBmngVersion.SelectedIndex = lastSelectedDatasetIndex; m_WorldWindow = worldWindow; m_RenderableList.ShowOnlyOneLayer = true; bool foundImagesObject = false; lock (m_WorldWindow.CurrentWorld.RenderableObjects.ChildObjects.SyncRoot) { foreach (MFW3D.Renderable.RenderableObject ro in m_WorldWindow.CurrentWorld.RenderableObjects.ChildObjects) { if (ro is MFW3D.Renderable.RenderableObjectList && (ro.Name == "Images")) // SF FIX: don't add to layers called 'xxxx images'! { MFW3D.Renderable.RenderableObjectList imagesList = ro as MFW3D.Renderable.RenderableObjectList; imagesList.ChildObjects.Insert(0, m_RenderableList); foundImagesObject = true; break; } } } if (!foundImagesObject) { m_WorldWindow.CurrentWorld.RenderableObjects.Add(m_RenderableList); } m_BlueMarbleBase = new MFW3D.Renderable.ImageLayer( "Blue Marble Base Image", m_WorldWindow.CurrentWorld, 0, null, -90, 90, -180, 180, 1.0f, null); m_BlueMarbleBase.ImageUrl = "http://worldwind.arc.nasa.gov/downloads/land_shallow_topo_2048.dds"; MFW3D.ImageStore ia = new MFW3D.NltImageStore("106", "http://nww.terraserver-usa.com/nwwtile.ashx"); ia.DataDirectory = null; ia.LevelZeroTileSizeDegrees = 36.0; ia.LevelZeroTileSizeDegrees = 4; ia.ImageExtension = "jpg"; ia.CacheDirectory = String.Format("{0}\\Blue Marble", m_WorldWindow.Cache.CacheDirectory); MFW3D.ImageStore[] ias = new MFW3D.ImageStore[1]; ias[0] = ia; m_BlueMarbleTiled = new MFW3D.Renderable.QuadTileSet( "Blue Marble Tiled", m_WorldWindow.CurrentWorld, 0, 90, -90, -180, 180, true, ias ); m_BlueMarbleTiled.ServerLogoFilePath = Path.GetDirectoryName(Application.ExecutablePath) + "\\Data\\Icons\\Interface\\meatball.png"; m_BlueMarbleList = new MFW3D.Renderable.RenderableObjectList("Blue Marble"); m_BlueMarbleList.IsOn = false; m_BlueMarbleList.Add(m_BlueMarbleBase); m_BlueMarbleList.Add(m_BlueMarbleTiled); m_ShadedList = new MFW3D.Renderable.RenderableObjectList("BMNG"); m_ShadedList.ShowOnlyOneLayer = true; m_ShadedList.IsOn = false; for (int i = 0; i < 12; i++) { m_ImageLayers[0, i] = new MFW3D.Renderable.ImageLayer( String.Format("Base Image - {0}.2004", i + 1), m_WorldWindow.CurrentWorld, 0, null, -90, 90, -180, 180, 1.0f, null); m_ImageLayers[0, i].ImageUrl = String.Format("{0}world.topo.2004{1:D2}.jpg", m_BmngBaseImageUrl, i + 1); MFW3D.NltImageStore imageStore = new MFW3D.NltImageStore(String.Format("bmng.topo.2004{0:D2}", i + 1), "http://worldwind25.arc.nasa.gov/tile/tile.aspx"); imageStore.DataDirectory = null; imageStore.LevelZeroTileSizeDegrees = 36.0; imageStore.LevelCount = 5; imageStore.ImageExtension = "jpg"; imageStore.CacheDirectory = String.Format("{0}\\BMNG\\{1}", m_WorldWindow.Cache.CacheDirectory, String.Format("BMNG (Shaded) Tiled - {0}.2004", i + 1)); ias = new MFW3D.ImageStore[1]; ias[0] = imageStore; m_QuadTileLayers[0, i] = new MFW3D.Renderable.QuadTileSet( String.Format("Tiled - {0}.2004", i + 1), m_WorldWindow.CurrentWorld, 0, 90, -90, -180, 180, true, ias); m_QuadTileLayers[0, i].ServerLogoFilePath = Path.GetDirectoryName(Application.ExecutablePath) + "\\Data\\Icons\\Interface\\meatball.png"; m_RenderableLayers[0, i] = new MFW3D.Renderable.RenderableObjectList(String.Format("{0}.2004", i + 1)); m_RenderableLayers[0, i].IsOn = false; m_RenderableLayers[0, i].Add(m_ImageLayers[0, i]); m_RenderableLayers[0, i].Add(m_QuadTileLayers[0, i]); m_ShadedList.Add(m_RenderableLayers[0, i]); } m_ShadedBathyList = new MFW3D.Renderable.RenderableObjectList("BMNG (Bathymetry)"); m_ShadedBathyList.ShowOnlyOneLayer = true; m_ShadedBathyList.IsOn = false; for (int i = 0; i < 12; i++) { m_ImageLayers[1, i] = new MFW3D.Renderable.ImageLayer( String.Format("Base Image - {0}.2004", i + 1), m_WorldWindow.CurrentWorld, 0, String.Format("{0}\\Data\\Earth\\BmngBathy\\world.topo.bathy.2004{1:D2}.jpg", Path.GetDirectoryName(Application.ExecutablePath), i + 1), -90, 90, -180, 180, 1.0f, null); // m_ImageLayers[1, i].ImageUrl = String.Format("{0}world.topo.bathy.2004{1:D2}.jpg", m_BmngBaseImageUrl, i+1); MFW3D.NltImageStore imageStore = new MFW3D.NltImageStore(String.Format("bmng.topo.bathy.2004{0:D2}", i + 1), "http://worldwind25.arc.nasa.gov/tile/tile.aspx"); imageStore.DataDirectory = null; imageStore.LevelZeroTileSizeDegrees = 36.0; imageStore.LevelCount = 5; imageStore.ImageExtension = "jpg"; imageStore.CacheDirectory = String.Format("{0}\\BMNG\\{1}", m_WorldWindow.Cache.CacheDirectory, String.Format("BMNG (Shaded + Bathymetry) Tiled - {0}.2004", i + 1)); ias = new MFW3D.ImageStore[1]; ias[0] = imageStore; m_QuadTileLayers[1, i] = new MFW3D.Renderable.QuadTileSet( String.Format("Tiled - {0}.2004", i + 1), m_WorldWindow.CurrentWorld, 0, 90, -90, -180, 180, true, ias); m_QuadTileLayers[0, i].ServerLogoFilePath = Path.GetDirectoryName(Application.ExecutablePath) + "\\Data\\Icons\\Interface\\meatball.png"; m_RenderableLayers[1, i] = new MFW3D.Renderable.RenderableObjectList(String.Format("{0}.2004", i + 1)); m_RenderableLayers[1, i].IsOn = false; m_RenderableLayers[1, i].Add(m_ImageLayers[1, i]); m_RenderableLayers[1, i].Add(m_QuadTileLayers[1, i]); m_ShadedBathyList.Add(m_RenderableLayers[1, i]); } /* m_UnShadedList = new WorldWind.Renderable.RenderableObjectList("BMNG (UnShaded)"); * m_UnShadedList.ShowOnlyOneLayer = true; * m_UnShadedList.IsOn = false; * * for(int i = 0; i < 12; i++) * { * m_ImageLayers[2, i] = new WorldWind.Renderable.ImageLayer( * String.Format("Base Image - {0}.2004 un", i+1), * m_WorldWindow.CurrentWorld, * 0, * null, * -90, 90, -180, 180, 1.0f, m_WorldWindow.CurrentWorld.TerrainAccessor); * * m_ImageLayers[2, i].ImageUrl = String.Format("{0}world.2004{1:D2}.jpg", m_BmngBaseImageUrl, i+1); * m_ImageLayers[2, i].IsOn = false; * * m_QuadTileLayers[2, i] = new WorldWind.Renderable.QuadTileSet( * String.Format("Tiled - {0}.2004", i+1), * m_WorldWindow.CurrentWorld, * 0, * 90, -90, -180, 180, m_WorldWindow.CurrentWorld.TerrainAccessor, * new WorldWind.ImageAccessor( * null, 512, 36.0, 5, "jpg", * String.Format("{0}\\BMNG\\{1}", m_WorldWindow.Cache.CacheDirectory, String.Format("BMNG (UnShaded) Tiled - {0}.2004", i+1)), * new WorldWind.ImageTileService( * String.Format("bmng.2004{0:D2}", i+1), "http://worldwind28.arc.nasa.gov/TestWebApp/WebForm1.aspx", * Path.GetDirectoryName(Application.ExecutablePath) + "\\Data\\Icons\\Interface\\meatball.png") * )); * * m_RenderableLayers[2, i] = new WorldWind.Renderable.RenderableObjectList(String.Format("{0}.2004", i+1)); * m_RenderableLayers[2, i].IsOn = false; * * m_RenderableLayers[2, i].Add(m_ImageLayers[1, i]); * m_RenderableLayers[2, i].Add(m_QuadTileLayers[1, i]); * m_UnShadedList.Add(m_RenderableLayers[2, i]); * }*/ m_RenderableList.Add(m_BlueMarbleList); m_RenderableList.Add(m_ShadedList); m_RenderableList.Add(m_ShadedBathyList); // m_RenderableList.Add(m_UnShadedList); this.trackBarMonth.Value = System.DateTime.Now.Month - 1; timer = new Timer(); timer.Interval = 1000; timer.Tick += new EventHandler(timer_Tick); timer.Start(); }