4

我有这行简单的代码DotSpatial

var raster = Raster.OpenFile("X://Data//4mr_project.tif");

为什么栅格只得到空值?

我在同一目录中也有.aux, .ovr,文件。.tfw

编辑:

我发现下面的行工作正常:

var featureSet = FeatureSet.Open("X:\\Test Data\\shap\\edited.shp")

因为Dotspatial有能力.shp默认加载文件。但是加载栅格数据.tif格式,Dotspatial 需要GDAL扩展。现在的问题是如何GDALDotspatial使用C#.

4

2 回答 2

6

通过使用 AppManager 组件,可以在您自己的应用程序中支持 GDAL 扩展。您可以将其拖放到您的表单上。这允许来自 GDAL 数据扩展的支持,并且还将支持其他插件。这是将 AppManager 添加到表单上只有一个 Map 的新项目的基本演练。

1) 在 Visual Studio 工具箱中,右键单击并单击“选择项目”

选择项目

2) 从对话框中,选择“浏览”并浏览到 DotSpatial.Controls.dll 库。

点空间控件.dll

3) 根据需要单击确定关闭对话框并返回工具箱。

4)在Toolbox中找到刚刚添加的AppManager组件。

应用管理器

5) 将 AppManager 组件拖到您的表单上。(不是在地图上,而是在表格上)。一个新实例应出现在非可视组件列表中的表单下方。

6) 选择此组件以在“属性”对话框中查看其属性。

7)为appManager(或其他组件,如果您正在使用它们)设置地图。

定义地图

8)GDAL组件甚至不需要为了工作而定义地图,它应该可以工作。但是您将需要 GDAL 扩展。您可以在“Windows 扩展”文件夹中找到 DotSpatial.Data.Rasters.GdalExtension。确保您的输出目录中有一个类似的文件夹,其中包含必要的 GdalExtension。一种方法是手动确保它位于您的最终分发文件夹中。

9)(可选)您可以使用的一个技巧,以确保您的发布文件夹中有 GDAL 插件,就是将库添加为内容。这样,无论您是在使用调试版本还是发布版本,它都将确保 GDAL 数据扩展使其进入输出文件夹。

复制内容

10) 确保您正在使用的目录(如“Windows 扩展”)列在 AppManager 的 Directories 属性中。下图显示了默认文件夹,即“应用程序扩展”和“插件”。我认为它最初是“应用程序扩展”,但后来更新为“Windows 扩展”。不幸的是,我认为他们没有更新默认文件夹。

目录

11)在某处的代码中(可能在表单构造函数中),您需要调用 appManager1.LoadExtensions(); 如果您不调用它,即使您将 GDAL 库作为项目的一部分,它也不会实际加载 GDAL 扩展。

12)在项目中添加一个SpatialDockManager、SpatialHeaderManager、SpatialStatusStrip。然后将这些分配给 AppManager 上的属性,就像您绘制地图一样。由于我无法理解并在我离开后实施的原因,之前的开放式设计结构已经改变,现在如果程序不包含这些东西但你尝试使用扩展,它会抛出消息框错误。“ProgressHandler”属性采用 SpatialStatusStrip。

在完成所有 12 个步骤(并在 x86 模式下运行项目)之后,您在初始问题中发布的光栅代码可以正常工作,您可以打开 geotifs。我还在尝试使其工作时将 GDAL 扩展推送到根“应用程序扩展”目录中,但我认为您不必这样做。如果它位于子文件夹中,它应该可以工作。

于 2015-04-22T16:24:02.050 回答
2

很抱歉这么晚了(希望永远AppManager不会太晚),但是如果你想使用插件而不使用先进的“魔法”让它们协同工作),您可以自己完成以下几个简单的任务:DotSpatialAppManager

1)添加对文件的引用

(DotSpatial Release Folder)\Windows Extensions\DotSpatial.Data.Rasters.GdalExtension.dll

到您的项目(这是主要的GdalExtension插件输出文件)。

注意:为确保此步骤正确完成,请确保构建您的库(引用 的库GdalExtension.dll)最终将同一文件夹中的其他文件(即等)复制到该项目的输出目录。gdal_csharp.dll

2) 这个文件夹还包含一个gdal子文件夹。将文件夹本身按原样复制到您的输出路径(通常是...\bin\Release\\...\bin\Debug\\,具体取决于您的配置)。当然,在您的最终项目中,您可能希望使用构建后复制事件来自动化该过程,或者只是将文件夹作为内容包含在您的应用程序构建输出中,正如 Ted 在他的回答的第 9 步中提到的那样。

注意:通过输出文件夹,我指的是应用程序输出路径,而不是库输出路径。如果您的应用程序正在使用一个库,该库承担加载栅格的任务(通过GdalExtension),则该gdal文件夹不需要位于该库的输出文件夹中。它需要在最终应用程序的输出文件夹中结束。原因是各种 dll 文件是动态加载的,所以必须在执行的应用程序文件夹中找到它们。

3) 尽早在您的代码库中创建一个新的GdalRasterProvider,现在应该由步骤 1 中添加的 dll 文件引用。这意味着,在您的项目中添加类似于以下行的内容

var grp = new DotSpatial.Data.Rasters.GdalExtension.GdalRasterProvider();

此后,您帖子中的第一行代码应该可以按预期工作。因此,从技术上讲,原始问题的答案是DefaultDataManager该类没有找到任何合适的提供程序来执行实际加载 Raster 文件的任务。因此,您只剩下一个空变量。

有趣的是,您不需要在任何地方保存引用(即使用变量 grp 做任何事情)。如果查看源代码,构造函数本身承担了将自身添加到DefaultDataProvider.PreferredProviders字典中的任务,最终在调用Raster.Open(string)方法时在后台调用。唯一“难以解决”的部分是简单地复制应用程序输出路径中的 gdal 文件夹,因为 GDAL 扩展在实例化任何提供程序时加载位于其中的许多引用,并且加载基于“ gdal”子文件夹位于您的应用程序所在的任何文件夹中并从中执行。

(请注意,插件还包含另外两个提供程序(GdalImageProviderOgrDataProvider)。要使这两个工作,您需要实例化它们,还需要手动将它们添加到 的PreferredProviders字典中DefaultDataProvider,通常也在应用程序代码的早期阶段)

于 2019-06-09T01:56:41.790 回答