问题标签 [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.
c# - 线程和 ArcGIS
我刚刚偶然发现了 Backgroundworker 对象,它似乎是我正在寻找的工具,可以让我的 GUI 在执行计算时做出响应。我正在为 ArcGIS 编写 IO 插件。
我正在 ArcGIS 之外进行一些数据处理,使用 backgroundworker 可以正常工作。但是当我将数据插入 ArcGIS 时,后台工作人员似乎将持续时间增加了 9 倍左右。将处理代码放在 DoWork 方法之外,可以将性能提高 9 倍。
我在网上读过这几个地方,但我没有多线程编程的经验,而且像 STA 和 MTA 这样的术语对我来说毫无意义。链接文本 我也尝试使用简单的线程实现,但结果相似。
有谁知道我可以做些什么才能使用 ArcGIS 处理和维护响应式 GUI?
编辑:我已经包含了我与后台工作人员交互的示例。如果我将 StartImporting 方法中的代码放在 cmdStart_Click 方法中,它的执行速度会快得多。
亲切的问候,卡斯帕
gis - 您如何从数据中计算出太阳漫射比例和透射率值?
数据可以在这里找到:
http://rrdc.nrel.gov/solar/old_data/nsrdb/bluebook/data/24283.SBF
我如何从那里计算出太阳漫射比例和透射率值?
有人知道吗?
谢谢!
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
)
在打开和关闭之后Form2
,RunWorkerCompleted
总是在工作线程上被调用。我想补充一点,我可以让这个问题的解决方案保持原样(InvokeRequired
在RunWorkerCompleted
方法中检查),但我想了解为什么它会违背我的期望。在我的“真实”代码中,我想始终知道该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)
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 对象。我在这里做错了什么?
java - 哪个开源 Python 或 Java 库提供了一种在 ESRI Shapefile 上绘制圆圈的简单方法?
我需要编写一个软件来创建一个带有各种圆圈或圆周的 shapefile。创建的 shapefile 应该可以被 ESRI ArcMap 读取。
我需要一个库,可以让我在其中添加圆或圆弧。
该库可以用于 Python 或 Java。
gis - 有没有办法让图形文本在 ArcMap 中按比例缩放?
我正在使用此代码在 ArcMap 中创建文本。但是当你放大时,我似乎无法让它像注释文本一样缩放。
有谁知道如何做到这一点?
com - arcgis com 注册
我有几个类库,其中包含一些 ArcGIS 的命令和自动更新程序。到目前为止,每个库都包含一个安装程序类,我们有一个单独的安装项目,负责安装所有 dll。就像在这里一样。
我现在创建了另一个包含工具栏的库,它应该包含我们拥有的所有命令。该项目引用了其他项目,并且AddItem
(来自BaseToolbar
基类)正在使用AddItem(Type type)
重载,使其全部为强类型,而不仅仅是基于字符串(用于 CLSID 或名称)。
当然,Toolbar 项目包含安装程序。我只是想知道更改建议的安装程序实现(来自上面的链接)是否是一个好主意,以便确保所有命令的 dll 都将被注册(迭代输出文件夹中的 dll 文件,并注册他们?有更好的方法吗?)
这会将安装问题从每个命令项目转移到一个集中的地方。我认为通过这种方式添加更多命令会更容易,因为我只需要从 Toolbar 项目中添加对它们的引用。这有意义吗,还是我应该坚持在每个项目中单独放置一个安装程序,然后将它们一个一个添加到安装项目中?
还有一件事——有没有一种简单的方法可以在 ArcMAP 中找到几个命令的来源?我有一些奇怪的类别(由这台机器上的过去用户创建),我想删除旧命令。
gis - ArcGIS:标签仅以 10,000,000 比例呈现
我正在使用带有 Oracle 10.2g 数据库的 ArcGIS Server 9.3。我创建了一个包含我的要素类的 MXD,并将其配置为将其中一个属性显示为标签 - 要素类和标签都设置为在所有比例下都可见。
在 ArcMap 中,标签仅以 1:10,000,000 的比例显示 - 一旦我放大它们就会消失。
我正在以“非标准”方式做两件事:
要素类是通过 ArcCatalog 的地理数据库设计器插件导入模式来创建的 - 导入后我注册为版本,并将编辑移动到基础
我正在使用 sql 插入数据 - 如下所示:
因此,当在 ArcMap 中可视化时,我看到的点没问题,但只有在我放大到全范围时才会渲染标签。图层和标签设置为以所有比例显示。
有没有人在做类似的事情,或者你能建议任何修复吗?
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 都需要迭代域。
c# - 在 ArcFM 许可证上使用 STAThread
我正在尝试将 ArcFM 与我的 ArcGIS 项目一起使用,但我发现了一个错误。如果我的主线程标有该[STAThread]
属性,则程序会在退出时挂起并出现 OS Loader Lock 异常。当我删除该属性时,程序结束就好了。
以下代码挂起
这里有人见过吗?有什么我做错了吗?
我想我必须在 STAThread 上运行,否则我的所有 COM 调用将被编组到与主线程不同的线程。