当前位置: 首页 > 工具软件 > SharpMap > 使用案例 >

C# SharpMap 学习总结

戚飞雨
2023-12-01

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



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" 
            οnclick="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_data\countries.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\rivers.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_data\cities.shp"), true);
        //Define a blue 1px wide pen
        //layCities.Style.Symbol = new Bitmap(HttpContext.Current.Server.MapPath(@"~


\App_data\Taiyuan\icon.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_data\Taiyuan\区县级行政区划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_data\Taiyuan\镇.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_data\Taiyuan\河流湖泊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_data\Taiyuan\国道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_data\Taiyuan\省道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_data\Taiyuan\城市主干道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_data\Taiyuan\城市次干道L.shp"), true);
        //Define a blue 1px wide pen
        //layCities.Style.Symbol = new Bitmap(HttpContext.Current.Server.MapPath(@"~


\App_data\Taiyuan\icon.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_data\Taiyuan\基础地标.shp"), true);
        //Define a blue 1px wide pen
        //layCities.Style.Symbol = new Bitmap(HttpContext.Current.Server.MapPath(@"~


\App_data\Taiyuan\icon.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;
    }
}
========

SharpMap创建应用程序教程



首先,下载SharpMap,下载地址:http://sharpmap.codeplex.com/releases/view/116326
下载完成后解压。再下载演示程序所用的地图文件,下载地址:
http://115.com/lb/5lbdeevtkasp
115网盘礼包码:5lbdeevtkasp
下载完解压,得到文件states_ugl.dbf,states_ugl.shp,states_ugl.shx。


一、创建一个包括MapControl的窗体
1、启动vs并且创建一个窗体应用程序。
2、切换至.net4 full framewark。
右击项目,点击属性,在应用程序标签内容内的目标框架处选择.NET Framework 4。
SharpMap创建应用程序教程
3、打开窗口设计
4、在工具箱“常规”下方的空白处右击,然后点击“选择项”。
SharpMap创建应用程序教程
5、在弹出的窗口中,点击“浏览”,选择SharpMap解压出来的文件中的SharpMap.UI.dll,再点击确定



完成之后会看到“常规”下面多了几项,其中包括MapBox。
SharpMap创建应用程序教程
6、拖动MapBox控件至刚才新建的窗全中,将会在窗体上增加一个地图。
这时候,一般会自动添加对SharpMap.dll的引用。
7、选择这个地图,在右侧背景色属性中改为白色以区别窗体本身的颜色。
SharpMap创建应用程序教程


二、在地图上增加一个层
在这一步,将会增加一个层到上一步创建的地图中。
1、如果在上一步中没有自动添加对SharpMap.dll的引用,请右击项目下的“引用”,添加引用。选择


SharpMap.dll。
2、查看窗体的代码,打开代码页。
3、添加以下代码至除始化方法中。


public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();


            SharpMap.Layers.VectorLayer vlay = new SharpMap.Layers.VectorLayer("States");
            vlay.DataSource = new SharpMap.Data.Providers.ShapeFile("states_ugl.shp", 


true);
            mapBox1.Map.Layers.Add(vlay);
            mapBox1.Map.ZoomToExtents();


         mapBox1.Refresh();
        }
    }
然后,把第一步中下载的三个地图文件,复制到程序的Debug文件夹中供程序使用。
4、启动调试,就可以看到一个疑似地图的图形了。
5、添加功能工具。


mapBox1.ActiveTool = SharpMap.Forms.MapBox.Tools.Pan;
把这行代码加到上面代码的后面。
6、再调试程序,将会看到可以鼠标的中轮滚动来放大或缩小地图。SharpMap创建应用程序教程


三、用UniqueValueRenderer改变层的风格样式。
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();


            SharpMap.Layers.VectorLayer vlay = new SharpMap.Layers.VectorLayer("States");
            vlay.DataSource = new SharpMap.Data.Providers.ShapeFile("states_ugl.shp", 


true);


            //创建大陆的样式
            VectorStyle landStyle = new VectorStyle();
            landStyle.Fill = new SolidBrush(Color.FromArgb(232, 232, 232));




            //创建水域的样式。
            VectorStyle waterStyle = new VectorStyle();
            waterStyle.Fill = new SolidBrush(Color.FromArgb(198, 198, 255));


            //创建样式组
            Dictionary styles = new Dictionary();
            styles.Add("land", landStyle);
            styles.Add("water", waterStyle);
            //添加样式至层
            vlay.Theme = new SharpMap.Rendering.Thematics.UniqueValuesTheme("class", 


styles, landStyle);


            mapBox1.Map.Layers.Add(vlay);
            mapBox1.Map.ZoomToExtents();
            mapBox1.Refresh();


            mapBox1.ActiveTool = SharpMap.Forms.MapBox.Tools.Pan;
        }
    }
