ArcMap中使用ArcPy实现Geometry与WKT的相互转换

本文介绍了如何在ArcGIS中使用Geometry与WKT之间的相互转换,包括将Geometry转换为WKT格式,以及如何通过WKT转换回Geometry。详细步骤包括在属性表中使用Field Calculator进行转换,以及如何利用ArcPy类实现转换操作。此外,还展示了如何将WKT用于查询和更新数据的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Web GIS迅猛发展的今天,使用浏览器来进行交互以其方便性、快捷性被广大用户所推崇,那么在传输格式方面,都已比较简单的JSON或者WKT来解决网络带宽带来的数据压力。


在ArcGIS10.2版本,已经提供了Geometry与JSON的相互转换,而且在现实业务中,Geometry与WKT的相互转换也比较多见。例如在ArcSDE环境中,用户可以使用Esri或者原生提供的函数来进行转换。

SQL> select sde.st_astext(shape) from city where objectid<8;

SDE.ST_ASTEXT(SHAPE)
---------------------------------------------------------------------

POINT Z ( 116.38094000 39.92361500 0.00000000)
POINT Z ( 117.20350000 39.13111900 0.00000000)
POINT Z ( 114.48978000 38.04512800 0.00000000)
POINT Z ( 112.56935000 37.87111300 0.00000000)
POINT Z ( 111.66330000 40.82094200 0.00000000)
POINT Z ( 123.41168000 41.79661600 0.00000000)
POINT Z ( 125.31543000 43.89256300 0.00000000)

已选择7行。

如果数据格式并非存储在SDE中,而是存储在文件格式中,怎么获得相关的WKT呢?

----------------------------------------------------------------------------------

版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!

建议看到转载,请直接访问正版链接获得最新的ArcGIS技术文章

Blog:               http://blog.youkuaiyun.com/linghe301 

----------------------------------------------------------------------------------


一:Geometry2WKT

1:比如下面存储在FGDB的三个多边形



2:创建一个TEXT类型的字段来存储WKT串,注意这个字段的长度,如果你的要素包含点比较多的话,长度可能要求比较高。我创建的字段名称为wkt,字段长度为4000.

----------------------------------------------------------------------------------

版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!

建议看到转载,请直接访问正版链接获得最新的ArcGIS技术文章

Blog:               http://blog.youkuaiyun.com/linghe301 

----------------------------------------------------------------------------------


3:创建好字段之后,打开要素类的属性表,然后选择wkt字段,右键选择Field Calculator选项



4:打开字段计算器,选择Python,输入wkt=!SHAPE.wkt!


注意:!SHAPE!是Python的固有写法,而且ArcPy也提供了其他函数,比如json、wkb、area等

http://resources.arcgis.com/en/help/main/10.2/index.html#/Geometry/018z00000070000000/

----------------------------------------------------------------------------------

版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!

建议看到转载,请直接访问正版链接获得最新的ArcGIS技术文章

Blog:               http://blog.youkuaiyun.com/linghe301 

----------------------------------------------------------------------------------


5:执行之后,我们可以看到wkt字段已经存储了这些Geometry转换后的wkt串文本信息。而且在转换过程中,并不需要ArcMap开启编辑。



用途:其实使用这种方法不仅仅可以获得相关图形的WKT,也可以变相的为文件存储的数据保存历史。

意思很明白,在编辑数据之前,我可以把原来的数据以WKT存储在某个字段中,如果编辑后发现编辑的有问题,可以使用接下来介绍的WKT2Geometry方法把图形还原回来。

----------------------------------------------------------------------------------

版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!

建议看到转载,请直接访问正版链接获得最新的ArcGIS技术文章

Blog:               http://blog.youkuaiyun.com/linghe301 

----------------------------------------------------------------------------------


二:WKT2Geometry


在进行ST_Geometry的使用或者测试过程中经常会碰到这种情况

