问题标签 [arcgis]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
4506 浏览

c# - 线程和 ArcGIS

我刚刚偶然发现了 Backgroundworker 对象,它似乎是我正在寻找的工具,可以让我的 GUI 在执行计算时做出响应。我正在为 ArcGIS 编写 IO 插件。

我正在 ArcGIS 之外进行一些数据处理,使用 backgroundworker 可以正常工作。但是当我将数据插入 ArcGIS 时,后台工作人员似乎将持续时间增加了 9 倍左右。将处理代码放在 DoWork 方法之外,可以将性能提高 9 倍。

我在网上读过这几个地方,但我没有多线程编程的经验,而且像 STA 和 MTA 这样的术语对我来说毫无意义。链接文本 我也尝试使用简单的线程实现,但结果相似。

有谁知道我可以做些什么才能使用 ArcGIS 处理和维护响应式 GUI?

编辑:我已经包含了我与后台工作人员交互的示例。如果我将 StartImporting 方法中的代码放在 cmdStart_Click 方法中,它的执行速度会快得多。

亲切的问候,卡斯帕

0 投票
1 回答
276 浏览

gis - 您如何从数据中计算出太阳漫射比例和透射率值?

数据可以在这里找到:

http://rrdc.nrel.gov/solar/old_data/nsrdb/bluebook/data/24283.SBF

我如何从那里计算出太阳漫射比例和透射率值?

有人知道吗?

谢谢!

0 投票
4 回答
11958 浏览

c# - BackgroundWorker OnWorkCompleted 抛出跨线程异常

我有一个用于数据库分页的简单 UserControl,它使用控制器来执行实际的 DAL 调用。我使用 aBackgroundWorker来执行繁重的工作,并在OnWorkCompleted事件中重新启用某些按钮、更改TextBox.Text属性并为父表单引发事件。

表单 A 包含我的用户控件。当我单击打开表单 B 的某个按钮时,即使我没有在“那里”做任何事情并关闭它,并尝试从我的数据库中引入下一页,OnWorkCompleted在工作线程(而不是我的主线程),并引发跨线程异常。

目前我InvokeRequired在那里的处理程序处添加了一个检查,但不是OnWorkCompleted要在主线程上调用整个点吗?为什么它不能按预期工作?

编辑:

我设法将问题缩小到 arcgis 和BackgroundWorker. 我有以下解决方案,它向 arcmap 添加了一个命令,Form1用两个按钮打开一个简单的命令。

第一个按钮运行BackgroundWorker睡眠 500 毫秒并更新计数器。在RunWorkerCompleted方法中它检查InvokeRequired并更新标题以显示该方法最初是在主线程还是在工作线程中运行。第二个按钮刚刚打开Form2,其中不包含任何内容。

