通过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 不要积分的!
描述一些我的代码边界:
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 不要积分的!
相关文章推荐
- 将数据库中的数据通过 client 控件显示 (一个asp和javascript传参数的列子)
- 一起学习水晶报表之拉模式【如何通过代码实现水晶报表显示数据】(课程2)
- ButterKnife 加载控件 + xUtils 获取数据+ Fresco 显示图片 + 通过事件分发控制移动 + 通过AIDL获取数据
- 将数据库中的数据通过 client 控件显示 (一个asp和javascript传参数的列子)
- 使用GeoTools读取和绘制Shapefile格式 -- (学习GIS【1】)
- ListView通过自定义适配器来显示数据并对Item项以及子view项的控件实现监听.
- 1、通过程序设计几何图形(Shape)、矩形(Rectangle)、圆形(Circle)、正方形(Square)几种类型,能够利用接口和多态性计算几何图形的面积和周长并显示。 2、按以下要求编写程序
- ListView通过自定义适配器来显示数据并对Item项以及子view项的控件实现监听.
- DataBind包括三大方法,Repeater,DataList和DataGrid,这些控件都位于 System.Web.UI.WebControls 命名空间中,从 WebControl 基类中直接或间接派生出来的。这些方法都是通过HTML来显示数据的内
- 加载数据库表全部数据到GridView控件,但通过查询条件在GridView显示一行或几行数据
- C#学习之控件:listbox显示多条数据以及周边操作
- QT学习笔记之QT代码编写控件不显示的问题
- ListView通过自定义适配器来显示数据并对Item项以及子view项的控件实现监听
- Xml文件的读取以及通过GridView控件利用视图过滤器查询显示数据
- ButterKnife 加载控件 + xUtils 获取数据+ Fresco 显示图片 + 通过事件分发控制移动 + 通过AIDL获取数据
- 读取SQL server数据通过控件teechart显示曲线
- 将数据库中的数据通过 client 控件显示 (一个asp和javascript传参数的列子)
- 将数据库中的数据通过 client 控件显示 (一个asp和javascript传参数的列子)
- 常见代码编写规范(二)--详细数据的读与显示
- 常见代码的编写规范(一)---列表数据的显示