在ArcMap中确定真实的曲线/弧?


13

在ArcMap中创建圆的唯一好方法是使用真实的圆弧(复合曲线),但是由于兼容性问题,我需要将圆弧转换为顶点(密集化)。我需要有关地理数据库和SDO_geometry(arcsde)的信息

是的,有办法。我用:

UPDATE layer1 a SET arctype = 'compound' WHERE has_compound_curves(a.shape) <> 0;

然后使用ET Geotools逐层压实。

但是在Oracle或ArcMap中应该有更简单的方法来做到这一点,而我只是想浓缩具有真正弧线的要素。我不希望直线上有任何不必要的顶点,等等。

如何在ArcMap中标识真实的弧,以及如何尽可能快速,轻松地对其进行密化?

与Oracle SQL相同。


这是2006年的一个线程,线程使用VBA查找真实的弧,但是由于ArcGIS不再支持VBA,是否有Python或UI方式可以做到这一点?
RyanKDalton

我希望这个“ ArcGIS Idea”并不意味着不可能在10.0中找到真实的曲线。
RyanKDalton 2012年

Answers:


8

今天有人问我这个问题(“如何识别要素类是否具有曲线),并给出了一些arcpy代码建议。根据需要修改以下代码(例如,使用标志变量而不是消息)

geometries = arcpy.CopyFeatures_management("inputFeatures", arcpy.Geometry())
import json
for g in geometries:
    j = json.loads(g.JSON)
    if 'curve' in j: print "You have true curves!"
    else: print "No curves here"

No curves here
No curves here
You have true curves!
You have true curves!
No curves here
You have true curves!
No curves here
No curves here
You have true curves!
You have true curves!
You have true curves!
You have true curves!
You have true curves!

4

通过使用Densify,可以通过“最大偏转角”或“最大偏移偏差”参数进行化来简化曲线段。

因此,直线段将保持不变。


1
尽管这无助于确定真实的曲线,但我同意将Densify与Angle参数一起使用是快速且有效地对其进行致密化的方法。通常,使用Angle参数还将仅使真实曲线致密,而Distance选项将使所有边界致密,从而(至少在我的测试中,使用默认参数)使文件大小最多增加10倍。
RyanKDalton

好的,所以有不同的解决方案,但是我的问题是我无法在sde层上使用任何工具箱,我们将这些层锁定为签出/签入,我想做的是运行找到以下内容的工具/脚本:这些曲线,然后进行“密化”,但是如果您要说的是“密化”仅接触真实的弧线,那么我可以检查所有特征,但是有没有比ET geotools更致密的编辑工具
jonaktiv,2012年

这个答案gis.stackexchange.com/a/37082/2969 尝试提取直线,但是您可以通过从整个图层中减去直线来提取曲线,这样就可以定位曲线而无需触及整个数据。但我不知道ET geotools是如何工作的。
geogeek

jonaktiv是@geogeek链接到的Densify工具,它是ArcGIS的核心工具,可提供ArcEditor或ArcInfo许可,而不是ET GeoWizards的一部分。
RyanKDalton 2012年

2

我认为一旦选择了它们,就可以将它们压实。下面的(未经测试的)代码可以进行调整。(假设Bezier曲线为圆弧)。

public void SelectTrueArcFeatures()
{
    var editor = ArcMap.Application.FindExtensionByName("ESRI Object Editor") as IEditor;
    if (editor.EditState != esriEditState.esriStateEditing)
        throw new Exception("start editing first");
    var fLayer = ((IEditLayers)editor).CurrentLayer;
    if (fLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPoint)
        throw new Exception("current edit layer must have polylines or polygons");

    var fSel = fLayer as IFeatureSelection;
    fSel.Clear();
    var fCur = fLayer.FeatureClass.Search(null,false);
    IFeature feat;
    while ((feat = fCur.NextFeature()) != null)
    {
        if(HasAnArc(feat.Shape))    
            fSel.SelectionSet.Add(feat.OID);
    }
    fSel.SelectionChanged();
    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(fCur);
    ArcMap.Document.ActiveView.Refresh();
}

private bool HasAnArc(IGeometry geom)
{
    var segcoll = geom as ISegmentCollection;
    if (segcoll == null)
        return false;
    for (int i = 0; i < segcoll.SegmentCount; i++)
    {
        if (segcoll.get_Segment(i) is ICircularArc 
          || segcoll.get_Segment(i) is IBezierCurve)
          return true;
    }
    return false;
}

这是编辑脚本吗?如何将这段代码放入arcmap?以及代码如何工作,是否找到beizercurves或仅使我发现(选择)的内容致密
jonaktiv 2012年

是c#。如果您还不熟悉c#(或.net自定义),则可能会要求某人用python编写等效代码。要使用此代码,您将需要使用Visual Studio对其进行编译。它会选择当前编辑目标图层中具有任何非线性线段的所有折线(或多边形)。
Kirk Kuykendall

@jonaktiv如果您使用的是9.3.1,则可以使用VBA在计算器脚本中执行此操作。计算标志属性,然后选择具有标志的要素。如果您使用的是8.3,则实际上可以直接使用字段计算器更新几何,并且不需要flag属性。
Kirk Kuykendall

高超!我非常感谢,我担心这是不可能的
jonaktiv


2

以@KHibma的答案为基础,数据访问游标具有令牌SHAPE@JSON,可用于检查曲线而无需导入json模块。

with arcpy.da.SearchCursor ("InputFeatures", ["OID@", "SHAPE@JSON"]) as curs:
    for oid, json in curs:
        if "curve" in json:
            print "{} is curved".format (oid)

1

基于@geogeek的建议,我也为此创建了自己的解决方案。我创建了一个模型,该模型将源层顶点与源层的密集(使用ANGLE选项)副本中的顶点进行比较。输出是一层“不匹配”源的顶点。最后一步选择与不匹配点相交的所有源要素,从而确定包含真实曲线的要素。

由于此模型不会在圆弧的起点和终点拆分要素,因此将导出整个要素。因此,如果您具有连接为“线-曲线-线-曲线-反向曲线”的单个几何图形,则将输出整个特征,而不仅仅是曲线部分。使用这些点来确定实际曲线的位置。

您可以从ArcGIS Resource Center“分析”库中下载名为“ 识别真实曲线 ” 的模型。


谢谢大家,太好了。我们有arcgis 9.3.1,但是我将在我的私人计算机上进行测试编辑:这是一个非常好的工具,但是速度不够快://我想要的是能够在编辑环境中找到/选择具有真实弧线的特征,然后结帐我的功能与真正的弧线,然后致密化(是否有任何编辑致密工具多等geotools,为什么我不想要的Et getools是因为你必须改变目标层,我们也许致密10个不同的层。
jonaktiv
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.