การระบุเส้นโค้ง / ส่วนโค้งจริงใน ArcMap?


13

วิธีเดียวที่ดีในการสร้างแวดวงใน ArcMap คือการใช้ส่วนโค้งจริง (เส้นโค้งผสม) แต่ฉันจำเป็นต้องแปลงวงกลมเหล่านั้นให้เป็นจุดสุดยอด (ทำให้หนาแน่น) เนื่องจากปัญหาความเข้ากันได้ ฉันต้องการข้อมูลสำหรับ geodatabase และ 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"นี้ไม่ได้หมายความว่ามันเป็นไปไม่ได้ที่จะหาเส้นโค้งที่แท้จริงใน 10.0
RyanKDalton

คำตอบ:


8

ฉันถูกถามคำถามนี้วันนี้ ("ฉันจะระบุได้อย่างไรว่า featureclass มีส่วนโค้ง) และได้รับคำแนะนำเกี่ยวกับรหัส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เซ็กเมนต์ Curve จะง่ายขึ้นผ่านการทำให้หนาแน่นโดยมุมโก่งสูงสุดหรือพารามิเตอร์เบี่ยงเบนสูงสุดออฟเซ็ต

ดังนั้นส่วนของเส้นตรงจะยังคงอยู่เหมือนเดิม


1
แม้ว่าสิ่งนี้จะไม่ช่วยในการระบุเส้นโค้งที่แท้จริง แต่ฉันยอมรับว่าการใช้ Densify กับพารามิเตอร์ Angle เป็นวิธีที่รวดเร็วและมีประสิทธิภาพในการทำให้หนาแน่นได้อย่างรวดเร็ว โดยทั่วไปแล้วการใช้พารามิเตอร์ Angle จะทำให้เส้นโค้งที่แท้จริงนั้นหนาแน่นเท่านั้นในขณะที่ตัวเลือก Distance จะเพิ่มความหนาแน่นของขอบเขตทั้งหมดซึ่งนำไปสู่ ​​(อย่างน้อยในการทดสอบของฉันโดยใช้พารามิเตอร์เริ่มต้น) จนถึงขนาดไฟล์ที่เพิ่มขึ้น 10 เท่า
RyanKDalton

ตกลงดังนั้นจึงมีวิธีแก้ไขปัญหาที่แตกต่างกัน แต่ปัญหาของฉันคือฉันไม่สามารถใช้กล่องเครื่องมือใด ๆ บนเลเยอร์ sde ของฉันเราล็อกเลเยอร์สำหรับเช็คเอาต์ / เช็คอินสิ่งที่ฉันต้องการทำคือเรียกใช้เครื่องมือ / สคริปต์ที่ค้นหา เส้นโค้งเหล่านี้และหลังจาก Densify แต่ถ้าเป็นสิ่งที่คุณกำลังบอกว่า densify เพียงแตะเส้นโค้งจริงฉันสามารถตรวจสอบคุณสมบัติทั้งหมด แต่มีเครื่องมือแก้ไขที่ทำให้หนาแน่นมากกว่า geotools ET
jonaktiv

คำตอบนี้gis.stackexchange.com/a/37082/2969 พยายามที่จะแยกเส้นตรง แต่คุณสามารถแยกเส้นโค้งโดยย่อส่วนเส้นตรงจากชั้นทั้งหมดเพื่อให้คุณสามารถค้นหาเส้นโค้งโดยไม่ต้องสัมผัสข้อมูลทั้งหมด แต่ฉันไม่รู้ว่า ET geotools ทำงานอย่างไร
geogeek

jonaktiv, เครื่องมือ Densify ที่ @geogeek ลิงก์ไปยังเป็นเครื่องมือหลักของ ArcGIS ที่มีใบอนุญาต ArcEditor หรือ ArcInfo ไม่ใช่ส่วนหนึ่งของ ET GeoWizards
RyanKDalton

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

มันคือ c # หากคุณยังไม่คุ้นเคยกับ c # (หรือ. net customization) คุณอาจขอให้บางคนเขียนสิ่งที่เทียบเท่ากับ python ในการใช้รหัสนี้คุณจะต้องรวบรวมด้วย Visual Studio มันเลือก polylines ทั้งหมด (หรือรูปหลายเหลี่ยม) ในเลเยอร์เป้าหมายแก้ไขปัจจุบันที่มีเซ็กเมนต์ที่ไม่ใช่เชิงเส้น
Kirk Kuykendall

@jonaktiv หากคุณใช้ 9.3.1 คุณสามารถทำได้ด้วย VBA ในสคริปต์เครื่องคิดเลข คำนวณแอ็ตทริบิวต์การตั้งค่าสถานะจากนั้นเลือกคุณสมบัติที่มีการตั้งค่าสถานะ หากคุณใช้ 8.3 คุณสามารถอัปเดตรูปทรงเรขาคณิตได้โดยใช้เครื่องคิดเลขภาคสนามโดยตรงและไม่จำเป็นต้องใช้แอตทริบิวต์การตั้งค่าสถานะ
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) ของเลเยอร์ต้นทาง ผลลัพธ์คือเลเยอร์ของจุดยอดที่ "ไม่ตรงกับ" แหล่งที่มา ขั้นตอนสุดท้ายเลือกคุณลักษณะแหล่งข้อมูลทั้งหมดที่ตัดกันจุดที่ไม่ตรงกันดังนั้นจึงระบุคุณลักษณะที่มีส่วนโค้งจริง

เนื่องจากรุ่นนี้ไม่แยกคุณลักษณะที่จุดเริ่มต้นและจุดสิ้นสุดของส่วนโค้งคุณลักษณะทั้งหมดจะถูกส่งออก ดังนั้นหากคุณมีรูปทรงเรขาคณิตเดียวที่เชื่อมต่อเป็น "เส้นโค้ง - เส้น - โค้ง - กลับ - เส้นโค้ง" คุณสมบัติทั้งหมดจะถูกส่งออกไม่ใช่แค่ส่วนโค้ง ใช้จุดเพื่อกำหนดว่าเส้นโค้งที่แท้จริงอยู่ที่ไหน

คุณสามารถดาวน์โหลดรุ่นที่เรียกว่า " Identify True Curves " จากแกลเลอรี "วิเคราะห์" ArcGIS Resource Center


ขอบคุณทุกคนมันยอดเยี่ยมมาก เรามี arcgis 9.3.1 แต่ฉันจะทดสอบกับคอมพิวเตอร์ส่วนตัวของฉัน EDIT: มันเป็นเครื่องมือที่ดีมาก แต่ก็ไม่เร็วพอ: / สิ่งที่ฉันต้องการคือให้สามารถแก้ไขสภาพแวดล้อมเพื่อค้นหา / เลือกคุณสมบัติด้วยส่วนโค้งที่แท้จริงแล้ว เช็คเอาคุณสมบัติของฉันกับโค้งจริงแล้วบดอัด (จะมีการแก้ไขเครื่องมือใด ๆ บดอัดมากกว่า et geotools ทำไมฉันไม่ต้องการ getools et เป็นเพราะคุณจะต้องชั้นเป้าหมายการเปลี่ยนแปลงเราบดอัดอาจจะ 10 ชั้นที่แตกต่าง.
jonaktiv
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.