select ssdl, t.shape.minx x, t.shape.miny y
  from GX_FM_PT t
 where sde.st_within(t.shape,sde.st_polyfromtext('polygon((119.91009745117188 31.763774721679688,119.91198954101563 31.763774721679688,119.91198954101563 31.765422670898438,119.91009745117188 31.763774721679688,119.91009745117188 31.763774721679688))',9)) = 1

用户使用了一个WKT串来生成一个Geometry对象来进行空间查询,首先我需要验证这个WKT是什么样子的,是否正确,是否可能有查询结果,我就需要将WKT串转换成Geometry看一下,那么该功能就需要用户掌握了。


例如上面的截图,我希望将ObjectID=2的三角形更新为ObjectID=1的四边形,那我获得了ObjectID=1的WKT串就可以实现上述操作。

(该例子仅仅说明转换方法)

----------------------------------------------------------------------------------

版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!

建议看到转载,请直接访问正版链接获得最新的ArcGIS技术文章

Blog:               http://blog.youkuaiyun.com/linghe301 

----------------------------------------------------------------------------------


1:打开属性表,选中ObjectID=2的要素,然后选择SHAPE字段右键


----------------------------------------------------------------------------------

版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!

建议看到转载,请直接访问正版链接获得最新的ArcGIS技术文章

Blog:               http://blog.youkuaiyun.com/linghe301 

----------------------------------------------------------------------------------


2:打开字段计算器,使用ArcPy提供的类FromWKT,里面输入字符串类型的WKT串



3:执行之后可以看到相关图形已经发生了变化



----------------------------------------------------------------------------------

版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!

建议看到转载,请直接访问正版链接获得最新的ArcGIS技术文章

Blog:               http://blog.youkuaiyun.com/linghe301 

----------------------------------------------------------------------------------


