代码改变世界

Gis初学者之sharpmap(一) 希望可以抛砖引玉 大家继续Gis初学者

2010-05-19 17:29  废墟中的垃圾  阅读(4589)  评论(1)    收藏  举报

本人不是gis专业的学生,但是因为某些原因开始研究这个,看了一些文章和gis可以做的一些事情,对此非常感兴趣,但是刚来到这里,gis初学者就不办了,感觉太可惜了。希望大家可以重燃gis初学者的火焰。好了不多说,进入今天的整体。

 

今天开始了解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程序了。

==========================================================================
今天得任务呢是自己创建一个类似于 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 运行,是不是已经能看到地图了?而且可以放大缩小,哈哈。今天我们的任务完成了。