再次调试运行,将会看到已经上色了。
SharpMap创建应用程序教程


四、上数据层
SharpMap.Layers.WmsLayer wmsL =
                new SharpMap.Layers.WmsLayer("US 


Cities","http://sampleserver1.arcgisonline.com/ArcGIS/services/Specialty/ESRI_StatesCitiesR


ivers_USA/MapServer/WMSServer?request=GetCapabilities&service=WMS");
            //设定图标格式
            wmsL.SetImageFormat("image/png");
            //设定版本号
            wmsL.Version = "1.1.1";
            //为wms添加一个名字为2的层
            wmsL.AddLayer("2");
            //设定空间参考识别码,这个东西是什么意思,自己去百度吧。
            wmsL.SRID = 4326;
            mapBox1.Map.Layers.Add(wmsL);
再调试运行,将全看到一个城市的分布图。官网给的那地址打不开了,找了一个相关的。
SharpMap创建应用程序教程
不翻了,累,后面就差一节讲怎么加背景色的了。
========

Gis初学者之sharpmap



今天开始了解sharpmap,来做webgis的项目。为什么要用sharpmap呢?
第一,开源。开源代表着免费,对于那些商业版高达十几万甚至几十万的费用来说,小弟只能选择这个



第二,是.net 的,因为本人一直使用微软系列的东西进行开发,所以选择了这个。


准备工作,需要有vs2008 和 sharpmap 1.1的demo。
IIS 推荐大家提前安装好IIS ,如果是 server的系统 那么会自动安装IIS,如果是xp 系统请使用系统


光盘进行安装。参考下面的地址
http://blog.sina.com.cn/s/blog_4eac972c0100c8zh.html


vs2008 的下载请大家到迅雷去下载。 
sharpmap 1.1 的下载地址是 
http://download.codeplex.com/Project/Download/SourceControlFileDownload.ashx?


ProjectName=SharpMap&changeSetId=64449


sharpmap现在的版本是 2.0 版本。但是2.0版本没有提供web的例子,所以这里还是使用1.1 版本。很多


朋友能在网上找到的是0.9版本的中文,其实差不多。


首先可以直接双击Demo程序里面的 SharpMap.VS2008.sln 使用 vs2008 打开。
然后会有很多的项目被加载,请耐心等待。 加载完项目以后可以使用 ctrl + shift + b 进行编译。如


果下载的是 SharpMap-64449 那么会出现编译错误,提示 SharpMap.Data.Providers.0gr 未定义。这里


为了能正常运行程序,请修改所有这样的报错代码  SharpMap.Data.Providers.0gr 为 


SharpMap.Data.Providers.ShapeFile
到此就可以正常运行了。然后在Demowebsite 上右键选择 “设为启动项目”,然后选择Default.aspx 


然后右键选择设为起始页。然后按F5。 恭喜你现在已经可以正常的使用 sharpmap 的demo程序了。


==========================================================================

Gis初学者之sharpmap(一) 

http://www.cnblogs.com/52x/archive/2010/05/19/1739433.html


创建一个类似于 sample 的那样的程序。


1. 启动vs2008 点新建 -- 项目 


然后选择 web -- asp.net 应用程序。
选择程序要防止的位置 、程序解决方案 和 名称。然后确定。
可以看到程序会自动为您创建很多东西。接下来我们来认识这些东西。


2. default.aspx是默认创建的页面。也是我们今天要进行操作的页面。
首页双击 default.aspx 然后会看到如下的代码


<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" 


Inherits="Web._Default" %>


<%@ Register assembly="SharpMap.UI" namespace="SharpMap.Web.UI.Ajax" tagprefix="cc1" %>


<!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></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
    </div>
    </form>
</body>
</html>


然后我们在这里的 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" />
然后点击左下角的设计。这样会变成设计视图,我们可以看到有一个单选按钮组和一个图片按钮。然后


双击图片按钮。


双击以后会进入程序代码界面。我把注释写在程序里面这样不介绍自动的生成代码了。
会看到如下的代码:


//程序需要使用的类的命名空间
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;


//使用sharp的类需要引入的命名空间
using SharpMap.Geometries;
using SharpMap.Converters.WellKnownBinary;


//网站的命名空间
namespace Web
{
    //网站的页面对应的管理类的名称
    public partial class _Default : System.Web.UI.Page
    {


        /// <summary>
        /// 页面加载方法,页面加载的时候进行的操作放在这个方法里面
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {
        }


        /// <summary>
        /// 图片按钮点击触发的方法
        /// </summary>
        /// <param name="sender">触发的对象</param>
        /// <param name="e">事件对象</param>
        protected void imgMap_Click(object sender, ImageClickEventArgs e)
        {
        }
    }
}


ok 现在开始我们的程序了。 在类里面生成私有变量
//定义地图对象
 private SharpMap.Map myMap;


然后从官方给的 demo程序的sample.aspx.cs里面复制代码
private void GenerateMap()
        {
            //Save the current mapcenter and zoom in the viewstate
            ViewState.Add("mapCenter", myMap.Center);
            ViewState.Add("mapZoom", myMap.Zoom);
            //Render map
            this.Label1.Text = myMap.Layers[0].LayerName;
            System.Drawing.Image img = myMap.GetMap();
            string imgID = SharpMap.Web.Caching.InsertIntoCache(1, img);
            imgMap.ImageUrl = "getmap.aspx?ID=" + HttpUtility.UrlEncode(imgID);
        }
到程序里面。


然后在Page_load 方法里面添加代码
myMap = MapHelper.InitializeGradientMap(new System.Drawing.Size((int)imgMap.Width.Value, 


(int)imgMap.Height.Value));
            if (Page.IsPostBack)
            {
                //Page is post back. Restore center and zoom-values from viewstate
                myMap.Center = (SharpMap.Geometries.Point)ViewState["mapCenter"];
                myMap.Zoom = (double)ViewState["mapZoom"];
            }
            else
            {
                GenerateMap();
            }
在imgMap_Click 方法里面添加
//Set center of the map to where the client clicked
            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
            GenerateMap();
接下来,在程序的
 
App_Data上点击右键,然后选择添加现有项。然后在官方Demo程序里面的App_Data 里面的文件全选。然


后点击确定。(这里是为了加载地图,以后我们可能使用别的地图。也使用同样的方法添加就可以了。





ok 到这里我们已经大功告成了。按F5 运行。
这时会出现报错
错误    1    当前上下文中不存在名称“MapHelper”    F:\程序\net\SharpMap\Web


\Default.aspx.cs    29    21    Web
这里提示我们没有 MapHelper 类。
如何解决呢,我们在我们这个图的 
 
带小地图图标的web(这里的web是我创建的网站的名称,如果大家使用别的名称可以选择你创建的网站


的名称)上点击右键选择添加现有项。然后选择官方Demo程序里面的MapHelper 文件。


这时候再F5 运行程序。
这时候会出现一个页面。就是我们的成果了,但是我们会发现,为什么图片是一个小叉叉,没有出现我


们理想的地图呢。。。。。


如何解决这个问题呢,很简单。双击web.config 然后从官方Demo程序里面可以看到有这样的代码
<httpHandlers>
            <add verb="*" path="GetMap.aspx" type="SharpMap.Web.HttpHandler,SharpMap"/>
        </httpHandlers>
我们复制 add 这行到我们网站的 web.config 的httphandlers 的里面。


现在我们F5 运行,是不是已经能看到地图了?而且可以放大缩小,哈哈。今天我们的任务完成了。
========

开源地图 SharpMap

http://www.cnblogs.com/hanwen/p/4067472.html
Step1 创建一个地图控件
1、启动Visual Studio 2012 并创建一个新的Windows应用程序


2、调整项目到.net Framework 4.0全框架


3、打开Form1的设计视图


4、在工具箱底部,常规右击点击“选择项” 


4、浏览SharpMap.UI.dll并添加


 SharpMap的dll和地图文件网盘共享地址:http://pan.baidu.com/s/1hqzG0de (内含Demo)


5、点击确定如图:


6、拖动MapBox控件插入Form1窗体中


7、将mapBox1控件背景色设置为白色,Dock属性设置为Fill
 
Step2 添加一个图层到地图控件
 
1、添加SharpMap.dll到项目


2、添加地图文件到项目
  
3、修改窗体构造函数Fomr1()


public Form1()
        {
            InitializeComponent();
            VectorLayer vlay = new VectorLayer("States")
            {
                DataSource = new ShapeFile(@"path_to_data\states_ugl.shp", true)
            };
            mapBox1.Map.Layers.Add(vlay);
            mapBox1.Map.ZoomToExtents();
            mapBox1.Refresh();
            mapBox1.ActiveTool = SharpMap.Forms.MapBox.Tools.Pan;//设置平移
        }


4、运行地图可以看到地图,并操作放大、缩小、平移


 Step3 给图层添加样式


1、修改窗体构造函数Fomr2() 参见Dome


public Form2()
        {
            InitializeComponent();


            SharpMap.Layers.VectorLayer vlay = new SharpMap.Layers.VectorLayer("States");
            vlay.DataSource = new SharpMap.Data.Providers.ShapeFile(@"path_to_data


\states_ugl.shp", true);


            //构造土地样式
            VectorStyle landStyle = new VectorStyle();
            landStyle.Fill = new SolidBrush(Color.FromArgb(232, 232, 232));


            //构造水样式
            VectorStyle waterStyle = new VectorStyle();
            waterStyle.Fill = new SolidBrush(Color.FromArgb(198, 198, 255));


            //创建地图
            Dictionary<string, SharpMap.Styles.IStyle> styles = new Dictionary<string, 


IStyle>();
            styles.Add("land", landStyle);
            styles.Add("water", waterStyle);


            //分配主题
            vlay.Theme = new SharpMap.Rendering.Thematics.UniqueValuesTheme<string>


("class", styles, landStyle);


            mapBox1.Map.Layers.Add(vlay);
            mapBox1.Map.ZoomToExtents();
            mapBox1.Refresh();
            mapBox1.ActiveTool = SharpMap.Forms.MapBox.Tools.Pan;
        }


2、运行程序,如图


  Step4 添加WMS-层到地图
1、修改From3构造函数()


   调用


http://sampleserver1.arcgisonline.com/ArcGIS/services/Specialty/ESRI_StatesCitiesRivers_USA


/MapServer/WMSServer 服务器记载数据。


public Form3()
        {
            InitializeComponent();


            SharpMap.Layers.VectorLayer vlay = new SharpMap.Layers.VectorLayer("States");
            vlay.DataSource = new SharpMap.Data.Providers.ShapeFile(@"path_to_data


\states_ugl.shp", true);


            //构造土地样式
            VectorStyle landStyle = new VectorStyle();
            landStyle.Fill = new SolidBrush(Color.FromArgb(232, 232, 232));


            //构造水样式
            VectorStyle waterStyle = new VectorStyle();
            waterStyle.Fill = new SolidBrush(Color.FromArgb(198, 198, 255));


            //创建地图
            Dictionary<string, SharpMap.Styles.IStyle> styles = new Dictionary<string, 


IStyle>();
            styles.Add("land", landStyle);
            styles.Add("water", waterStyle);


            //分配主题
            vlay.Theme = new SharpMap.Rendering.Thematics.UniqueValuesTheme<string>


("class", styles, landStyle);


            mapBox1.Map.Layers.Add(vlay);
            mapBox1.Map.ZoomToExtents();
            mapBox1.Refresh();
            mapBox1.ActiveTool = SharpMap.Forms.MapBox.Tools.Pan;


            SharpMap.Layers.WmsLayer wmsL =new SharpMap.Layers.WmsLayer("US 


Cities","http://sampleserver1.arcgisonline.com/ArcGIS/services/Specialty/ESRI_StatesCitiesR


ivers_USA/MapServer/WMSServer");
            //转换为PNG
            wmsL.SetImageFormat("image/png");
            //11.0版本
            wmsL.Version = "1.1.0";
            //添加城市图层 服务名称2
            wmsL.AddLayer("2");
            //设置 SRID
            wmsL.SRID = 4326;
            mapBox1.Map.Layers.Add(wmsL);
        }


 2、运行程序如图,显示城镇。


 Step5 添加一个平铺层作为背景
 在这个步骤中,可以结合网上瓦片服务器数据连同本地数据显示。


 1、添加BruTile.dll、ProjNet.dll、GeoAPI.dll 到项目中


 2、添加辅助方法来创建google坐标系


  private  GeoAPI.CoordinateSystems.IProjectedCoordinateSystem GetEPSG900913


(ProjNet.CoordinateSystems.CoordinateSystemFactory csFact)
        {
            List<GeoAPI.CoordinateSystems.ProjectionParameter> parameters = new 


List<GeoAPI.CoordinateSystems.ProjectionParameter>();
            parameters.Add(new GeoAPI.CoordinateSystems.ProjectionParameter("semi_major", 


6378137.0));
            parameters.Add(new GeoAPI.CoordinateSystems.ProjectionParameter("semi_minor", 


6378137.0));
            parameters.Add(new GeoAPI.CoordinateSystems.ProjectionParameter


("latitude_of_origin", 0.0));
            parameters.Add(new GeoAPI.CoordinateSystems.ProjectionParameter


("central_meridian", 0.0));
            parameters.Add(new GeoAPI.CoordinateSystems.ProjectionParameter("scale_factor", 


1.0));
            parameters.Add(new GeoAPI.CoordinateSystems.ProjectionParameter


("false_easting", 0.0));
            parameters.Add(new GeoAPI.CoordinateSystems.ProjectionParameter


("false_northing", 0.0));
            GeoAPI.CoordinateSystems.IProjection projection = csFact.CreateProjection


("Google Mercator", "mercator_1sp", parameters);
            GeoAPI.CoordinateSystems.IGeographicCoordinateSystem wgs84 = 


csFact.CreateGeographicCoordinateSystem(
                "WGS 84", ProjNet.CoordinateSystems.AngularUnit.Degrees, 


ProjNet.CoordinateSystems.HorizontalDatum.WGS84, 


ProjNet.CoordinateSystems.PrimeMeridian.Greenwich,
                new GeoAPI.CoordinateSystems.AxisInfo("north", 


GeoAPI.CoordinateSystems.AxisOrientationEnum.North), new GeoAPI.CoordinateSystems.AxisInfo


("east", GeoAPI.CoordinateSystems.AxisOrientationEnum.East)
            );


            GeoAPI.CoordinateSystems.IProjectedCoordinateSystem epsg900913 = 


csFact.CreateProjectedCoordinateSystem("Google Mercator", wgs84, projection, 


ProjNet.CoordinateSystems.LinearUnit.Metre,
              new GeoAPI.CoordinateSystems.AxisInfo("East", 


GeoAPI.CoordinateSystems.AxisOrientationEnum.East), new GeoAPI.CoordinateSystems.AxisInfo


("North", GeoAPI.CoordinateSystems.AxisOrientationEnum.North));
            return epsg900913;
        }


 3、修改构造函数Form4()


        public Form4()
        {
            InitializeComponent();


            SharpMap.Layers.VectorLayer vlay = new SharpMap.Layers.VectorLayer("States");
            vlay.DataSource = new SharpMap.Data.Providers.ShapeFile(@"path_to_data


\states_ugl.shp", true);


            //构造土地样式
            VectorStyle landStyle = new VectorStyle();
            landStyle.Fill = new SolidBrush(Color.FromArgb(232, 232, 232));


            //创造水样式
            VectorStyle waterStyle = new VectorStyle();
            waterStyle.Fill = new SolidBrush(Color.FromArgb(198, 198, 255));


            //创造地图
            Dictionary<string, SharpMap.Styles.IStyle> styles = new Dictionary<string, 


IStyle>();
            styles.Add("land", landStyle);
            styles.Add("water", waterStyle);


            //分配主题
            vlay.Theme = new SharpMap.Rendering.Thematics.UniqueValuesTheme<string>


("class", styles, landStyle);


            mapBox1.Map.Layers.Add(vlay);


            ProjNet.CoordinateSystems.Transformations.CoordinateTransformationFactory 


ctFact = new ProjNet.CoordinateSystems.Transformations.CoordinateTransformationFactory();
            ProjNet.CoordinateSystems.CoordinateSystemFactory csFact = new 


ProjNet.CoordinateSystems.CoordinateSystemFactory();
            vlay.CoordinateTransformation = ctFact.CreateFromCoordinateSystems


(ProjNet.CoordinateSystems.GeographicCoordinateSystem.WGS84, GetEPSG900913(csFact));
            vlay.ReverseCoordinateTransformation = ctFact.CreateFromCoordinateSystems


(GetEPSG900913(csFact), ProjNet.CoordinateSystems.GeographicCoordinateSystem.WGS84);




            mapBox1.Map.BackgroundLayer.Add(new SharpMap.Layers.TileAsyncLayer(
                new BruTile.Web.OsmTileSource(), "OSM"));


            mapBox1.Map.ZoomToExtents();
            mapBox1.Refresh();
            mapBox1.ActiveTool = SharpMap.Forms.MapBox.Tools.Pan;


        }


 4、运行程序,如图:
========
 类似资料: