Ejemplo n.º 1
0
        private Renderable.ImageLayer CreateImageLayer(double north, double south, double west, double east)
        {
            if (m_parentProjectedLayer.Bounds.Equals(GeographicBoundingBox.NullBox()) || !m_parentProjectedLayer.Bounds.Intersects(new GeographicBoundingBox(north, south, west, east)))
            {
                return null;
            }

            Bitmap b = null;
            Graphics g = null;
            Renderable.ImageLayer result = null;
            GeographicBoundingBox geoBB = new GeographicBoundingBox(north, south, west, east);
            int numberPolygonsInTile = 0;

            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 (g == null)
                        {
                            b = new Bitmap(TileSize, TileSize, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
                            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 (g == null)
                        {
                            b = new Bitmap(TileSize, TileSize, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
                            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 (b != null && numberPolygonsInTile > 0)
            {
                MemoryStream ms = new MemoryStream();
                b.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
                ms.Seek(0, SeekOrigin.Begin);

                result = new WorldWind.Renderable.ImageLayer(String.Format("PVT ImageLayer L{0} R{1} C{2}", Level, Row, Col), m_parentProjectedLayer.World, 0, ms, (float)south, (float)north, (float)west, (float)east, 1.0f, m_parentProjectedLayer.World.TerrainAccessor);

                result.Opacity = this.Opacity;
            }

            if (g != null)
            {
                g.Dispose();
                b.Dispose();
            }

            return result;
        }
Ejemplo n.º 2
0
		private Renderable.ImageLayer CreateImageLayer(double north, double south, double west, double east, DrawArgs drawArgs)
		{
			Bitmap b = null;
			Graphics g = null;
			Renderable.ImageLayer imageLayer = null;
			GeographicBoundingBox geoBB = new GeographicBoundingBox(north, south, west, east);
	
			int numberPolygonsInTile = 0;
			for(int i = 0; i < m_ShapeTileArgs.ShapeRecords.Count; i++)
			{
				ShapeRecord currentRecord = (ShapeRecord)m_ShapeTileArgs.ShapeRecords[i];
				
				if(currentRecord.Null != null || 
					currentRecord.Point != null || 
					currentRecord.MultiPoint != null ||
					!isShapeRecordInBounds(geoBB, currentRecord))
				{
					continue;
				}
				else
				{
					if(b == null)
					{
						b = new Bitmap(m_ShapeTileArgs.TilePixelSize.Width,
							m_ShapeTileArgs.TilePixelSize.Height,
							System.Drawing.Imaging.PixelFormat.Format32bppArgb);
					}

					if(g == null)
					{
						g = Graphics.FromImage(b);
					}

					System.Drawing.Color color = m_ShapeTileArgs.PolygonColor;

					//Fix Black Tiles
					g.DrawLine(new Pen(color),0,0,1,1);
					
					
					if(m_ShapeTileArgs.UseScalar && m_ShapeTileArgs.ScaleColors)
					{
						double red = 1.0;
						double green = 1.0;
						double blue = 1.0;
							
						try
						{
							//TODO: make this a function and abstract to allow multiple gradient mappings
							double dv;

							double curScalar = double.Parse(currentRecord.Value.ToString());

							if (curScalar < m_ShapeTileArgs.ScaleMin)
								curScalar = m_ShapeTileArgs.ScaleMin;
							if (curScalar > m_ShapeTileArgs.ScaleMax)
								curScalar = m_ShapeTileArgs.ScaleMax;
							
							dv = m_ShapeTileArgs.ScaleMax - m_ShapeTileArgs.ScaleMin;

							if (curScalar < (m_ShapeTileArgs.ScaleMin + 0.25 * dv)) 
							{
								red = 0;
								green = 4 * (curScalar - m_ShapeTileArgs.ScaleMin) / dv;
							} 
							else if (curScalar < (m_ShapeTileArgs.ScaleMin + 0.5 * dv)) 
							{
								red = 0;
								blue = 1 + 4 * (m_ShapeTileArgs.ScaleMin + 0.25 * dv - curScalar) / dv;
							} 
							else if (curScalar < (m_ShapeTileArgs.ScaleMin + 0.75 * dv)) 
							{
								red = 4 * (curScalar - m_ShapeTileArgs.ScaleMin - 0.5 * dv) / dv;
								blue = 0;
							} 
							else 
							{
								green = 1 + 4 * (m_ShapeTileArgs.ScaleMin + 0.75 * dv - curScalar) / dv;
								blue = 0;
							}

							color = System.Drawing.Color.FromArgb((int)(255*red), (int)(255*green), (int)(255*blue));
							
						}
						catch(Exception)
						{
						//	Log.Write((string)currentPoly.ScalarHash[m_ShapeTileArgs.ColorKey]);
						//	Log.Write(String.Format("Min: {0}, Max: {1}", m_ShapeTileArgs.ScaleMin, m_ShapeTileArgs.ScaleMax));
						//	Log.Write(String.Format("{0},{1},{2}", red, green, blue));
						//	Log.Write(ex);
						}
					}
					else
					{
						if(m_ShapeTileArgs.ColorAssignments.Count > 0 && m_ShapeTileArgs.ScaleColors)
						{
							try
							{
								string colorAssignmentKey = (string)currentRecord.Value;
								foreach(string cak in m_ShapeTileArgs.ColorAssignments.Keys)
								{
									if(String.Compare(cak, colorAssignmentKey, true) == 0)
									{
										color = (System.Drawing.Color)m_ShapeTileArgs.ColorAssignments[cak];
										break;
									}
								}
							}
							catch(Exception)
							{
							}
						}
					}
					
					if(currentRecord.Polygon != null)
					{
						drawPolygon(currentRecord.Polygon,
							g,
							color,
							geoBB,
							b.Size);
					}
					
					if(m_ShapeTileArgs.ColorAssignments.Count == 0 ||  
						!m_ShapeTileArgs.ScaleColors)
					{
						color = m_ShapeTileArgs.LineColor;
					}

					if(currentRecord.PolyLine != null)
					{
						drawPolyLine(currentRecord.PolyLine,
							g,
							color,
							geoBB,
							b.Size);
					}
					numberPolygonsInTile++;
				}
				
			}
            
			if(numberPolygonsInTile > 0)
			{
				string id = System.DateTime.Now.Ticks.ToString();

				MemoryStream ms = new MemoryStream();
				b.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
				//b.Save("Shapefiles\\imagecache\\"+north+""+south+""+east+""+west+ ".bmp", System.Drawing.Imaging.ImageFormat.Bmp);
				
				//must copy original stream into new stream, if not, error occurs, not sure why
				m_ImageStream = new MemoryStream(ms.GetBuffer());

			//	Texture texture = TextureLoader.FromStream(
			//		drawArgs.device, mss, 0, 0, 1,
			//		Usage.None, World.Settings.TextureFormat, Pool.Managed, Filter.Box, Filter.Box, System.Drawing.Color.Black.ToArgb());

			
				imageLayer = new WorldWind.Renderable.ImageLayer(
					id,
					m_ShapeTileArgs.ParentWorld,
					0,// should be distance above surface
					m_ImageStream,
					System.Drawing.Color.Black.ToArgb(),
					(float)south,
					(float)north,
					(float)west,
					(float)east,
					(float)m_ShapeTileArgs.ParentShapeFileLayer.Opacity / 255.0f,
					m_ShapeTileArgs.ParentWorld.TerrainAccessor);
					
				
				//mss.Close();
				ms.Close();
			}
					
			if(b != null)
			{
				b.Dispose();
			}
			if(g != null)
			{
				g.Dispose();
			}

			b = null;
			g = null;

			//might not be necessary
			//GC.Collect();

			return imageLayer;
		}
Ejemplo n.º 3
0
		/*public byte Opacity
		{
			get
			{
				return m_parentProjectedLayer.Opacity;
			}
			set
			{
				if(m_NwImageLayer != null)
				{
					m_NwImageLayer.Opacity = value;
				}
				if(m_NeImageLayer != null)
				{
					m_NeImageLayer.Opacity = value;
				}
				if(m_SwImageLayer != null)
				{
					m_SwImageLayer.Opacity = value;
				}
				if(m_SeImageLayer != null)
				{
					m_SeImageLayer.Opacity = value;
				}

				if(m_NorthWestChild != null)
				{
					m_NorthWestChild.Opacity = value;
				}
				if(m_NorthEastChild != null)
				{
					m_NorthEastChild.Opacity = value;
				}
				if(m_SouthWestChild != null)
				{
					m_SouthWestChild.Opacity = value;
				}
				if(m_SouthEastChild != null)
				{
					m_SouthEastChild.Opacity = value;
				}
			}
		}*/

		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 WorldWind.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;
		}
Ejemplo n.º 4
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);
            FileInfo shapeFile    = new FileInfo(m_ShapeTileArgs.ParentShapeFileLayer.ShapeFilePath);
            FileInfo shapeXmlFile = null;

            if (m_ShapeTileArgs.ParentShapeFileLayer.MetaData.Contains("SourceXml"))
            {
                string sourceXml = (string)m_ShapeTileArgs.ParentShapeFileLayer.MetaData["SourceXml"];
                if (!sourceXml.ToLower().StartsWith("http://"))
                {
                    shapeXmlFile = new FileInfo(sourceXml);
                }
            }

            if (!m_ShapeTileArgs.ParentShapeFileLayer.EnableCaching ||
                !imageFile.Exists ||
                shapeXmlFile == null ||
                shapeXmlFile.LastWriteTimeUtc > imageFile.LastWriteTimeUtc ||
                shapeFile.LastWriteTimeUtc > imageFile.LastWriteTimeUtc
                )
            {
                for (int i = 0; i < m_ShapeTileArgs.ShapeRecords.Count; i++)
                {
                    ShapeRecord currentRecord = (ShapeRecord)m_ShapeTileArgs.ShapeRecords[i];

                    if (currentRecord.Null != null ||
                        currentRecord.Point != null ||
                        currentRecord.MultiPoint != null ||
                        !isShapeRecordInBounds(geoBB, currentRecord))
                    {
                        continue;
                    }
                    else
                    {
                        if (b == null)
                        {
                            b = new Bitmap(m_ShapeTileArgs.TilePixelSize.Width,
                                           m_ShapeTileArgs.TilePixelSize.Height,
                                           System.Drawing.Imaging.PixelFormat.Format32bppArgb);
                        }

                        if (g == null)
                        {
                            g = Graphics.FromImage(b);
                        }

                        System.Drawing.Color color = m_ShapeTileArgs.PolygonColor;

                        //Fix Black Tiles
                        g.DrawLine(new Pen(color), 0, 0, 1, 1);


                        if (m_ShapeTileArgs.UseScalar && m_ShapeTileArgs.ScaleColors)
                        {
                            double red   = 1.0;
                            double green = 1.0;
                            double blue  = 1.0;

                            try
                            {
                                //TODO: make this a function and abstract to allow multiple gradient mappings
                                double dv;

                                double curScalar = double.Parse(currentRecord.Value.ToString());

                                if (curScalar < m_ShapeTileArgs.ScaleMin)
                                {
                                    curScalar = m_ShapeTileArgs.ScaleMin;
                                }
                                if (curScalar > m_ShapeTileArgs.ScaleMax)
                                {
                                    curScalar = m_ShapeTileArgs.ScaleMax;
                                }

                                dv = m_ShapeTileArgs.ScaleMax - m_ShapeTileArgs.ScaleMin;

                                if (curScalar < (m_ShapeTileArgs.ScaleMin + 0.25 * dv))
                                {
                                    red   = 0;
                                    green = 4 * (curScalar - m_ShapeTileArgs.ScaleMin) / dv;
                                }
                                else if (curScalar < (m_ShapeTileArgs.ScaleMin + 0.5 * dv))
                                {
                                    red  = 0;
                                    blue = 1 + 4 * (m_ShapeTileArgs.ScaleMin + 0.25 * dv - curScalar) / dv;
                                }
                                else if (curScalar < (m_ShapeTileArgs.ScaleMin + 0.75 * dv))
                                {
                                    red  = 4 * (curScalar - m_ShapeTileArgs.ScaleMin - 0.5 * dv) / dv;
                                    blue = 0;
                                }
                                else
                                {
                                    green = 1 + 4 * (m_ShapeTileArgs.ScaleMin + 0.75 * dv - curScalar) / dv;
                                    blue  = 0;
                                }

                                color = System.Drawing.Color.FromArgb((int)(255 * red), (int)(255 * green), (int)(255 * blue));
                            }
                            catch (Exception)
                            {
                                //	Utility.Log.Write((string)currentPoly.ScalarHash[m_ShapeTileArgs.ColorKey]);
                                //	Utility.Log.Write(String.Format("Min: {0}, Max: {1}", m_ShapeTileArgs.ScaleMin, m_ShapeTileArgs.ScaleMax));
                                //	Utility.Log.Write(String.Format("{0},{1},{2}", red, green, blue));
                                //	Utility.Log.Write(ex);
                            }
                        }
                        else
                        {
                            if (m_ShapeTileArgs.ColorAssignments.Count > 0 && m_ShapeTileArgs.ScaleColors)
                            {
                                try
                                {
                                    string colorAssignmentKey = (string)currentRecord.Value;
                                    foreach (string cak in m_ShapeTileArgs.ColorAssignments.Keys)
                                    {
                                        if (String.Compare(cak, colorAssignmentKey, true) == 0)
                                        {
                                            color = (System.Drawing.Color)m_ShapeTileArgs.ColorAssignments[cak];
                                            break;
                                        }
                                    }
                                }
                                catch (Exception)
                                {
                                }
                            }
                        }

                        if (currentRecord.Polygon != null)
                        {
                            drawPolygon(currentRecord.Polygon,
                                        g,
                                        color,
                                        geoBB,
                                        b.Size);
                        }

                        if (m_ShapeTileArgs.ColorAssignments.Count == 0 ||
                            !m_ShapeTileArgs.ScaleColors)
                        {
                            color = m_ShapeTileArgs.LineColor;
                        }

                        if (currentRecord.PolyLine != null)
                        {
                            drawPolyLine(currentRecord.PolyLine,
                                         g,
                                         color,
                                         geoBB,
                                         b.Size);
                        }
                        numberPolygonsInTile++;
                    }
                }
            }

            if (!m_ShapeTileArgs.ParentShapeFileLayer.EnableCaching)
            {
                string id = System.DateTime.Now.Ticks.ToString();

                if (b != null)
                {
                    MemoryStream ms = new MemoryStream();

                    //must copy original stream into new stream, if not, error occurs, not sure why
                    m_ImageStream = new MemoryStream(ms.GetBuffer());

                    imageLayer = new WorldWind.Renderable.ImageLayer(
                        id,
                        m_ShapeTileArgs.ParentWorld,
                        0,
                        m_ImageStream,
                        System.Drawing.Color.Black.ToArgb(),
                        (float)south,
                        (float)north,
                        (float)west,
                        (float)east,
                        (float)m_ShapeTileArgs.ParentShapeFileLayer.Opacity / 255.0f,
                        m_ShapeTileArgs.ParentWorld.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_ShapeTileArgs.ParentWorld,
                    0,                    // should be distance above surface
                    imageFile.FullName,   //m_ImageStream,
                    //0,//System.Drawing.Color.Black.ToArgb(),
                    (float)south,
                    (float)north,
                    (float)west,
                    (float)east,
                    (float)m_ShapeTileArgs.ParentShapeFileLayer.Opacity / 255.0f,
                    m_ShapeTileArgs.ParentWorld.TerrainAccessor);
            }

            if (b != null)
            {
                b.Dispose();
            }
            if (g != null)
            {
                g.Dispose();
            }

            b = null;
            g = null;

            //might not be necessary
            //GC.Collect();

            return(imageLayer);
        }
        /*public byte Opacity
         * {
         *      get
         *      {
         *              return m_parentProjectedLayer.Opacity;
         *      }
         *      set
         *      {
         *              if(m_NwImageLayer != null)
         *              {
         *                      m_NwImageLayer.Opacity = value;
         *              }
         *              if(m_NeImageLayer != null)
         *              {
         *                      m_NeImageLayer.Opacity = value;
         *              }
         *              if(m_SwImageLayer != null)
         *              {
         *                      m_SwImageLayer.Opacity = value;
         *              }
         *              if(m_SeImageLayer != null)
         *              {
         *                      m_SeImageLayer.Opacity = value;
         *              }
         *
         *              if(m_NorthWestChild != null)
         *              {
         *                      m_NorthWestChild.Opacity = value;
         *              }
         *              if(m_NorthEastChild != null)
         *              {
         *                      m_NorthEastChild.Opacity = value;
         *              }
         *              if(m_SouthWestChild != null)
         *              {
         *                      m_SouthWestChild.Opacity = value;
         *              }
         *              if(m_SouthEastChild != null)
         *              {
         *                      m_SouthEastChild.Opacity = value;
         *              }
         *      }
         * }*/

        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 WorldWind.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);
        }
