使用自定义图像而不是默认标记添加标记,然后在标记中添加一些数字

时间:2014-04-23 05:35:22

标签: javascript google-maps google-maps-api-3 google-maps-markers

我想放置一个自定义图片而不是标记,然后添加一些数字。 该数字必须根据其中的位数在标记图像中居(1-5) 我试过MarkerWithLabel,它还不够好。 Google图表提供了一些解决方案,但已弃用。

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:0)

我使用ASHX文件来做同样的事情 通过直接提供路径来调用图像 而不是我给.ashx文件路径加载图像与文本写在其中

JS代码

 var poiIcon = "../HANDLERS/CustomImageHandler.ashx?ImageName=" + MarkerData.Items[index].PoiIcon + "&No=" + (parseInt(index) + 1);

ashx CODE

 [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    public class CustomImageHandler : IHttpHandler
    {
        #region Variables

        Color titleColor = Color.White;
        Color bodyColor = Color.Black;

        #endregion

        #region Properties

        private Bitmap _sourceImage = null;

        /// <summary>
        /// Gets or sets the source image to be modified.
        /// </summary>
        public Bitmap SourceImage
        {
            get { return _sourceImage; }
            set { _sourceImage = value; }
        }

        private Bitmap _destintationImage = null;

        /// <summary>
        /// Gets or sets the modified image.
        /// </summary>
        public Bitmap DestinationImage
        {
            get { return _destintationImage; }
            set
            {
                _destintationImage = value;
            }
        }

        #endregion

        public void ProcessRequest(HttpContext context)
        {

            //Get the path of the image
            //object o = context.Server.MapPath(context.Request.QueryString["ImageName"]);//Patient Cable (transparent).gif");
            object o = context.Server.MapPath("../../MARKERS/pin.gif");//Patient Cable (transparent).gif");
            //Prepare the path of the image
            string file = (string)o;

            //Prepare the Copyright text
            string msg = context.Request.QueryString["No"]; 

            if (!File.Exists(file))
            {
                //Set the path to the place holder image if the specified
                //image is not found.
                file = HttpContext.Current.Server.MapPath("placeholder.jpg");
            }


            this.SourceImage = new Bitmap(file, true);
            WriteText(context, 5, 3, msg);


        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }

        /// <summary>
        /// Writes a text to the bitmap.
        /// </summary>
        /// <param name="context">The current context</param>
        /// <param name="left">The left position of the text to be written.</param>
        /// <param name="top">The top position of the text to be written.</param>
        /// <param name="text">The text to be written.</param>
        private void WriteText(HttpContext context, int left, int top, string text)
        {
            //Create a blank image.
            this.DestinationImage = new Bitmap(this.SourceImage.Width, this.SourceImage.Height, PixelFormat.Format32bppArgb);

            //The font used in writing the title.
            Font titleFont = new Font("Arial", 10, FontStyle.Bold, GraphicsUnit.Point);

            //The brush used in writing the title.
            Brush titleBrush = new SolidBrush(titleColor);

            //The font used in writing the text.
            Font bodyFont = new Font("Arial", 10, FontStyle.Bold, GraphicsUnit.Point);

            //The brush used in writing the text.
            Brush bodyBrush = new SolidBrush(bodyColor);

            //string[] separator = { "\r\n" };
            //string[] lines = text.Split(separator, 2, StringSplitOptions.None);
            string title = text;
            //string body = "";
            //if (lines.Length > 0)
            //    title = lines[0];
            //if (lines.Length > 1)
            //    body = lines[1];

            //Get the Graphics object of the image to use in drawing.
            using (Graphics g = Graphics.FromImage(this.DestinationImage))
            {
                //Draw the original image.
                g.DrawImage(this.SourceImage, 0, 0);
                //Used to write smooth text.
                g.TextRenderingHint = TextRenderingHint.AntiAlias;

                //To calculate writing coordinates, obtain the size of the
                //text given the font typeface and size
                SizeF textSize = new SizeF();
                textSize = g.MeasureString(text, titleFont);

                //Coordinates as which the text will start
                float x = (((float)this.SourceImage.Width - textSize.Width) / 2) + 3;// +textSize.Width; 
                float y = (((float)this.SourceImage.Height - textSize.Height) / 2) - 2;// +textSize.Height; 

                //Write the text you want.
                g.DrawString(title, titleFont, titleBrush, x, y, StringFormat.GenericTypographic);

                //Free the resources.
                g.Dispose();
            }

            Bitmap gif = CreateIndexedImage(this.DestinationImage, this.SourceImage.Palette);
            gif.Save(context.Response.OutputStream, ImageFormat.Gif);

            gif.Dispose();
        }

        /// <summary>
        /// Creates an indexed image from a bitmap with a given palette.
        /// </summary>
        /// <param name="src">The source image.</param>
        /// <param name="palette">The palette to be used.</param>
        /// <returns>An indexed image.</returns>
        private static Bitmap CreateIndexedImage(Bitmap src, ColorPalette palette)
        {
            //Create an indexed image.
            Bitmap dest = new Bitmap(src.Width, src.Height, PixelFormat.Format8bppIndexed);

            //Create a dictionary of colors to speed up the search.
            Dictionary<int, int> colors = new Dictionary<int, int>();

            //The transparent color index.
            int transparent = 255;

            //Load the dictionary with the given palette.
            for (int i = 0; i < palette.Entries.Length; i++)
            {
                colors[Color2Int(palette.Entries[i])] = i;
                if (palette.Entries[i].A == 0)
                    transparent = i;
            }

            //Set the palette of the image.
            dest.Palette = palette;

            Rectangle rect = new Rectangle(0, 0, src.Width, src.Height);

            //Lock the image data so you can modify it.
            BitmapData destData = dest.LockBits(rect, ImageLockMode.ReadWrite, dest.PixelFormat);

            //The number of bytes in each line of the image.
            int dStride = Convert.ToInt32(Math.Abs(destData.Stride));

            //Create a buffer to hold the image data.
            byte[] destBytes = new byte[dest.Height * dStride];

            //Copy the image data into the buffer.
            IntPtr destPtr = destData.Scan0;
            Marshal.Copy(destPtr, destBytes, 0, dest.Height * dStride);

            //Select the best fit color index for each pixel in the image.
            for (int row = 0; row < src.Height; row++)
            {
                for (int col = 0; col < src.Width; col++)
                {
                    //Get the color of the pixel.
                    Color c = src.GetPixel(col, row);
                    int index = 255;
                    if (c.A == 0) //Transparent
                    {
                        index = transparent;
                    }
                    else
                    {
                        //Get the nearst color from the palette.
                        int ic = Color2Int(c);
                        if (colors.ContainsKey(ic))
                        {
                            index = colors[ic];
                        }
                        else
                        {
                            index = GetNearestColor(palette, c);
                            colors[ic] = index;
                        }
                    }
                    //Update the color index in the buffer.
                    destBytes[row * dStride + col] = (byte)index;
                }
            }
            //Copy the image data back to the image.
            Marshal.Copy(destBytes, 0, destPtr, dest.Height * dStride);

            //Unlock the data.
            dest.UnlockBits(destData);

            return dest;
        }

        /// <summary>
        /// Converts a color t an integer.
        /// </summary>
        /// <param name="color">The color to be converted.</param>
        /// <returns></returns>
        private static int Color2Int(Color color)
        {
            return (color.R * 1000000 + color.G * 1000 + color.B);
        }

        /// <summary>
        /// Gets the nearst color index from the palette to the givin color.
        /// </summary>
        /// <param name="pal">The color palette.</param>
        /// <param name="c">The color to be searched for.</param>
        /// <returns>The nearest color from the palette.</returns>
        private static int GetNearestColor(ColorPalette pal, Color c)
        {
            int nearest = int.MaxValue;
            int index = 0;
            for (int i = 0; i < pal.Entries.Length; i++)
            {
                Color cc = pal.Entries[i];
                int distance = Convert.ToInt32(Math.Pow(cc.R - c.R, 2) + Math.Pow(cc.G - c.G, 2) + Math.Pow(cc.B - c.B, 2));

                if (distance < nearest)
                {
                    index = i;
                    nearest = distance;
                }
            }

            return index;
        }


        private Bitmap AddCopyright(string file, string msg)
        {
            //Load the file
            //Bitmap loadingImage = new Bitmap(file);

            Bitmap bmpOldImage = new Bitmap(file);


            ////Get the size new size for the image
            Size newSize = new Size(21, 25);
            ////Size newSize = Utility.CalculateDimensions(bmpOldImage.Size, 250);

            //Creatig the new Image and create the graphics
            Bitmap bmp = new Bitmap(file);
            //new Bitmap(newSize.Width, newSize.Height);//, PixelFormat.Format24bppRgb);
            //Bitmap bmp = new Bitmap(21, 25, PixelFormat.Format24bppRgb);


            Graphics g = Graphics.FromImage(bmp);
            g.SmoothingMode = SmoothingMode.AntiAlias;
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            g.PixelOffsetMode = PixelOffsetMode.HighQuality;
            g.DrawImage(bmpOldImage, new Rectangle(new Point(0, 0), newSize));

            //Define text alignment
            StringFormat strFmt = new StringFormat();
            strFmt.Alignment = StringAlignment.Center;

            //Create brushes for the bottom writing 
            //(green text on black background)
            SolidBrush btmForeColor = new SolidBrush(Color.Blue);
            SolidBrush btmBackColor = new SolidBrush(Color.Transparent);

            //To calculate writing coordinates, obtain the size of the
            //text given the font typeface and size
            Font btmFont = new Font("Verdana", 11);
            SizeF textSize = new SizeF();
            textSize = g.MeasureString(msg, btmFont);

            //Calculate the output rectangle and fill
            float x = 10;// ((float)bmp.Width - textSize.Width - 3);
            float y = 8;// ((float)bmp.Height - textSize.Height - 3);
            float w = ((float)x + textSize.Width);
            float h = ((float)y + textSize.Height);
            RectangleF textArea = new RectangleF(x, y, w, h);
            g.FillRectangle(btmBackColor, textArea);

            //Draw the text and free resources
            //g.DrawString(msg, btmFont, btmForeColor, textArea);
            btmForeColor.Dispose();
            btmBackColor.Dispose();
            btmFont.Dispose();

            //g.DrawString("1", new Font("Arial", 12, FontStyle.Regular), SystemBrushes.Window, new PointF(2, 7));

            return bmp;

        }

答案 1 :(得分:0)

这可以使用infoBox完成。

将以下脚本添加到html

<script type="text/javascript" src="http://google-maps-utility-library-v3.googlecode.com/svn/trunk/infobox/src/infobox.js"></script>

然后

var lonLat,oPushpin;

// Create lon lat object. Here the pin will be located. 
lonLat =google.maps.LatLng(yourLatitude,yourLongitude);

// Create an element(I use jquery for simplicity)
// The number is inside the div with id = text.
var oPin = $(
"<div id='pushpin'>"+
    "<div id = 'text'>1</div>"+
"</div>");

// Add the element along with the desired text to infoBox
//  closeBoxURL: ""  remove the cross from the box.
oPushpin = new InfoBox({
     content: oPin[0],
     position: lonLat,
     closeBoxURL: ""
});

oPushpin.open(map);

使用以下样式。 当然,它们取决于图像大小。我的形象是68x108。

图钉{

height: 68px;
width: 108px;
background-image: url('img/1.png');
background-repeat: no-repeat;

}

text {

position: relative;
top: 50%;
text-align: center;

}