<think>我们正在处理用户的问题:在ArcGIS中识别并删除道路双线的方法或教程。根据引用内容,我们并没有直接关于“删除道路双线”的引用,但是我们可以结合ArcGIS的一般制图技术和空间分析功能来提供解决方案。用户的问题:识别并删除道路双线。这里的“道路双线”可能指的是在制图过程中由于数据采集或处理错误导致同一条道路被重复绘制,形成两条几乎重合的线。也可能是制图表达中故意用双线表示道路(如高速公路),但用户希望简化成单线。我们需要明确用户意图。根据问题描述,用户希望“删除”道路双线,因此我们假设用户是想消除重复的线要素(即重复采集的同一道路),而不是将双线符号改为单线符号。步骤:1.识别重复的线要素:我们可以通过空间位置判断重复,例如两条线要素的几何形状几乎重合(在一定容差范围内)。2.删除重复的要素:保留其中一个,删除另一个。在ArcGIS中,可以使用以下方法:方法一:使用“删除相同项”工具(DeleteIdentical)-该工具用于删除属性相同的要素,但如果我们只考虑几何重复,可以创建一个临时字段,该字段的值基于几何形状(如几何的WKT字符串或哈希值),然后使用该工具删除该临时字段值相同的记录。-但是,注意:这个工具要求属性相同,而几何重复的要素可能属性不同。因此,我们需要先确保属性相同或者只根据几何来判断。方法二:使用“查找相同”工具(FindIdentical)和选择删除-首先,使用“查找相同”工具(在DataManagementTools->General工具集中)来识别重复的要素。该工具可以基于一个或多个字段进行比较,同样我们需要一个基于几何的字段。-然后,根据工具输出的结果表,我们可以选择重复的要素并删除。方法三:使用拓扑检查(Topology)来检查重复线-在ArcGIS中,拓扑规则中有一条“不能有重复”的规则(MustNotHaveDuplicates)。我们可以创建一个拓扑,添加该规则,然后验证拓扑,找出重复的要素,然后删除其中一个。-步骤:1.在Catalog中,右键点击包含要素类的数据集,选择New->Topology。2.按照向导,添加需要检查的要素类。3.添加规则:选择规则“MustNotHaveDuplicates”,选择同一个要素类(即检查自身重复)。4.完成拓扑创建后,在ArcMap中打开拓扑,进行验证。5.使用拓扑工具栏中的错误检查器(ErrorInspector)找到重复的要素,然后可以选择删除其中一个。方法四:使用“融合”工具(Dissolve)-如果两条线是重合的,并且我们希望将它们合并成一条线,可以使用融合工具。但是,融合工具通常用于将相邻的要素合并,并且会合并属性(需要指定统计字段)。对于完全重合的线,融合后也会变成一条线。但是注意,如果两条重合的线属性不同,融合后属性会丢失(需要指定融合字段)。方法五:使用ArcPy编写脚本-如果数据量很大,或者需要频繁操作,可以编写脚本。使用arcpy.Geometry对象的方法,如equals或withinDistance等,来比较要素的几何是否相同(在一定容差内)。然后删除重复的。但是,以上方法都需要注意:-容差的选择:几何完全重合的情况很少,通常需要设置一个容差值(比如1厘米或1米,根据数据精度)。-属性处理:删除重复要素时,注意保留正确的属性。根据引用[1]中提到的制图技术,我们还可以考虑制图表达(Representation)中的处理。如果用户是在制图表达中使用了双线符号(例如用两条线并排表示道路),那么删除双线实际上是改变符号系统,而不是删除要素。这时,我们可以修改符号系统,将道路的线符号改为单线。因此,我们需要先明确用户的需求是删除重复的要素,还是改变符号系统。根据用户的问题描述,他说的是“识别并删除道路双线”,所以我们优先考虑删除重复要素。推荐步骤(使用拓扑方法):1.确保数据在文件地理数据库(FileGeodatabase)中,因为拓扑需要在要素数据集中创建。2.将道路线要素放入一个要素数据集中(如果不在,可以新建一个要素数据集并导入)。3.创建拓扑,添加规则:选择该道路线要素类,规则为“MustNotHaveDuplicates”(不能有重复)。4.验证拓扑,然后查看错误。5.使用修复工具:在拓扑错误检查器中,右键点击错误,可以选择删除其中一个重复要素。注意事项:拓扑规则中的“不能有重复”是指两个要素完全重合(包括节点的位置),如果两条线只是部分重叠(比如部分路段重合),则不会被检测为重复。如果用户指的是部分路段重合的双线(比如并行的两条道路),则不能使用此规则。对于部分重叠的情况,我们可以使用“相交”工具(Intersect)来找出重叠部分,然后根据需要进行处理(如删除重叠部分、分割等),但这可能更复杂。因此,我们首先需要明确用户的双线是指完全重复还是部分重复?如果是完全重复,用拓扑方法最合适。如果用户没有明确,我们可以建议两种方法:-对于完全重复:使用拓扑规则。-对于部分重复(并行道路):可能需要使用其他工具,如“生成临近表”(GenerateNearTable)找出在一定距离内(如0.5米)的线段,然后手动检查删除。考虑到用户可能需要教程,我们提供使用拓扑的详细步骤:步骤1:创建拓扑-在ArcCatalog或者ArcMap的Catalog窗口中,找到你的文件地理数据库,右键单击,选择“新建”->“要素数据集”。输入名称(如Transportation),设置坐标系(道路数据相同),点击下一步,直到完成。-将道路线要素类(假设名为Roads)拖放到新建的要素数据集中。-右键单击要素数据集“Transportation”,选择“新建”->“拓扑”。-在向导中,输入拓扑名称(如Roads_Topology),添加Roads要素类,然后下一步。-设置等级(一般默认),下一步。-添加规则:点击“添加规则”,在要素类中选择Roads,规则选择“不能有重复”(MustNotHaveDuplicates),然后确定。-完成向导。步骤2:验证拓扑并修复-将新建的拓扑添加到ArcMap中。-如果拓扑没有自动验证,右键单击内容列表中的拓扑图层,选择“验证拓扑”。-拓扑错误会以红色标记显示。-打开拓扑工具栏(自定义->工具栏->拓扑),然后使用错误检查器(拓扑工具栏上的按钮)。-在错误检查器窗口中,点击“搜索错误”,然后选择所有错误或按规则搜索。-找到重复的错误,右键单击错误,选择“删除其中一个”(DeleteOneoftheFeatures)。注意:删除前请确认要保留哪个要素(可以查看属性)。步骤3:保存编辑-在编辑会话中操作(如果开始编辑,修复错误后需要保存编辑)。注意:在删除重复要素之前,请备份数据。另外,引用[3]中提到“交汇点”和“连通性”的问题,如果用户的双线导致在拓扑上出现独立交汇点(即两条线没有在折点处连接),那么删除重复线后可能还需要检查连通性。但本问题主要针对重复线,所以暂时不考虑。如果用户的双线是制图表达(如符号系统使用了双线),那么只需要修改符号系统:-右键单击图层,选择属性->符号系统,然后选择简单线符号,将线类型改为单线(如实线),宽度调整即可。因此,我们还需要确认用户的数据结构:是实际有两条线要素,还是用双线符号表示的一条线要素?由于用户问题中提到“删除”,我们倾向于认为用户的数据中有两条重复的线要素。相关问题:1.如何区分道路数据中的重复线和并行道路?2.在ArcGIS中,除了拓扑,还有哪些工具可以检测重复的线要素?3.如何处理部分重叠的线要素(如并行的两条道路)?4.如何修改道路的符号系统,将双线符号改为单线符号?</think>### ArcGIS中识别并删除道路双线的方法 在ArcGIS中,道路双线通常指因数据采集错误或制图处理导致的重复线要素。以下是专业解决方案: #### 方法一:拓扑检查修复(推荐) 1. **创建拓扑规则** - 在要素数据集中新建拓扑,添加规则:`Must Not Have Duplicates`(不能有重复) - 设置容差值(如0.1米)以识别几何重合的线 - 验证拓扑后,错误检查器会标记重复要素[^1][^3] 2. **删除重复要素** - 在编辑模式下,右键点击拓扑错误 - 选择`Delete One of the Features`保留单一线要素 - 保存编辑并停止编辑会话 ```python # ArcPy 自动化示例 import arcpy # 设置拓扑环境 arcpy.env.workspace = "C:/data/roads.gdb" arcpy.CreateTopology_management("transportation", "roads_topology") arcpy.AddRuleToTopology_management("roads_topology", "Must Not Have Duplicates", "road_lines") arcpy.ValidateTopology_management("roads_topology") ``` #### 方法二:制图表达几何处理 1. **符号系统检查** - 右键图层 → 属性 → 符号系统 - 确认是否误用双线符号(如"高速公路"样式) - 改为单线符号可立即消除显示双线[^1] 2. **折点工具修正** - 启用编辑 → 高级编辑工具条 - 使用`修整线工具`删除冗余折点 - 结合`简化线工具`(地理处理工具)自动优化几何[^1][^3] #### 方法三:空间分析处理 ```python # 通过缓冲区识别重复 arcpy.Buffer_analysis("road_lines", "buffer_layer", "0.5 Meters") arcpy.SpatialJoin_analysis("road_lines", "buffer_layer", "duplicate_check", match_option="WITHIN") # 删除重复记录 with arcpy.da.UpdateCursor("duplicate_check", ["OID@"]) as cursor: for row in cursor: if row[0] % 2 == 0: # 示例删除逻辑 cursor.deleteRow() ``` ### 注意事项 1. **数据备份**:操作前务必备份原始数据 2. **容差设置**:根据数据精度调整容差值(通常0.01-0.5米) 3. **属性检查**:删除重复线时注意保留正确属性 4. **制图表达**:若为符号化双线,只需修改符号系统[^1] > **操作要点**:拓扑方法最可靠,能精确处理几何重复;制图表达调整适用于可视化需求;脚本处理适合批量操作。建议优先使用内置拓扑工具[^1][^3]。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值