Ejemplo n.º 6
0
        public BMNG(WorldWind.WorldWindow worldWindow, MenuItem menuItem)
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            this.m_MenuItem = menuItem; // Plugin menu item ref

            int lastSelectedDatasetIndex = 1;

            try
            {
                using (StreamReader reader = new StreamReader(Path.GetDirectoryName(Application.ExecutablePath) + "\\Plugins\\BlueMarble\\settings.txt"))
                {
                    lastSelectedDatasetIndex = int.Parse(reader.ReadLine().Trim());
                }
            }
            catch
            {
            }

            comboBoxBmngVersion.SelectedIndex = lastSelectedDatasetIndex;

            m_WorldWindow = worldWindow;
            m_RenderableList.ShowOnlyOneLayer = true;
            bool foundImagesObject = false;

            lock (m_WorldWindow.CurrentWorld.RenderableObjects.ChildObjects.SyncRoot)
            {
                foreach (WorldWind.Renderable.RenderableObject ro in m_WorldWindow.CurrentWorld.RenderableObjects.ChildObjects)
                {
                    if (ro is WorldWind.Renderable.RenderableObjectList && (ro.Name == "Images"))       // SF FIX: don't add to layers called 'xxxx images'!
                    {
                        WorldWind.Renderable.RenderableObjectList imagesList = ro as WorldWind.Renderable.RenderableObjectList;
                        imagesList.ChildObjects.Insert(0, m_RenderableList);
                        foundImagesObject = true;
                        break;
                    }
                }
            }

            if (!foundImagesObject)
            {
                m_WorldWindow.CurrentWorld.RenderableObjects.ChildObjects.Add(m_RenderableList);
            }

            m_BlueMarbleBase = new WorldWind.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";

            WorldWind.NltImageStore ia = new WorldWind.NltImageStore("106", "http://nww.terraserver-usa.com/nwwtile.ashx");
            ia.DataDirectory            = null;
            ia.LevelZeroTileSizeDegrees = 36.0;
            ia.LevelCount     = 4;
            ia.ImageExtension = "jpg";
            ia.CacheDirectory = String.Format("{0}\\Blue Marble", m_WorldWindow.Cache.CacheDirectory);

            WorldWind.ImageStore[] ias = new WorldWind.ImageStore[1];
            ias[0]            = ia;
            m_BlueMarbleTiled = new WorldWind.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 WorldWind.Renderable.RenderableObjectList("Blue Marble");
            m_BlueMarbleList.IsOn = false;
            m_BlueMarbleList.Add(m_BlueMarbleBase);
            m_BlueMarbleList.Add(m_BlueMarbleTiled);

            m_ShadedList = new WorldWind.Renderable.RenderableObjectList("BMNG");
            m_ShadedList.ShowOnlyOneLayer = true;
            m_ShadedList.IsOn             = false;

            for (int i = 0; i < 12; i++)
            {
                m_ImageLayers[0, i] = new WorldWind.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);

                WorldWind.NltImageStore imageStore = new WorldWind.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 WorldWind.ImageStore[1];
                ias[0] = imageStore;

                m_QuadTileLayers[0, i] = new WorldWind.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 WorldWind.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 WorldWind.Renderable.RenderableObjectList("BMNG (Bathymetry)");
            m_ShadedBathyList.ShowOnlyOneLayer = true;
            m_ShadedBathyList.IsOn             = false;

            for (int i = 0; i < 12; i++)
            {
                m_ImageLayers[1, i] = new WorldWind.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);

                WorldWind.NltImageStore imageStore = new WorldWind.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 WorldWind.ImageStore[1];
                ias[0] = imageStore;

                m_QuadTileLayers[1, i] = new WorldWind.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 WorldWind.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();
        }