起初,所有的调用RunWorkerCompletedare都是在主线程内进行的(正如预期的那样——这就是 RunWorkerComplete 方法的全部要点,至少我从MSDN上了解到的BackgroundWorker

在打开和关闭之后Form2RunWorkerCompleted总是在工作线程上被调用。我想补充一点,我可以让这个问题的解决方案保持原样(InvokeRequiredRunWorkerCompleted方法中检查),但我想了解为什么它会违背我的期望。在我的“真实”代码中,我想始终知道该RunWorkerCompleted方法是在主线程上调用的。

我设法form.Show();在我的命令中指出问题BackgroundTesterBtn- 如果我ShowDialog()改用,我没有问题(RunWorkerCompleted总是在主线程上运行)。我确实需要Show()在我的 ArcMap 项目中使用,这样用户就不会被绑定到表单。

我还尝试在普通的 WinForms 项目中重现该错误。我添加了一个简单的项目,它只打开没有 ArcMap 的第一个表单,但在那种情况下,我无法重现错误 - 在RunWorkerCompleted主线程上运行,无论是我使用Show()还是ShowDialog()打开之前和之后Form2。我尝试在 my 之前添加第三种形式作为主要形式Form1,但它并没有改变结果。

是我的简单 sln (VS2005sp1) - 它需要

ESRI.ArcGIS.ADF(9.2.4.1420)

ESRI.ArcGIS.ArcMapUI(9.2.3.1380)

ESRI.ArcGIS.SystemUI (9.2.3.1380)

0 投票
1 回答
327 浏览

c# - ArcMap 和 BackgroundWorkerThread

我在这里读到我应该在 ArcMap 中工作时坚持使用 STA 线程。我使用的是普通BackgroudnWorker的,我的代码运行得很慢。我正在尝试更改它,以便工作人员在内部创建一个 STA 线程并让它在“重”的东西上运行。

我现在的问题是,在第二个线程完成工作后,我所有的 com 对象都被释放了。我检查了我是否有某种 marshal.RelaseComObject 或 Shutdown 调用,但我不认为是这种情况。难道是我只是因为检索那些 com 对象的线程已经运行完毕,对象正在被自动释放?

这是我的代码示例:

在第 22 行,在 ProcessSelection 调用之后,controller.List[0] 包含一个有效的 com 对象。在第 11 行,在 thread.Join 调用之后,controller.List[0] 元素已经包含一个已发布的 com 对象。我在这里做错了什么?

0 投票
2 回答
1022 浏览

java - 哪个开源 Python 或 Java 库提供了一种在 ESRI Shapefile 上绘制圆圈的简单方法?

我需要编写一个软件来创建一个带有各种圆圈或圆周的 shapefile。创建的 shapefile 应该可以被 ESRI ArcMap 读取。

我需要一个库,可以让我在其中添加圆或圆弧。

该库可以用于 Python 或 Java。

0 投票
3 回答
3818 浏览

gis - 有没有办法让图形文本在 ArcMap 中按比例缩放?

我正在使用此代码在 ArcMap 中创建文本。但是当你放大时,我似乎无法让它像注释文本一样缩放。

有谁知道如何做到这一点?

0 投票
2 回答
276 浏览

com - arcgis com 注册

我有几个类库,其中包含一些 ArcGIS 的命令和自动更新程序。到目前为止,每个库都包含一个安装程序类,我们有一个单独的安装项目,负责安装所有 dll。就像在这里一样。
我现在创建了另一个包含工具栏的库,它应该包含我们拥有的所有命令。该项目引用了其他项目,并且AddItem(来自BaseToolbar基类)正在使用AddItem(Type type)重载,使其全部为强类型,而不仅仅是基于字符串(用于 CLSID 或名称)。
当然,Toolbar 项目包含安装程序。我只是想知道更改建议的安装程序实现(来自上面的链接)是否是一个好主意,以便确保所有命令的 dll 都将被注册(迭代输出文件夹中的 dll 文件,并注册他们?有更好的方法吗?)
这会将安装问题从每个命令项目转移到一个集中的地方。我认为通过这种方式添加更多命令会更容易,因为我只需要从 Toolbar 项目中添加对它们的引用。这有意义吗,还是我应该坚持在每个项目中单独放置一个安装程序,然后将它们一个一个添加到安装项目中?

还有一件事——有没有一种简单的方法可以在 ArcMAP 中找到几个命令的来源?我有一些奇怪的类别(由这台机器上的过去用户创建),我想删除旧命令。

0 投票
1 回答
1055 浏览

gis - ArcGIS:标签仅以 10,000,000 比例呈现

我正在使用带有 Oracle 10.2g 数据库的 ArcGIS Server 9.3。我创建了一个包含我的要素类的 MXD,并将其配置为将其中一个属性显示为标签 - 要素类和标签都设置为在所有比例下都可见。

在 ArcMap 中,标签仅以 1:10,000,000 的比例显示 - 一旦我放大它们就会消失。

我正在以“非标准”方式做两件事:

  1. 要素类是通过 ArcCatalog 的地理数据库设计器插件导入模式来创建的 - 导入后我注册为版本,并将编辑移动到基础

  2. 我正在使用 sql 插入数据 - 如下所示:

因此,当在 ArcMap 中可视化时,我看到的点没问题,但只有在我放大到全范围时才会渲染标签。图层和标签设置为以所有比例显示。

有没有人在做类似的事情,或者你能建议任何修复吗?

0 投票
2 回答
169 浏览

c# - 我应该使用值还是键?

我正在使用一个类扭曲 ArcGIS IFeature 对象,该类具有我需要的属性以轻松获取和设置它们。基本上,get 和 set 操作只使用feature.get_value(index)and feature.set_value(indes, value),并暴露强类型值。
我有几个字段使用域(基本上是一个IDictionary<string, object>)来表示整个应用程序的公共属性。
起初我想我只会在我的包装类中使用域的键(它们是普通的 int 值),并在我的ToString()方法中使用域来转换为 UI 的字符串。
后来我发现我可以在我的应用程序中使用字符串(这使得传递空值更容易,因为实际的域字段大部分时间都可以为空),并且只更改这些字段的 getter 和 setter 以使用GetDomainValue(index)SetDomainValue(index, value)将在键和值之间转换到底层特征对象的方法。

你认为哪种方法更好?我认为字符串方法有点“持久无知”,因为我的班级不关心值是如何保存的,只关心它们的字符串表示。另一方面,它使代码稍微跳过循环——而不是返回特性中的内容,每个 getter 都需要迭代域。

0 投票
1 回答
450 浏览

c# - 在 ArcFM 许可证上使用 STAThread

我正在尝试将 ArcFM 与我的 ArcGIS 项目一起使用,但我发现了一个错误。如果我的主线程标有该[STAThread]属性,则程序会在退出时挂起并出现 OS Loader Lock 异常。当我删除该属性时,程序结束就好了。
以下代码挂起

这里有人见过吗?有什么我做错了吗?
我想我必须在 STAThread 上运行,否则我的所有 COM 调用将被编组到与主线程不同的线程。