1

我有一张马里兰州的 Shapefile 地图,用邮政编码分隔。我想做的是根据我在数据库中查找的值为每个区域着色。目前,我正在使用带有 SharpMap 包的 ASP.NET。基本问题是:

1)如何将形状与其邮政编码相关联? 我可以使用 SharpMap 的 ExecuteIntersectionQuery 生成邮政编码列表,并将 BoundingBox 设置为地图的范围,但我不知道如何将结果表的每一行与其代表的形状连接起来。

2)一旦我可以访问单个形状并知道我想要什么颜色,我如何将颜色分配给形状? 在 SharpMap 中,我可以为 VectorLayer 着色,但 VectorLayer 是从源 .shp 文件生成的,而不是形状。

我愿意使用除 SharpMap 之外的其他免费地图包(所以没有 ArcGIS),但出于法律原因,我不能使用 GoogleMaps。

我觉得这应该是相对简单的,但是试图为 SharpMap 找到任何像样的资源是相当困难的。

编辑:好吧,我只是通过阅读有哪些文档来完成很多过程。通过设置 ShapeFile 的 FilterDelegate,我可以使图层仅包含邮政编码与某个值匹配的行。现在我唯一的问题是让委托过滤器每次都寻找不同的邮政编码。除了 FeatureDataRow 之外,我可以传递另一个参数吗?我应该求助于全局变量吗?

4

1 回答 1

2

您需要使用主题来执行此操作。

我假设您已经有一些代码可以配置您的地图及其图层。您的 shapefile 是 VectorLayer。

VectorLayer shapefileLayer = GetMyShapefileLayer();
shapefileLayer.Theme = new SharpMap.Rendering.Thematics.CustomTheme(GetStyleForShape);

然后,每次地图需要渲染样式时,都会调用 GetStyleForShape 方法。它看起来像这样:-

private SharpMap.Styles.VectorStyle GetStyleForShape(SharpMap.Data.FeatureDataRow row, SharpMap.Layers.Layer layer)
    {
}

在该方法中,您创建并返回一个 VectorStyle。与它试图呈现的特征关联的表数据作为参数传递给此方法。

因此,您可以使用 row 参数来获取您的邮政编码,执行您需要执行的任何逻辑来计算其样式,配置该样式并返回它。

这个方法(可能)被调用了很多,所以考虑存储样式并重用它们,而不是每次都重新创建它们。

希望这可以帮助。

于 2011-07-07T15:10:30.460 回答