Ejemplo n.º 7
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);
			FileInfo shapeFile = new FileInfo(m_ShapeTileArgs.ParentShapeFileLayer.ShapeFilePath);
			FileInfo shapeXmlFile = null;
			if(m_ShapeTileArgs.ParentShapeFileLayer.MetaData.Contains("SourceXml"))
			{
				string sourceXml = (string)m_ShapeTileArgs.ParentShapeFileLayer.MetaData["SourceXml"];
				if(!sourceXml.ToLower().StartsWith("http://"))
				{
					shapeXmlFile = new FileInfo(sourceXml);
				}
			}

			if(!m_ShapeTileArgs.ParentShapeFileLayer.EnableCaching ||
				!imageFile.Exists || 
				shapeXmlFile == null ||
				shapeXmlFile.LastWriteTimeUtc > imageFile.LastWriteTimeUtc ||
				shapeFile.LastWriteTimeUtc > imageFile.LastWriteTimeUtc
				)
			{
				for(int i = 0; i < m_ShapeTileArgs.ShapeRecords.Count; i++)
				{
					ShapeRecord currentRecord = (ShapeRecord)m_ShapeTileArgs.ShapeRecords[i];
				
					if(currentRecord.Null != null || 
						currentRecord.Point != null || 
						currentRecord.MultiPoint != null ||
						!isShapeRecordInBounds(geoBB, currentRecord))
					{
						continue;
					}
					else
					{
						if(b == null)
						{
							b = new Bitmap(m_ShapeTileArgs.TilePixelSize.Width,
								m_ShapeTileArgs.TilePixelSize.Height,
								System.Drawing.Imaging.PixelFormat.Format32bppArgb);
						}

						if(g == null)
						{
							g = Graphics.FromImage(b);
						}

						System.Drawing.Color color = m_ShapeTileArgs.PolygonColor;

						//Fix Black Tiles
						g.DrawLine(new Pen(color),0,0,1,1);
					
					
						if(m_ShapeTileArgs.UseScalar && m_ShapeTileArgs.ScaleColors)
						{
							double red = 1.0;
							double green = 1.0;
							double blue = 1.0;
							
							try
							{
								//TODO: make this a function and abstract to allow multiple gradient mappings
								double dv;

								double curScalar = double.Parse(currentRecord.Value.ToString());

								if (curScalar < m_ShapeTileArgs.ScaleMin)
									curScalar = m_ShapeTileArgs.ScaleMin;
								if (curScalar > m_ShapeTileArgs.ScaleMax)
									curScalar = m_ShapeTileArgs.ScaleMax;
							
								dv = m_ShapeTileArgs.ScaleMax - m_ShapeTileArgs.ScaleMin;

								if (curScalar < (m_ShapeTileArgs.ScaleMin + 0.25 * dv)) 
								{
									red = 0;
									green = 4 * (curScalar - m_ShapeTileArgs.ScaleMin) / dv;
								} 
								else if (curScalar < (m_ShapeTileArgs.ScaleMin + 0.5 * dv)) 
								{
									red = 0;
									blue = 1 + 4 * (m_ShapeTileArgs.ScaleMin + 0.25 * dv - curScalar) / dv;
								} 
								else if (curScalar < (m_ShapeTileArgs.ScaleMin + 0.75 * dv)) 
								{
									red = 4 * (curScalar - m_ShapeTileArgs.ScaleMin - 0.5 * dv) / dv;
									blue = 0;
								} 
								else 
								{
									green = 1 + 4 * (m_ShapeTileArgs.ScaleMin + 0.75 * dv - curScalar) / dv;
									blue = 0;
								}

								color = System.Drawing.Color.FromArgb((int)(255*red), (int)(255*green), (int)(255*blue));
							
							}
							catch(Exception)
							{
								//	Utility.Log.Write((string)currentPoly.ScalarHash[m_ShapeTileArgs.ColorKey]);
								//	Utility.Log.Write(String.Format("Min: {0}, Max: {1}", m_ShapeTileArgs.ScaleMin, m_ShapeTileArgs.ScaleMax));
								//	Utility.Log.Write(String.Format("{0},{1},{2}", red, green, blue));
								//	Utility.Log.Write(ex);
							}
						}
						else
						{
							if(m_ShapeTileArgs.ColorAssignments.Count > 0 && m_ShapeTileArgs.ScaleColors)
							{
								try
								{
									string colorAssignmentKey = (string)currentRecord.Value;
									foreach(string cak in m_ShapeTileArgs.ColorAssignments.Keys)
									{
										if(String.Compare(cak, colorAssignmentKey, true) == 0)
										{
											color = (System.Drawing.Color)m_ShapeTileArgs.ColorAssignments[cak];
											break;
										}
									}
								}
								catch(Exception)
								{
								}
							}
						}
					
						if(currentRecord.Polygon != null)
						{
							drawPolygon(currentRecord.Polygon,
								g,
								color,
								geoBB,
								b.Size);
						}
					
						if(m_ShapeTileArgs.ColorAssignments.Count == 0 ||  
							!m_ShapeTileArgs.ScaleColors)
						{
							color = m_ShapeTileArgs.LineColor;
						}

						if(currentRecord.PolyLine != null)
						{
							drawPolyLine(currentRecord.PolyLine,
								g,
								color,
								geoBB,
								b.Size);
						}
						numberPolygonsInTile++;
					}
				}
			}
            
			if(!m_ShapeTileArgs.ParentShapeFileLayer.EnableCaching)
			{
				string id = System.DateTime.Now.Ticks.ToString();

				if(b != null)
				{
					MemoryStream ms = new MemoryStream();
					
					//must copy original stream into new stream, if not, error occurs, not sure why
					m_ImageStream = new MemoryStream(ms.GetBuffer());
					
					imageLayer = new WorldWind.Renderable.ImageLayer(
						id,
						m_ShapeTileArgs.ParentWorld,
						0,
						m_ImageStream,
						System.Drawing.Color.Black.ToArgb(),
						(float)south,
						(float)north,
						(float)west,
						(float)east,
						(float)m_ShapeTileArgs.ParentShapeFileLayer.Opacity / 255.0f,
						m_ShapeTileArgs.ParentWorld.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_ShapeTileArgs.ParentWorld,
					0,// should be distance above surface
					imageFile.FullName,//m_ImageStream,
					//0,//System.Drawing.Color.Black.ToArgb(),
					(float)south,
					(float)north,
					(float)west,
					(float)east,
					(float)m_ShapeTileArgs.ParentShapeFileLayer.Opacity / 255.0f,
					m_ShapeTileArgs.ParentWorld.TerrainAccessor);
			}
					
			if(b != null)
			{
				b.Dispose();
			}
			if(g != null)
			{
				g.Dispose();
			}

			b = null;
			g = null;

			//might not be necessary
			//GC.Collect();

			return imageLayer;
		}
