使用 Map Suite 在 .NET 中构建支持地图的应用程序





0/5 (0投票)
2005年1月5日
8分钟阅读

72912
.NET 开发组件,用于为您的 Windows 桌面或 ASP.NET Web 应用程序添加地图。
引言
如今,开发人员比以往任何时候都更需要为新旧应用程序添加功能丰富的地图。这类事情可能会令人望而生畏。这不仅仅是从视觉渲染地图的角度来看,而且仅 GIS 专业知识就足以使此类增强功能变得昂贵。有了 Map Suite,这一切变得容易,您无需 GIS 学位。
(注意:本文档涵盖了 Map Suite 的 Winforms 版本,但对于 Webforms (ASP.NET) 版本,大多数概念和所有示例代码都是相同的。)
您的第一张地图
下载并安装 Map Suite 试用版后,打开 Visual Studio.NET,创建一个新的 Windows 应用程序,并将 Map Suite Map Control 添加到您的工具箱中。您可以通过使用“添加/删除项”功能并浏览 Map Suite 安装目录中的 winformsedition.dll 文件来实现此目的。(默认情况下,它是 C:\Program Files\Spatially Aware\[安装的版本]\)。添加完成后,您可以简单地将 Map Control 拖放到 Windows Form 上,现在您就可以创建地图了。使用 Map Suite 随附的墨西哥示例数据,我们可以快速创建一张新地图,并让 Map Suite 使用其默认设置进行渲染。下面的代码实现在 Form 的 Load
方法中。
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Map1.Layers.Add(New MapSuite.Layer( _
"C:\Program Files\Spatially Aware\[YOUR MAPSUITE VERSION]\SampleData\Mexico\
states.shp"))
Map1.Refresh()
End Sub
(注意:Map Suite 使用的数据是 ESRI Shape File 格式的数据,包括矢量 .shp 文件、索引 .shx 文件和数据 .dbf 文件。这三个文件都用于帮助渲染地图的形状并提供相关数据。有关 Shape Files 的更多信息,请访问 此处。)
如果编译代码并运行示例,您将看到一张墨西哥各州的地图。请注意,Map Suite 选择了一个任意颜色,如果您停止并再次运行应用程序,您将看到另一个随机颜色。这是因为您还没有告诉 Map Suite 如何渲染您刚创建的图层,所以它会自己决定使用什么颜色。
阈值和符号渲染器
要使地图按照您期望的方式渲染,您可以使用阈值(Thresholds)和符号渲染器(Symbol Renderers)。阈值是指从左到右可见的距离。为了更好地理解这一点,请想象一个玻璃底电梯,当您在地球的某个区域上空上下移动时,您可能会看到地板可见区域内的景象。当您向上或远离时,您可以看到某个区域的更多部分,但细节较少。可以定义阈值,使其具有上限和下限,以便它们知道何时渲染地图的特定要素。符号渲染器告诉阈值如何渲染,例如蓝色边框和黄色填充。稍后将详细介绍阈值和 SymbolRenderers
。
地图单位和阈值单位
为了使地图的阈值正常工作,了解地图的测量单位非常重要。虽然这很容易做到,但如果设置不当,可能会导致地图渲染不符合预期或根本不渲染。我们以墨西哥 Shape File 为例。Shape File 的地图单位通常是三种测量单位之一:十进制度数、米或英尺。我们的墨西哥 Shape File 使用的是十进制度数,因此我们将相应地设置 MapUnit 属性。
Map1.MapUnit = Geometry.MapLengthUnits.DecimalDegrees
正确设置后,我们就可以使用我们习惯的测量单位进行操作,例如英里,Map Suite 将自动提供正确的转换,因为我们正在使用阈值和其他功能,例如空间查询。
下一步是声明一个图层(Layer)添加到地图中,以便我们可以设置一些属性。
Dim mexicoLayer As New Layer( _
"C:\Program Files\Spatially Aware\[YOUR MAPSUITE VERSION]\SampleData\Mexico
\states.shp")
现在让我们创建一个 Threshold
来控制我们图层的外观以及何时渲染。请记住,我们的阈值将告诉我们它应该在什么范围内显示。创建一个新的阈值,并在构造函数中提供一个上限和下限值。
Dim mexicoThreshold As New Threshold(2100, 0)
现在您需要提供有关 Map Suite 如何渲染地图的信息。这就是 SymbolRenderer
的作用。一个阈值拥有一系列符号渲染器。让我们添加一个新的,使我们的边框为蓝色,填充区域为黄色。
mexicoThreshold.SymbolRenderers.Add(
New SymbolRenderer(New AreaSymbol(New Pen(Color.Blue),
New SolidBrush(Color.Yellow))))
在上面的代码中,一个新的 SymbolRenderer
被添加到阈值的 SymbolRenderers
集合中。在构造函数中,您可以传递一个 BaseSymbol
。BaseSymbol
类是 AreaSymbol
(多边形)、LineSymbol
(线)和 PointSymbol
(点)的超类。由于墨西哥 Shape File 是一个多边形图层,因此我们使用新的 AreaSymbol
并为其提供一个新的 Pen 和 SolidBrush
对象。如您所见,我们将 Pen 设置为蓝色,将填充的 SolidBrush
区域设置为黄色。
现在您已经有了 Threshold
和 SymbolRenderer
,您需要告诉 Map Suite 您想使用什么测量单位,并将其添加到我们声明的图层中。
mexicoLayer.ThresholdUnit = Geometry.ThresholdUnits.miles
mexicoLayer.Thresholds.Add(mexicoThreshold)
下面是我们 Form 的 Load() 方法的完整代码。
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Map1.MapUnit = Geometry.MapLengthUnits.DecimalDegrees
Dim mexicoLayer As New Layer( _
"C:\Program Files\Spatially Aware\[YOUR MAPSUITE VERSION]\SampleData\Mexico
\states.shp")
Dim mexicoThreshold As New Threshold(2100, 0)
mexicoThreshold.SymbolRenderers.Add(New SymbolRenderer( _
New AreaSymbol(New Pen(Color.Blue),
New SolidBrush(Color.Yellow))))
mexicoLayer.ThresholdUnit = Geometry.ThresholdUnits.miles
mexicoLayer.Thresholds.Add(mexicoThreshold)
Map1.Layers.Add(mexicoLayer)
Map1.Refresh()
End Sub
编译并运行示例代码,您的地图应该如下所示进行渲染。
地图导航
现在地图已经按照您期望的方式渲染,您可以通过缩放、平移、跟踪缩放等操作来导航地图。您只需一行代码即可完成此操作。在 Windows Form 中添加三个按钮,分别命名为“放大”、“缩小”和“平移”。为每个按钮添加如下代码。
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Map1.ZoomIn(40)
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button2.Click
Map1.ZoomOut(40)
End Sub
Private Sub Button3_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Button3.Click
Map1.Mode = Winforms.ModeType.Pan
End Sub
如您所见,导航地图的代码非常直观。Map 的 ZoomIn
和 ZoomOut
方法都接受一个百分比,表示每次调用时地图应改变的程度。Map 的 Mode 属性可以设置为 Winforms.ModeType 枚举中定义的各种值。
让我们添加 TrackZoomIn
功能,以便我们可以选择地图的某个区域并快速放大。在 Windows Form 中添加第四个按钮,并将其命名为“跟踪缩放”。
Private Sub Button4_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button4.Click
Map1.Mode = Winforms.ModeType.TrackZoomIn
End Sub
[这对于在地图上导航非常有用,但如果您想快速返回到地图的起始点(完整范围)怎么办?这同样简单。在 Windows Form 中添加第五个按钮,并将其命名为“完整范围”:]
添加更多图层
现在您已经有了一张可用的墨西哥地图,您可以添加更多图层来增强地图。让我们为城市添加一个新的图层,这些城市将在地图上显示为点。
Dim mexicoCitiesLayer As New Layer( _
"C:\Program Files\Spatially Aware\[YOUR MAPSUITE VERSION]\SampleData\Mexico
\cities.shp")
现在我们需要为新图层创建一个阈值,以告诉它如何以及何时渲染。
Dim mexicoCitiesThreshold As New Threshold(1000, 0)
mexicoCitiesThreshold.SymbolRenderers.Add(New SymbolRenderer(_
New PointSymbol(PointStyleEnum.Circle, New Pen(Color.Navy), _
New SolidBrush(Color.White), 8)))
mexicoCitiesLayer.ThresholdUnit = Geometry.ThresholdUnits.miles
mexicoCitiesLayer.Thresholds.Add(mexicoCitiesThreshold)
请务必将新图层添加到地图中。
Map1.Layers.Add(mexicoCitiesLayer)
这段代码有几点需要注意。首先,上限阈值设置为 1000。这意味着,当放大到地图的这个点时,阈值才会渲染。如果您运行示例,您将不会看到墨西哥的城市渲染出来,直到您达到定义的范围。其次,我们的 SymbolRender
接受了 PointSymbol
类型的参数,因为我们在 Shape File 中处理的是点。
既然有了城市,最好给它们加上标签,这样我们就能分辨出哪个是哪个城市。这可以在 Map Suite 中使用 LabelRenderer 来完成。
mexicoCitiesThreshold.LabelRenderers.Add(New LabelRenderer("NAME", _
New TextSymbol(New Font("Arial", 10),
New SolidBrush(Color.Black))))
上面的代码访问 Shape File 的关联 DBF 数据文件,并获取名为 'NAME' 的列中的数据。然后,它使用 TextSymbol,在其构造函数中包含 Font 和 SolidBrush 对象,来创建标签并将其放置在地图上。
摘要
如您所见,要创建一个功能齐全的地图非常容易,而且代码量很少。这个示例仅触及了 Map Suite 的基本用法。由于其核心是 GDI+ 的强大功能,并且 API 是为普通开发人员设计的,无需 GIS 知识,因此可能性是无限的。
其他资源
有几种其他资源可以帮助您快速开始使用 Map Suite,并为您的 .NET 应用程序添加功能丰富的地图。
示例应用程序
当您下载试用版时,Map Suite 包含 40 多个示例应用程序,其中包含源代码,展示了如何使用 Map Suite 组件执行各种操作。仔细研究这些示例和代码非常有益。同时提供 VB.NET 和 C# 版本。
Map Suite Render USA
如果您需要一张功能齐全、准备就绪的美国地图,您可以在其基础上构建您的业务应用程序,那么 Map Suite Render USA 就是为您准备的。Map Suite Render USA 是 Map Suite 的一个插件,它自动化了整个过程,并创建了从州到全美街道网络的无缝视图。只需几行代码,您就可以通过 Winforms 或 Webforms 版的地图控件,立即拥有一个美国的地图应用程序。这样,您就可以花费很少的时间在地图上,而将更多的时间用于处理应用程序的业务流程。
在线查看 Map Suite Render USA 的实际效果
讨论论坛
Map Suite 讨论论坛是解答您所有 Map Suite 开发问题的绝佳场所。Spatially Aware 支持团队每天都会监控论坛,并帮助您成功使用 Map Suite。