在 C# 中生成地理参考图像

Posted

技术标签:

【中文标题】在 C# 中生成地理参考图像【英文标题】:Generating Geo-Referenced Images in C# 【发布时间】:2009-03-10 20:32:16 【问题描述】:

我想创建一些热图样式的图块,以使用 Open Layers 覆盖在我们的基础地图上。基本上,我想将一些边界框划分为一个网格,并根据样本中有多少点落在该网格正方形内,使用不同的颜色显示网格的每个正方形。

涉及的技术有 C#、OpenLayers、SQL Server 2008 和 GeoServer。

我的问题基本上是一种通用方法,我不确定该把凿子的尖端放在哪里。

我的最终目标是能够采用任意边界框,计算适合该边界框的 x 英里 x 英里网格,迭代单个点的集合并将它们分配给一个网格正方形或另一个这样我就可以计算每个网格正方形的点密度,然后根据密度为网格着色,然后使用 Open Layers 将其覆盖在 CloudMade 底图上。

任何帮助都将不胜感激,无论是整体还是任何部分。

【问题讨论】:

【参考方案1】:

如果您的边界框是轴对齐的,这相当简单。只需制作您的图像,然后手动为其创建一个世界文件。世界文件只有 6 行文本,您已经知道所需的一切(x 和 y 像素大小、左上角坐标)。

只要确保使用左上角像素的 CENTER,而不是框的角即可。

------ 下面是你制作世界文件的方法------

假设您的边界框的左上角为 203732x598374,并且您想要一个具有东边宽 200m西边和北边高 300m南边的矩形的图像。

您将制作一个具有适当像素数的图像,然后是一个包含以下 6 行的世界文件:

200
0
0
-300
203632
598524

这对应于:

200 == size of one pixel in X
0 == shear1
0 == shear2
-300 == size of one pixel in Y (from top down)
203632 == left edge - 1/2 pixel size (to center on pixel instead of edge of box)
598524 == top edge - 1/2 pixel size (to center on pixel instead of edge of box)

如果您使用 .png 图像,您需要以相同的名称保存它,但保存为 .pgw。如果您使用 .jpg,它将是 .jgw 等。

有关完整的详细信息,请参阅: Wiki on World Files

【讨论】:

轴对齐是什么意思? 轴对齐 == 您的“边界框”已设置,因此它与东和北对齐(与轴对齐)。这使得上述方法非常容易。如果不是,它仍然是可能的,但地理配准更加困难。如果您需要更多说明,请告诉我。 对齐是指左下角是X=0,Y=0吗?如果是这样,那将不太有效,因为我生成的图像将是整个地球 - 所以我可能误解了你:) 不——只是,当您沿 +X 移动时,您的 Y 值不会改变。例如,如果图像的左上角位于 1182893,1987317,则右上角的 Y 也位于 1987317。左边缘的 X 必须是常数,上边缘的 Y 是常数。 (基本上,矩形没有旋转)【参考方案2】:

“将一些边界框划分为网格,并根据样本中有多少点落在该网格正方形内,使用不同的颜色显示网格的每个正方形。”这是一个栅格,GeoServer 中有features 用于通过颜色阴影、图例等显示这些。我认为使用这些功能会比在 C# 中创建图像图块更灵活。

来自 GeoServer 文档:

栅格数据不仅仅是一张图片, 而是可以将其视为网格 地理参考信息,很多 就像一个图形是一个视觉网格 信息(与红色组合, 绿色和蓝色)。与图形不同, 仅包含视觉数据,每个 栅格网格中的点/像素可以有 许多不同的属性,具有 可能他们都没有 固有的视觉组件。

这在其他 GIS 软件包中也称为专题图或等高线图或热图或 2.5D 图。

您可以使用免费的 GIS,例如 Grass 到 create 栅格网格,但根据您的描述,您不需要插值(因为每个单元格至少包含一个点),因此它可能同样容易滚动你自己的代码。

编辑:有一个开源库GDAL,您可以使用它在various formats 中编写光栅文件。有 C# 绑定。

【讨论】:

优秀的资源,谢谢。这是我想要的信息。【参考方案3】:

我认为计算左上像素中心的公式是错误的。在该示例中,左上角像素的中心将位于 (203732,598374) 的右下方。那么不应该是下面这个吗?

203832 == left edge + 1/2 pixel size (to center on pixel instead of edge of box)
598224 == top edge - 1/2 pixel size (to center on pixel instead of edge of box)

【讨论】:

以上是关于在 C# 中生成地理参考图像的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中生成 ALPHANUMERIC 优惠券代码? [复制]

在ios中生成PDF文件[重复]

在ios中生成imageview后如何设置图像?

使用 JWT 在 c# 中生成令牌的无效签名

在 C# 中生成随机数 [重复]

尝试在 C# 中生成按钮