Ejemplo n.º 8
0
        public BMNG(WorldWind.WorldWindow worldWindow, MenuItem menuItem)
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            this.m_MenuItem = menuItem; // Plugin menu item ref

            int lastSelectedDatasetIndex = 1;
            try
            {
                using (StreamReader reader = new StreamReader(Path.GetDirectoryName(Application.ExecutablePath) + "\\Plugins\\BlueMarble\\settings.txt"))
                {
                    lastSelectedDatasetIndex = int.Parse(reader.ReadLine().Trim());

                }
            }
            catch
            {
            }

            comboBoxBmngVersion.SelectedIndex = lastSelectedDatasetIndex;

            m_WorldWindow = worldWindow;
            m_RenderableList.ShowOnlyOneLayer = true;
            bool foundImagesObject = false;
            lock (m_WorldWindow.CurrentWorld.RenderableObjects.ChildObjects.SyncRoot)
            {
                foreach (WorldWind.Renderable.RenderableObject ro in m_WorldWindow.CurrentWorld.RenderableObjects.ChildObjects)
                {
                    if (ro is WorldWind.Renderable.RenderableObjectList && (ro.Name == "Images"))	// SF FIX: don't add to layers called 'xxxx images'!
                    {
                        WorldWind.Renderable.RenderableObjectList imagesList = ro as WorldWind.Renderable.RenderableObjectList;
                        imagesList.ChildObjects.Insert(0, m_RenderableList);
                        foundImagesObject = true;
                        break;
                    }
                }
            }

            if (!foundImagesObject)
            {
                m_WorldWindow.CurrentWorld.RenderableObjects.ChildObjects.Add(m_RenderableList);
            }

            m_BlueMarbleBase = new WorldWind.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";

            WorldWind.NltImageStore ia = new WorldWind.NltImageStore("106", "http://nww.terraserver-usa.com/nwwtile.ashx");
            ia.DataDirectory = null;
            ia.LevelZeroTileSizeDegrees = 36.0;
            ia.LevelCount = 4;
            ia.ImageExtension = "jpg";
            ia.CacheDirectory = String.Format("{0}\\Blue Marble", m_WorldWindow.Cache.CacheDirectory);

            WorldWind.ImageStore[] ias = new WorldWind.ImageStore[1];
            ias[0] = ia;
            m_BlueMarbleTiled = new WorldWind.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 WorldWind.Renderable.RenderableObjectList("Blue Marble");
            m_BlueMarbleList.IsOn = false;
            m_BlueMarbleList.Add(m_BlueMarbleBase);
            m_BlueMarbleList.Add(m_BlueMarbleTiled);

            m_ShadedList = new WorldWind.Renderable.RenderableObjectList("BMNG");
            m_ShadedList.ShowOnlyOneLayer = true;
            m_ShadedList.IsOn = false;

            for (int i = 0; i < 12; i++)
            {
                m_ImageLayers[0, i] = new WorldWind.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);

                WorldWind.NltImageStore imageStore = new WorldWind.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 WorldWind.ImageStore[1];
                ias[0] = imageStore;

                m_QuadTileLayers[0, i] = new WorldWind.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 WorldWind.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 WorldWind.Renderable.RenderableObjectList("BMNG (Bathymetry)");
            m_ShadedBathyList.ShowOnlyOneLayer = true;
            m_ShadedBathyList.IsOn = false;

            for (int i = 0; i < 12; i++)
            {
                m_ImageLayers[1, i] = new WorldWind.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);

                WorldWind.NltImageStore imageStore = new WorldWind.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 WorldWind.ImageStore[1];
                ias[0] = imageStore;

                m_QuadTileLayers[1, i] = new WorldWind.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 WorldWind.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();
        }