当前位置: 首页 > 编程日记 > 正文

程序编辑SHP文件并应用更改到数据源

在上一篇Blog中峻祁连介绍了在Map 3D中通过程序删除图层及数据源的方法,并且卖了个关子,这个方法还有另外一个妙用,今天就简单介绍一下。对数据源的编辑估计是Map 3D开发中最常见的功能了,包括对添加、删除和修改要素。这里以删除要素为例介绍。下面的代码实现了使用Map 3D API来删除地图上选中的要素。

    [CommandMethod("DeleteSelectedFeatures", CommandFlags.UsePickSet| CommandFlags.Modal | CommandFlags.Redraw)]public void DeleteSelectedFeatures(){Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;MgFeatureService _featureService = AcMapServiceFactory.GetService(MgServiceType.FeatureService) as MgFeatureService;PromptSelectionResult res = ed.SelectImplied();if (PromptStatus.OK == res.Status){// Convert the SelectionSet to MgSelectionBase // using AcMapFeatureEntityService. Debug.Assert(res.Value != null);ObjectId entityID = res.Value[0].ObjectId;int entitytype = AcMapFeatureEntityService.GetEntityType(entityID);if (entitytype == EntityType.BulkEntity){MgSelectionBase curSelection = AcMapFeatureEntityService.GetSelection(res.Value);foreach (MgLayerBase layer in curSelection.GetLayers()){string filter = curSelection.GenerateFilter(layer, layer.FeatureClassName);if (filter != ""){MgFeatureCommandCollection featCommands =new MgFeatureCommandCollection();string strclassName = layer.FeatureClassName;MgDeleteFeatures delFeat =new MgDeleteFeatures(strclassName, filter);featCommands.Add(delFeat);try{AcMapLayer aclayer = layer as AcMapLayer;MgPropertyCollection pProps = aclayer.UpdateFeatures(featCommands);// save and update the layer, commit the changes,
// 注意这里,必须要通过下面的代码来checkin来应用对数据源的更改
MgFeatureQueryOptions opt = new MgFeatureQueryOptions();// build the filter string, this is required for // data source such as Sql Server/Oracle... String commitFilter = "";if (aclayer.IsCached()&& EditMode.EditSet == aclayer.EditMode){commitFilter = ClassSystemProperties.FeatureStatus+ " = "+ ClassSystemProperties.FeatureStatusDeleted;}opt.SetFilter(commitFilter);//This is a mustaclayer.SaveFeatureChanges(opt);aclayer.ForceRefresh();}catch (Autodesk.AutoCAD.Runtime.Exception ex){ed.WriteMessage(ex.Message);}}}//remove the highlight AcMapFeatureEntityService.UnhighlightFeatures(curSelection);}}}

下面是执行时的截图,首先用鼠标选中一些要素,然后执行自定义命令DeleteSelectedFeatures

image

执行结束后,选用的要素被成功删除。

image

这个例子中我使用的FDO Provider for SHP连接到SHP文件。下面是上面自定义命令执行之前,注意一下shp相关文件的日期。

image

下面是DeleteSelectedFeatures执行完毕后,注意到Shp文件的相关变化,其中*.dbf文件是日期发在了变化,但*.shp文件并没有变化。即上面的代码并没有对*.shp进行更改。

image

也许有人会说,这是个Map 3D的bug,他们的证据就是这时在ArcGIS中打开shp文件,发现刚才在Map 3D中删除的要素还是ArcGIS中显示,好像并没有被删除。其实不然。根据DBF规范,DBF保存属性信息和删除标志,SHP文件也采用了这个DBF规范。shp文件中被删除的geometry只在DBF中做删除标记。Map 3D的确对DBF文件做了更改,即按照规范添加了删除标志。但不知道为什么ArcGIS并没有遵守DBF规范,而忽略了该删除标志,所以在ArcGIS查看时中你会认为该要素没有删除。下面是DBF规范相关点的摘录:

http://www.dbf2002.com/dbf-file-format.html

Note   The data in dbf file starts at the position indicated in bytes 8 to 9 of the header record. Data records begin with a delete flag byte. If this byte is an ASCII space (0x20), the record is not deleted. If the first byte is an asterisk (0x2A), the record is deleted. The data from the fields named in the field subrecords follows the delete flag.

尽管不是Map 3D的错,但ArcGIS作为业内占统治地位的GIS软件,我们也得迁就一下,有什么办法在Map 3D中更改的结果也能让ArcGIS显示出来呢? 答案就是不但要按照DBF规范添加删除标记,同时还要压缩shp文件。目前在Map 3D中还没有这样的API来压缩shp文件来反应要素变化,不过可以用下面的workaround,就是关闭到shp文件的连接(必要时再按照BuildMap中的例子再创建连接)。当FDO连接关闭时,Map 3D会压缩shp文件,从而让ArcGIS也能检验到变化。压缩shp文件这个过程比较耗时,这也是Map 3D只是在关闭连接时才做这一步的原因。如果你要求你在Map 3D中的更改能更快的体现在ArcGIS中,就需要手动来关闭连接让Map 3D强制压缩shp。

关闭连接的代码我们已经上一篇博客Map 3D中通过程序删除图层及数据源中介绍过了。这里还是把代码贴一下:

    [CommandMethod("CloseConnection")]public void CloseConnectionForLayer(){RemoveLayer("Layer1");}public void RemoveLayer(string layerName){Document doc = Application.DocumentManager.MdiActiveDocument;Editor ed = doc.Editor;Database db = doc.Database;AcMapMap map = AcMapMap.GetCurrentMap();// remove the layervar layers = map.GetLayers();if (!layers.Contains(layerName)){ed.WriteMessage("\nLayer does not exist: " + layerName);return;}MgLayerBase layer = layers.GetItem(layerName);layers.Remove(layer);// remove the layer resourceMgResourceIdentifier identifier = layer.LayerDefinition;MgResourceService resourceService= AcMapServiceFactory.GetService(MgServiceType.ResourceService)as MgResourceService;if (resourceService.ResourceExists(identifier))resourceService.DeleteResource(identifier);// remove the feature sourceidentifier = new MgResourceIdentifier(layer.FeatureSourceId);if (resourceService.ResourceExists(identifier))resourceService.DeleteResource(identifier);}
 

上面的代码会从地图中删除图层,并且关闭下图中的DataConnection。

image

执行完毕,你会发现shp文件的日期已经反正了变化,这是在arcGIS中查看就可以看到修改后的效果了。

image

好了,希望对你有帮助。

还有更详细的信息请同时看看这个http://adndevblog.typepad.com/infrastructure/2012/08/remove-the-discrepancy-between-arcviewarcgis-and-map-3d-when-deleting-features.html

转载于:https://www.cnblogs.com/junqilian/archive/2012/08/06/2625172.html

相关文章:

目录树结构改变后刷新目录树

主界面中含有一个目录树(是将一个目录下所有的文件和子文件呈现成一个可以逐级展开的树),我将树的功能单独写成一个FileTree.class,这样能够让目录树处理更清晰些。第一次我的做法是:将建立TreeViewer和Tree写在FileTr…

Docker - 在CentOS7.5中升级Docker版本

1 - 检查当前版本 [rootlocalhost ~]# uname -a Linux localhost.localdomain 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux [rootlocalhost ~]# [rootlocalhost ~]# cat /etc/system-release CentOS Linux release 7.5.1804 (C…

编码的细微区别

在编程学习的深入后,不可避免的会遇到ANSI、GB2312、UTF8的编码问题,如果不彻底了解他们的区别,都最终会造成一个问题--乱码!想要更好的了解编码,我们首先应该了解编码的历史演变。 在继续学习之前先明白一下转化关系吧…

Axel之 -axel_do剖析

axel_do主体部分,尝试从多个连接select方式去读取数据,如果读取失败或者连接超时就重新连接。 下面是代码分析. //下载的主循环void axel_do( axel_t *axel ){ fd_set fds[1]; int hifd, i; long long int remaining,size; …

win10键盘全部没反应_Win10笔记本键盘失灵怎么办 Win10键盘失灵解决方法【详解】...

相信现在已经有很多朋友都已经成功升级了win10正式版,不过最近有用户反映,升级Win10笔记本键盘失灵怎么办?下面迅维小编整理了一些常见的原因与解决办法,供大家参考尝试解决。Win10笔记本键盘失灵的原因一1、没有开启小键盘很多笔记本都带有…

基于链接的排序算法

基于链接的排序算法似乎已广泛应用到各种商业seohua.net”> 搜索引擎中。为了让设计出来的网站能够在各种搜索引擎中获得较高排名,设计者们应该知道这些算法的原理。Google排名的成功意味着PageRank算 法值得特别的关注。PageRank算法是少数几个公开的排序算法之…

Spring Boot配置全局异常捕获

1 SpringBoot配置全局的异常捕获 项目的说明 配置thymeleaf作为视图模板ExceptionController.java模拟测试用MyAjaxExceptionHandler.java捕获到异常以ajax形式返回MyExceptionHandler.java捕获到异常以页面形式返回ajaxerror.html这个是测试返回ajax异常的页面error.html以页面…

一步一步Asp.Net MVC系列_权限管理总结(附MVC权限管理系统源码)

TZHSWEET:请大家多多反馈问题,我已经在修改中了,已更新版本。。。。。。 如果大家遇到数据库附加问题,EF连接字符串问题,请自行配置,如果有bug反馈可以私聊,我的qq:409180955。 项目已经发布到G…

电脑壁纸励志_励志壁纸 | 要乖 要长大 要努力 要不负众望

全世界只有不到1%的人关注了壁纸阿姨你真是个特别的人2020.4.17要乖 要长大 要努力 要不负众望励志壁纸全文字数:236阅读时间:1分钟图片数目:361“我不懂什么年少轻狂,我只知道胜者为王。”点击图片 长按保存高清原图♥2“愿你以渺…

ubuntu自定义命令

ubuntu中通过alias可以自定义快捷命令 在.bashrc中加入alias指令可以定义快捷命令,以下为我常用快捷命令 alias watwatch -n 1 nvidia-smi alias gohomecd /home/B/gaoye alias cdcodecd /home/B/gaoye/code 转载于:https://www.cnblogs.com/yeran/p/11367988.html

OSPF LSA 类型

路由器LSA:每台路由器都创建1类LSA,用于向连接的每个区域描述自己,在每台路由器中,每个区域的LSDB都包含一个1类LSA,它指出了当前路由器的RID和所有接口的IP地址。1类LSA还用于描述末节网络。网络LSA:每个中…

配件商城项目总结

---恢复内容开始--- 一、在首页导航栏上有一个自动摇晃的手机图标 ,而我一开始设置的是悬浮摇晃 由于将悬浮设置在图片外面的容器(a)上导致效果没出来,而且动画效果一直没出来。 解决方法:将悬浮改成自动播放&#xff…

006本周总结报告

这周基本学完了java的基础中的基础,还不会灵活的应用,相关概念仍然有些模糊。为此,自己将自己学到的知识点做了下系统的复习,并作了相关的笔记。这周编程的大部分时间主要用于小学期PTA的编程作业中(用C语言&#xff0…

excel小写转大写公式_【Excel函数贴】五个技巧性函数小套路

来吧 来吧 来吧 一起舞蹈 什么烦恼可以将我打扰…………1,字母大小写。一个做外贸的朋友问,Excel有没有函数可以把英文从小写变大写?他可能碰到蛮多洋人的人名或者货名需要大小写转换的。小写转大写:UPPER("excel")大写…

DevExpress A field with the name '' was not found on the selected data source.

绑定控件时发现的错误,找了很久终于找到原因了,可能也是大家没注意的地方,希望能给大家带来一些帮助。 自己在找的时候发现,明明是有的。 结果应该是这样的 上面定义实体类的字段写法有缺陷 这样再重新编译运行后就不会出错了。转…

刚申请了Blog,首贴庆祝!

刚申请了Blog,首贴庆祝!转载于:https://www.cnblogs.com/ele-eye/archive/2011/11/17/2252654.html

ReentrantLock实现原理分析

ReentrantLock主要利用CASCLH队列来实现。它支持公平锁和非公平锁,两者的实现类似。 CAS:Compare and Swap,比较并交换。CAS有3个操作数:内存值V、预期值A、要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修…

python编码

Unicode字符集中收录110多万个字符集合。UTF-8(8-bit Unicode Transformation Format),是一种针对 Unicode 的可变长度字符编码方式。使用一到四个字节来编码 Unicode 字符 在计算机内存中统一使用Unicode编码,当需要保存到硬盘或…

MySQL性能测试工具 mysqlslap

先看参数介绍 FormatOption FileDescriptionIntroduced--auto-generate-sqlauto-generate-sqlGenerate SQL statements automatically when they are not supplied in files or using command options --auto-generate-sql-add-autoincrementauto-generate-sql-add-autoincreme…

atlas单机模式代码_用代码玩太无聊,这样玩海盗游戏《ATLAS》单机模式才是正确玩法...

在各大单机游戏中,存在很多的代码给玩家使用,利用这些代码,玩家就能和开了挂似得快速通关。这让不少玩家沉迷于代码的世界而无心享受游戏的乐趣,因此在游戏界中经常有代码毁了一款游戏的说法。这点放在最近才上线的海盗冒险生存游…

iSCSI软件套件 介绍

http://blog.csdn.net/do2jiang/article/details/5062586 iSCSI(Internet SCSI)是2003年IETF(InternetEngineering Task Force,互联网工程任务组)制订的一项标准,这种指令集合可以实现在IP网络上运行SCSI协…

【Computer Vision】 复现分割网络(1)——SegNet

目录 Tags: ComputerVision编译数据处理训练结果ReferenceTags: ComputerVision 编译 src/caffe/layers/contrastive_loss_layer.cpp:56:30: error: no matching function for call to ‘max(double, float)’ Dtype dist std::max(margin - sqrt(dist_sq_.cpu_data()[i]), Dt…

kotlin + springboot 整合redis,Redis工具类编写及单元测试

参考自&#xff1a; https://www.cnblogs.com/zeng1994/p/03303c805731afc9aa9c60dbbd32a323.html 1、maven依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://…

:before和::before的区别

在一次项目中&#xff0c;有一次要用到::selection伪元素&#xff0c;然后开发同学问我&#xff0c;CSS中一个冒号和两个冒号有神马区别&#xff1f; 这好像真的是个问题&#xff0c;或许很多前端同学对此都有疑惑&#xff0c;查了些资料&#xff0c;证实了下两个符号的区别&am…

python下载大文件mp4_python合并大量ts文件成mp4格式(ps:上限是450,亲测)

原博文 2018-08-22 17:34 − 1 import os 2 #exec_str rcopy /b ts/c9645620628078.tsts/c9645620628079.ts ts/1.ts 3 #os.system(exec_str) 4 f open(index.m3u8, r, encod...08595 相关推荐 2019-12-19 14:27 − ts readonly name "xxx"; updateValueAndValidi…

提高网站页面收录的几个方法 返回列表 发新帖回复

首先是清楚网站总体有多少页面。 可以用xenu扫描出所有的页面。 1.html地图 网页数量不是太多&#xff0c;可以用网站地图来增加收录&#xff0c;分成几个地图页面。 2.随机文章模块 在不影响用户体验的情况下&#xff0c;在栏目中增加随机文章模块&#xff0c;增加链接曝光度&…

JSP+Servlet+JavaBean

JSP相当于在HTML页面中加上Java代码&#xff0c;一般在<body>标签中放入主要代码。 在JSP里用<%...%>把Java代码包含起来的。 Servlet的生命周期&#xff1a; ①被服务器实例化后&#xff0c;容器运行init方法。 ②当请求&#xff08;Request&#xff09;到达时&am…

logistic回归 如何_第七章:利用Python实现Logistic回归分类模型

免责声明&#xff1a;本文是通过网络收集并结合自身学习等途径合法获取&#xff0c;仅作为学习交流使用&#xff0c;其版权归出版社或者原创作者所有&#xff0c;并不对涉及的版权问题负责。若原创作者或者出版社认为侵权&#xff0c;请联系及时联系&#xff0c;我将立即删除文…

多年没有管理的技术博客了,即日起开始管理起技术博客

多年没有管理的技术博客了&#xff0c;即日起开始管理起技术博客&#xff0c;希望朋友们一如既往的支持转载于:https://www.cnblogs.com/flashicp/archive/2012/08/14/2639054.html

GNS3的默认Telnet程序改成secureCRT

编辑-首选项-一般里的“终端命令”改为C:\Users\ldy\AppData\Local\VanDyke Software\SecureCRT\SecureCRT.exe /t /telnet %h %p 前面是SecureCRT程序的目录&#xff0c; /t是指建立一个新标签 &#xff0c; /telnet的意思是走Telnet协议&#xff0c; %h是要telnet到的主机&am…