Пример #1
0
        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);
        }
Пример #2
0
        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();
        }