您的位置:首页 > 其它

通过ShapeMap学习编写GIS数据(ShapeFile)显示控件

2014-07-13 17:14 246 查看
距离上次写SharpMap有关的东西已经有不短的时间了,待加油了!其实也是自己想写一个矢量数据显示的控件,能够熟悉一下SharpMap显示矢量数据的流程,刚开始就遇到点问题,也不知道从那个地方切入,现在终于写出来了,当然基本所有的代码都是从SharpMap上粘贴的,自己从中学习实现矢量数据加载是怎么样一个流程,怎么样一个原理,确实学到了这些流程,但是一些核心的处理算法还是理解不了,后续慢慢理解,并且从中学习到了拓展方法(http://msdn.microsoft.com/zh-cn/library/bb383977.aspx)的应用、Timer控件的应用、组件加鼠标滚轮处理等,确实可以学习一些.NET的一些基础,现在这些也只是对我自己有些用处,帮助不了别人,后续慢慢努力,做出一些东西;

描述一些我的代码边界:

1.读取ShapeFile文件等内容完全使用ShapeMap的东西,不做改动;

2.自己完成VectorLaye类,主要功能是完成Render方法相关的内容,Render方法主要完成将给定空间范围内容的数据绘制到Graphics对象上(同样是Image对象);

3.自己完成MyMap类,主要模仿SharpMap中的Map类,提供一些矢量显示控件显示矢量数据的一些参数设置,供坐标转换用(地理坐标和像素坐标互转),坐标转换主要是MyTransform类完成;

4.MyTransform类,封装了最核心的两个方法,如下所示:

///<summary>

/// Transforms from world coordinatesystem (WCS) to image coordinates

/// NOTE: This method DOES NOT take theMapTransform property into account (use <seecref="Map.WorldToImage(GeoAPI.Geometries.Coordinate,bool)"/>instead)

/// </summary>

/// <paramname="p">Point in WCS</param>

/// <paramname="map">Map reference</param>

/// <returns>Point in imagecoordinates</returns>

public static PointF WorldtoMap(Coordinatep, MyMap map)

{

//if (map.MapTransform != null&& !map.MapTransform.IsIdentity)

// map.MapTransform.TransformPoints(newSystem.Drawing.PointF[] { p });

if (p.IsEmpty())

return PointF.Empty;

var result = new PointF();

var height = (map.Zoom *map.Size.Height) / map.Size.Width;

var left = map.Center.X - map.Zoom* 0.5;

var top = map.Center.Y + height *0.5 * map.PixelAspectRatio;

result.X = (float)((p.X - left) /map.PixelWidth);

result.Y = (float)((top - p.Y) /map.PixelHeight);

if (double.IsNaN(result.X) ||double.IsNaN(result.Y))

result = PointF.Empty;

return result;

}

/// <summary>

/// Transforms from image coordinatesto world coordinate system (WCS).

/// NOTE: This method DOES NOT take theMapTransform property into account (use <seecref="Map.ImageToWorld(System.Drawing.PointF,bool)"/> instead)

/// </summary>

/// <paramname="p">Point in image coordinate system</param>

/// <paramname="map">Map reference</param>

/// <returns>Point inWCS</returns>

public static CoordinateMapToWorld(PointF p, MyMap map)

{

if (map.Center.MyIsEmpty() ||double.IsNaN(map.MapHeight))

{

return new Coordinate(0, 0);

}

var ul = newCoordinate(map.Center.X - map.Zoom * .5, map.Center.Y + map.MapHeight * .5);

return new Coordinate(ul.X + p.X *map.PixelWidth,

ul.Y - p.Y *map.PixelHeight);

}

这两个方法根据控件的中心点(Center属性)、大小(Size属性)、像素高度、像素宽度、纵横比等信息将地理坐标(Coordinate对象)转换为像素坐标(Coordinate对象),我是没有理解,呵呵;

5.MapBox组件的实现,首先加载矢量图层,然后调用图层的Render方法绘制Image对象,最后在OnPaint事件中将Image对象绘制到控件上显示,后面还加了一个鼠标中键滚动放大缩小的功能;

自己对地图显示的简单理解:



例子下载地址:http://download.csdn.net/detail/pubuzhixing/7629619 不要积分的!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