首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dotspatial中FilePath的栅格数据加载

Dotspatial中FilePath的栅格数据加载
EN

Stack Overflow用户
提问于 2015-03-18 12:31:06
回答 2查看 5.3K关注 0票数 4

我在DotSpatial中有这一行简单的代码

代码语言:javascript
复制
var raster = Raster.OpenFile("X://Data//4mr_project.tif");

为什么光栅只得到空值??

我还在同一个目录中有.aux.ovr.tfw文件。

编辑:

我发现下面的线很好用:

代码语言:javascript
复制
var featureSet = FeatureSet.Open("X:\\Test Data\\shap\\edited.shp")

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

EN

回答 2

Stack Overflow用户

发布于 2015-04-22 16:24:02

通过使用AppManager组件,可以在您自己的应用程序中支持GDAL扩展。您可以将其拖放到窗体上。这允许来自GDAL数据扩展的支持,也将为其他插件提供支持。下面是将AppManager添加到表单上只有Map的新项目的基本步骤。

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

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

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

4)找到刚才添加到工具箱中的AppManager组件。

5)将AppManager组件拖到窗体上。(不是在地图上,而是在表格上)。新实例应出现在窗体下面的“非可视组件”列表中。

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

7)为appManager设置映射(如果正在使用它们,则设置其他组件)。

8) GDAL组件甚至不需要定义Map才能工作,它应该能够正常工作。但是你需要GDAL扩展。您可以在"Windows“文件夹中找到DotSpatial.Data.Rasters.GdalExtension。确保输出目录中有一个具有必要GdalExtension的类似文件夹。一种方法是确保这是在您的最终分发文件夹手动。

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

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

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

12)在项目中添加一个SpatialDockManager、SpatialHeaderManager、SpatialStatusStrip。然后将这些分配给AppManager上的属性,就像映射一样。由于我无法理解的原因,以及我离开后实现的原因,以前的开放式设计结构已经改变,现在如果程序不包括这些东西,但是您尝试使用扩展,它将抛出消息框错误。"ProgressHandler“属性接受SpatialStatusStrip。

在遵循所有这些步骤(并以x86模式运行项目)之后,您在初始问题中发布的栅格代码可以工作,您可以打开geotifs。我还将GDAL扩展推入根“应用程序扩展”目录,同时试图让它正常工作,但我认为您不必这样做。如果它在子文件夹中,它应该可以工作。

票数 6
EN

Stack Overflow用户

发布于 2019-06-09 01:56:41

很抱歉这么晚了(希望永远不会太晚),但是如果您希望在不使用AppManager的情况下使用插件,因为您可能正在编写一些自定义的东西,并且不希望依赖于主要的DotSpatial应用程序框架(请注意,AppManager使用了一些稍微先进的“魔法”来使它一起工作),您可以完成以下几个简单的任务:

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)。要使这两种方法发挥作用,您需要实例化它们,还需要手动将它们添加到DefaultDataProviderDefaultDataProvider字典中,通常也会在应用程序代码的早期出现)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29122130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档