• SharpMap V1.1 For Web教程系列之——地图展示


    开篇先说本次的开发环境吧。采用Vs2010,.Net Framework 4.0。

    为了更好的调试程序,建议在IIS中进行调试及运行,个人非常不喜欢利用VS自己提供的WebServer去调试程序,而且很多在Web.config中的设置也需要在IIS中才能起到效果!

    开发环境我就不要介绍了,先来说说SharpMap的组件要求吧。由于SharpMap的架构一直在变化和改进过程中,因此参考网络上别人的事例代码,你会发现都运行不起来,不是接口没了,就是命名空间变了,这点我也希望SharpMap早日稳定下来。

    这次使用的SharpMap的版本是V1.1版本,官方意见提供最新稳定版的下载了,官方网址为:http://sharpmap.codeplex.com/

    SharpMap 1.1版本的下载地址为:http://sharpmap.codeplex.com/downloads/get/792797​,发布时间为2014年12月11日;该版本只是SharpMap的核心库(Core+UI),下载完后,为了Web开发还必须下载一个Web端的库,本人做完因为这一步走了好多弯路,网络上的教程也没有人写上着一点。在官网的DOWNLOADS节点下有个下载界面,需要下载SharpMap.Web这个组件。

    OK!所需库完成后,下面进行Asp.Net的网站开发!你也可以不看下面的代码,直接下载整个网站。解决方案下载地址:http://pan.baidu.com/s/1i3vdUcd

    打开VS2010,新建一个网站,​新建一个WebForm,我这里命名为“Map.aspx”,下面贴代码:

    Map.aspx:地图展示页面

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Map.aspx.cs" Inherits="Map" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>SharpMap测试</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:RadioButtonList ID="rblMapTools" runat="server" RepeatDirection="Horizontal">
                <asp:ListItem Value="0">Zoom in</asp:ListItem>
                <asp:ListItem Value="1">Zoom out</asp:ListItem>
                <asp:ListItem Value="2" Selected="True">Pan</asp:ListItem>
            </asp:RadioButtonList>
            <asp:ImageButton runat="server" Width="700" Height="400" ID="imgMap" 
                onclick="imgMap_Click" />
        </div>
        </form>
    </body>
    </html>
    View Code

    Map.aspx.cx:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class Map : System.Web.UI.Page
    {
        private SharpMap.Map myMap;
        protected void Page_Load(object sender, EventArgs e)
        {
            myMap = MapHelper.InitializeMap(new System.Drawing.Size((int)imgMap.Width.Value, (int)imgMap.Height.Value));
    
            //SharpMap.Map
            if (this.IsPostBack)
            {
                myMap.Center = (GeoAPI.Geometries.Coordinate)ViewState["mapCenter"];
                myMap.Zoom = (double)ViewState["mapZoom"];
            }
            else
            {
                this.generateMap();
            }
        }
        protected void imgMap_Click(object sender, ImageClickEventArgs e)
        {
            myMap.Center = myMap.ImageToWorld(new System.Drawing.Point(e.X, e.Y));
            //Set zoom value if any of the zoom tools were selected
            if (rblMapTools.SelectedValue == "0") //Zoom in
                myMap.Zoom = myMap.Zoom * 0.5;
            else if (rblMapTools.SelectedValue == "1") //Zoom out
                myMap.Zoom = myMap.Zoom * 2;
            //Create the map
            this.generateMap();
        }
    
        private void generateMap()
        {
            ViewState.Add("mapCenter", myMap.Center);
            ViewState.Add("mapZoom", myMap.Zoom);
            //myMap = MapHelper.InitializeMap(new System.Drawing.Size(256, 256));
            System.Drawing.Image img = myMap.GetMap();
    
            string imgID = SharpMap.Web.Caching.InsertIntoCache(1, img);
            
            imgMap.ImageUrl = "getmap.aspx?ID=" + HttpUtility.UrlEncode(imgID);
        }
    }
    

      Web.Config配置文件,在.Net 4.0下配置文件,红色部分表示这个地方和SharpMap官网以及互联网上很多教程里面的区别。

    <?xml version="1.0"?>
    <configuration>
      <system.web>
        <compilation debug="true" targetFramework="4.0" />
      </system.web>
      <system.webServer>
         <modules runAllManagedModulesForAllRequests="true"/>
          <handlers>
              <add verb="*" name="test" path="GetMap.aspx" type="SharpMap.Web.HttpHandler" preCondition="integratedMode"/>
          </handlers>
          <validation validateIntegratedModeConfiguration="false" />
      </system.webServer>
    </configuration>

    MapHelper.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using SharpMap;
    using System.Drawing;
    using SharpMap.Layers;
    using SharpMap.Data.Providers;
    using SharpMap.Styles;
    using System.Drawing.Text;
    using SharpMap.Rendering;
    
    using ColorBlend=SharpMap.Rendering.Thematics.ColorBlend;
    using Point=GeoAPI.Geometries.Coordinate;
    using System.Drawing.Drawing2D;
    
    /// <summary>
    /// Summary description for MapHelper
    /// </summary>
    public class MapHelper
    {
        public MapHelper()
        {
        }
    
        public static Map InitializeMap(Size size)
        {
            HttpContext.Current.Trace.Write("Initializing map...");
    
            //Initialize a new map of size 'imagesize'
            Map map = new Map(size);
    
            //Set up the countries layer
            VectorLayer layCountries = new VectorLayer("Countries");
            //Set the datasource to a shapefile in the App_data folder
            layCountries.DataSource = new ShapeFile(HttpContext.Current.Server.MapPath(@"~App_datacountries.shp"), true);
    
            //Set fill-style to green
            layCountries.Style.Fill = new SolidBrush(Color.Green);
            //Set the polygons to have a black outline
            layCountries.Style.Outline = Pens.Black;
            layCountries.Style.EnableOutline = true;
            layCountries.SRID = 4326;
    
            //Set up a river layer
            VectorLayer layRivers = new VectorLayer("Rivers");
            //Set the datasource to a shapefile in the App_data folder
            layRivers.DataSource = new ShapeFile(HttpContext.Current.Server.MapPath(@"~App_data
    ivers.shp"), true);
            //Define a blue 1px wide pen
            layRivers.Style.Line = new Pen(Color.Blue, 1);
            layRivers.SRID = 4326;
    
            //Set up a river layer
            VectorLayer layCities = new VectorLayer("Cities");
            //Set the datasource to a shapefile in the App_data folder
            layCities.DataSource = new ShapeFile(HttpContext.Current.Server.MapPath(@"~App_datacities.shp"), true);
            //Define a blue 1px wide pen
            //layCities.Style.Symbol = new Bitmap(HttpContext.Current.Server.MapPath(@"~App_dataTaiyuanicon.png"));
            layCities.Style.SymbolScale = 0.8f;
            layCities.MaxVisible = 40;
            layCities.SRID = 4326;
    
            //Set up a country label layer
            LabelLayer layLabel = new LabelLayer("Country labels");
            layLabel.DataSource = layCountries.DataSource;
            layLabel.Enabled = true;
            layLabel.LabelColumn = "Name";
            layLabel.Style = new LabelStyle();
            layLabel.Style.ForeColor = Color.White;
            layLabel.Style.Font = new Font(FontFamily.GenericSerif, 12);
            layLabel.Style.BackColor = new SolidBrush(Color.FromArgb(128, 255, 0, 0));
            layLabel.MaxVisible = 90;
            layLabel.MinVisible = 30;
            layLabel.Style.HorizontalAlignment = LabelStyle.HorizontalAlignmentEnum.Center;
            layLabel.SRID = 4326;
            layLabel.MultipartGeometryBehaviour = LabelLayer.MultipartGeometryBehaviourEnum.Largest;
    
            //Set up a city label layer
            LabelLayer layCityLabel = new LabelLayer("City labels");
            layCityLabel.DataSource = layCities.DataSource;
            layCityLabel.Enabled = true;
            layCityLabel.LabelColumn = "Name";
            layCityLabel.Style = new LabelStyle();
            layCityLabel.Style.ForeColor = Color.Black;
            layCityLabel.Style.Font = new Font(FontFamily.GenericSerif, 11);
            layCityLabel.MaxVisible = layLabel.MinVisible;
            layCityLabel.Style.HorizontalAlignment = LabelStyle.HorizontalAlignmentEnum.Left;
            layCityLabel.Style.VerticalAlignment = LabelStyle.VerticalAlignmentEnum.Bottom;
            layCityLabel.Style.Offset = new PointF(3, 3);
            layCityLabel.Style.Halo = new Pen(Color.Yellow, 2);
            layCityLabel.TextRenderingHint = TextRenderingHint.AntiAlias;
            layCityLabel.SmoothingMode = SmoothingMode.AntiAlias;
            layCityLabel.SRID = 4326;
            layCityLabel.LabelFilter = LabelCollisionDetection.ThoroughCollisionDetection;
            layCityLabel.Style.CollisionDetection = true;
    
            //Add the layers to the map object.
            //The order we add them in are the order they are drawn, so we add the rivers last to put them on top
            map.Layers.Add(layCountries);
            map.Layers.Add(layRivers);
            map.Layers.Add(layCities);
            map.Layers.Add(layLabel);
            map.Layers.Add(layCityLabel);
    
    
            //limit the zoom to 360 degrees width
            map.MaximumZoom = 360;
            map.BackColor = Color.LightBlue;
    
            map.Zoom = 360;
            map.Center = new Point(0, 0);
    
            HttpContext.Current.Trace.Write("Map initialized");
            return map;
        }
    
        public static Map InitializeTaiyuanMap(Size size)
        {
            HttpContext.Current.Trace.Write("Initializing map...");
    
            //Initialize a new map of size 'imagesize'
            SharpMap.Map map = new SharpMap.Map(size);
    
            //设置太原市区域图层
            SharpMap.Layers.VectorLayer layTy = new SharpMap.Layers.VectorLayer("ty");
            layTy.DataSource = new SharpMap.Data.Providers.ShapeFile(HttpContext.Current.Server.MapPath(@"~App_dataTaiyuan区县级行政区划R.shp"), true);
            layTy.Style.Fill = new SolidBrush(Color.FromArgb(242, 239, 233));
            layTy.Style.Outline = System.Drawing.Pens.Black;
            layTy.Style.EnableOutline = true;
            layTy.SRID = 4326;
    
            //设置镇的图层
            SharpMap.Layers.VectorLayer layZ = new SharpMap.Layers.VectorLayer("z");
            layZ.DataSource = new SharpMap.Data.Providers.ShapeFile(HttpContext.Current.Server.MapPath(@"~App_dataTaiyuan镇.shp"), true);
            layZ.Style.Fill = new SolidBrush(Color.FromArgb(191, 237, 245));
            layZ.Style.Outline = System.Drawing.Pens.Black;
            layZ.Style.EnableOutline = true;
            layZ.SRID = 4326;
    
            //设置河流的图层
            SharpMap.Layers.VectorLayer layHl = new SharpMap.Layers.VectorLayer("Hl");
            layHl.DataSource = new SharpMap.Data.Providers.ShapeFile(HttpContext.Current.Server.MapPath(@"~App_dataTaiyuan河流湖泊R.shp"), true);
            layHl.Style.Fill = new SolidBrush(Color.FromArgb(151, 219, 242));
            layHl.Style.Outline = System.Drawing.Pens.Black;
            layHl.Style.EnableOutline = true;
            layHl.SRID = 4326;
    
            //设置国道的图层
            SharpMap.Layers.VectorLayer layGd = new SharpMap.Layers.VectorLayer("gd");
            layGd.DataSource = new SharpMap.Data.Providers.ShapeFile(HttpContext.Current.Server.MapPath(@"~App_dataTaiyuan国道L.shp"), true);
            layGd.Style.Fill = new SolidBrush(Color.FromArgb(255, 254, 169));
            layZ.Style.Outline = System.Drawing.Pens.Black;
            layZ.Style.EnableOutline = true;
            layGd.Style.Line = new Pen(Color.FromArgb(130, 130, 130), 1);
            layGd.SRID = 4326;
    
            //Set up the countries layer
            SharpMap.Layers.VectorLayer laySd = new SharpMap.Layers.VectorLayer("sd");
            //Set the datasource to a shapefile in the App_data folder
            laySd.DataSource = new SharpMap.Data.Providers.ShapeFile(HttpContext.Current.Server.MapPath(@"~App_dataTaiyuan省道L.shp"), true);
    
            //Set fill-style to green
            laySd.Style.Fill = new SolidBrush(Color.FromArgb(255, 254, 169));
            //Set the polygons to have a black outline
            laySd.Style.Line = new Pen(Color.FromArgb(130, 130, 130), 1);
    
            layZ.Style.Outline = System.Drawing.Pens.Gainsboro;
            layZ.Style.EnableOutline = true;
    
            laySd.SRID = 4326;
    
            //Set up a river layer
            SharpMap.Layers.VectorLayer layRivers = new SharpMap.Layers.VectorLayer("Rivers");
            //Set the datasource to a shapefile in the App_data folder
            layRivers.DataSource = new SharpMap.Data.Providers.ShapeFile(HttpContext.Current.Server.MapPath(@"~App_dataTaiyuan城市主干道L.shp"), true);
    
            layRivers.Style.Fill = new SolidBrush(Color.FromArgb(255, 254, 169));
            //Define a blue 1px wide pen
            layRivers.Style.Line = new Pen(Color.FromArgb(130, 130, 130), 1);
            layRivers.SRID = 4326;
    
            //Set up a river layer
            SharpMap.Layers.VectorLayer layCities = new SharpMap.Layers.VectorLayer("Cities");
            //Set the datasource to a shapefile in the App_data folder
            layCities.DataSource = new SharpMap.Data.Providers.ShapeFile(HttpContext.Current.Server.MapPath(@"~App_dataTaiyuan城市次干道L.shp"), true);
            //Define a blue 1px wide pen
            //layCities.Style.Symbol = new Bitmap(HttpContext.Current.Server.MapPath(@"~App_dataTaiyuanicon.png"));
            layCities.Style.SymbolScale = 0.8f;
            layCities.MaxVisible = 0.2;
            layCities.SRID = 4326;
    
            //Set up a river layer
            SharpMap.Layers.VectorLayer layDb = new SharpMap.Layers.VectorLayer("db");
            //Set the datasource to a shapefile in the App_data folder
            layDb.DataSource = new SharpMap.Data.Providers.ShapeFile(HttpContext.Current.Server.MapPath(@"~App_dataTaiyuan基础地标.shp"), true);
            //Define a blue 1px wide pen
            //layCities.Style.Symbol = new Bitmap(HttpContext.Current.Server.MapPath(@"~App_dataTaiyuanicon.png"));
            layDb.Style.SymbolScale = 0.8f;
            layDb.MaxVisible = 0.05;
            layDb.SRID = 4326;
    
            //Set up a 镇 label layer
            SharpMap.Layers.LabelLayer layZLabel = new SharpMap.Layers.LabelLayer("tyz labels");
            layZLabel.DataSource = layZ.DataSource;
            layZLabel.Enabled = true;
            layZLabel.LabelColumn = "Name";
            layZLabel.Style = new SharpMap.Styles.LabelStyle();
            layZLabel.Style.ForeColor = Color.White;
            layZLabel.Style.Font = new Font(FontFamily.GenericSerif, 12);
            layZLabel.Style.BackColor = new System.Drawing.SolidBrush(Color.Black);
            layZLabel.MaxVisible = 0.1;
            layZLabel.MinVisible = 0.05;
            layZLabel.Style.HorizontalAlignment = SharpMap.Styles.LabelStyle.HorizontalAlignmentEnum.Center;
            layZLabel.SRID = 4326;
            layZLabel.MultipartGeometryBehaviour = SharpMap.Layers.LabelLayer.MultipartGeometryBehaviourEnum.Largest;
    
            //Set up a city label layer
            SharpMap.Layers.LabelLayer layCityLabel = new SharpMap.Layers.LabelLayer("City labels");
            layCityLabel.DataSource = layCities.DataSource;
            layCityLabel.Enabled = true;
            layCityLabel.LabelColumn = "Name";
            layCityLabel.Style = new SharpMap.Styles.LabelStyle();
            layCityLabel.Style.ForeColor = Color.Black;
            layCityLabel.Style.Font = new Font(FontFamily.GenericSerif, 11);
            layCityLabel.MaxVisible = layZLabel.MinVisible;
            layCityLabel.Style.HorizontalAlignment = SharpMap.Styles.LabelStyle.HorizontalAlignmentEnum.Left;
            layCityLabel.Style.VerticalAlignment = SharpMap.Styles.LabelStyle.VerticalAlignmentEnum.Bottom;
            layCityLabel.Style.Offset = new PointF(3, 3);
            layCityLabel.Style.Halo = new Pen(Color.Yellow, 2);
            layCityLabel.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
            layCityLabel.SmoothingMode = SmoothingMode.AntiAlias;
            layCityLabel.SRID = 4326;
            layCityLabel.LabelFilter = SharpMap.Rendering.LabelCollisionDetection.ThoroughCollisionDetection;
            layCityLabel.Style.CollisionDetection = true;
    
    
            //Set up a city label layer
            SharpMap.Layers.LabelLayer layDbLabel = new SharpMap.Layers.LabelLayer("Db labels");
            layDbLabel.DataSource = layDb.DataSource;
            layDbLabel.Enabled = true;
            layDbLabel.LabelColumn = "Name";
            layDbLabel.Style = new SharpMap.Styles.LabelStyle();
            layDbLabel.Style.ForeColor = Color.Black;
            layDbLabel.Style.Font = new Font(FontFamily.GenericSerif, 11);
            layDbLabel.MaxVisible = layCityLabel.MinVisible;
            layDbLabel.Style.HorizontalAlignment = SharpMap.Styles.LabelStyle.HorizontalAlignmentEnum.Left;
            layDbLabel.Style.VerticalAlignment = SharpMap.Styles.LabelStyle.VerticalAlignmentEnum.Bottom;
            layDbLabel.Style.Offset = new PointF(3, 3);
            layDbLabel.Style.Halo = new Pen(Color.Yellow, 2);
            layDbLabel.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
            layDbLabel.SmoothingMode = SmoothingMode.AntiAlias;
            layDbLabel.SRID = 4326;
            layDbLabel.LabelFilter = SharpMap.Rendering.LabelCollisionDetection.ThoroughCollisionDetection;
            layCityLabel.Style.CollisionDetection = true;
    
            //Add the layers to the map object.
            //The order we add them in are the order they are drawn, so we add the rivers last to put them on top
            map.Layers.Add(layTy);
            map.Layers.Add(layHl);
            map.Layers.Add(layGd);
            map.Layers.Add(laySd);
            map.Layers.Add(layRivers);
            map.Layers.Add(layCities);
            map.Layers.Add(layDb);
            map.Layers.Add(layZLabel);
            map.Layers.Add(layCityLabel);
            map.Layers.Add(layDbLabel);
    
    
            //limit the zoom to 360 degrees width
            map.MaximumZoom = 4;
            map.BackColor = Color.White;
    
            map.Zoom = 4;
            //map.Center = new SharpMap.Geometries.Point(0, 0);
            map.Center = new Point(112.48, 37.86);
    
            HttpContext.Current.Trace.Write("Map initialized");
            return map;
        }
    }
    View Code
  • 相关阅读:
    spring scope prototype与singleton区别
    JAVA中的内存们
    汉诺塔问题
    关于设置tomcat端口为80的事
    struts2表单提单细节处理
    volatile的作用
    Java并发编程:Thread类的使用
    git的几个小技巧
    UEdit插件使用
    MySQL优化必须调整的10项配置
  • 原文地址:https://www.cnblogs.com/cehui0303/p/4223089.html
Copyright © 2020-2023  润新知