Mehr

So fügen Sie ein neues Flurstück in Parcel Fabric aus vorhandenen Flurstücks-Features (ArcObjects) hinzu

So fügen Sie ein neues Flurstück in Parcel Fabric aus vorhandenen Flurstücks-Features (ArcObjects) hinzu


Ich möchte ein neues Flurstück in einem Parcel Fabric-Layer erstellen. Ich habe die x-, y-Koordinaten für die zu erstellenden Flurstücke. Ich habe viel herumgesucht und wirklich nichts gefunden, was wirklich ein Paket "ERSTELLT".

Folgendes habe ich bisher versucht:

IPointCollection pts = feat.ShapeCopy as IPointCollection; //ein vorhandenes Polygon aus einer anderen Feature-Class zum Kopieren von x,y,z… ICadastralPoints cadPoints = new CadastralPacketClass(); for (int i = 0; i < pts.PointCount; i++) { IPoint p = pts.get_Point(i); IGSPoint gsPt = neue GSPointClass(); gsPt.X = p.X; gsPt.Y = p.Y; gsPt.Z = p.Z; gsPt.Typ = -1; //nur versucht, als nichts funktionierte… machte keinen Unterschied… cadPoints.AddPoint(gsPt); } IEnumCELines ceLines = new EnumCELinesClass(); ICadastralLines cadLines = new CadastralPacketClass(); ISegmentCollection-Segmente = feat.ShapeCopy as ISegmentCollection; //ein vorhandenes Polygon aus einer anderen Feature-Class zum Abrufen von Segmenten für (int i = 0; i < segment.SegmentCount; i++) { ISegment seg = segment.get_Segment(i); IGSLine gsLine = neue GSLineClass(); double BearingDeg = utils.GetBearing(seg.FromPoint, seg.ToPoint); gsLine.Bearing = (Math.PI * BearingDeg) / 180; gsLine.Distance = seg.Length; ceLines.Add(gsLine); } IEnumGSLines gsLines = ceLines as IEnumGSLines; IParcelLineFunctions ParcelLineFunctions = new ParcelFunctionsClass(); IConstructParcelFunctions constrParcelFunctions = new ParcelFunctionsClass(); ICadastralPacket m_EditPacket = cadExtension.GetEditPacket(); IEnumGSparcels outputParcels = null; int perRrorLinePointfrom = -1; int perRrorLinePointTo = -1; IGSPlan gsPlan = gsParcel.Plan; //gsParcel ist ein vorhandenes Paket… constrParcelFunctions.ConstructParcelsFromLines(gsPlan, cadPoints, gsLines, m_EditPacket, 1, ref outputParcels, ref perRrorLinePointfrom, ref perRrorLinePointTo); IGSparcel resultParcel = outputParcels.Next(); //resultParcel ist jetzt null ... hatte erwartet, dass dies einen Wert hat ...

Ich hoffe, jemand würde mich in die richtige Richtung führen.


Stellen Sie sicher, dass in der Karte ein Parcel Fabric-Layer vorhanden ist und Sie mit der Bearbeitung begonnen haben. Fügen Sie Ihrem Projekt die folgenden Assemblys hinzu, falls Sie dies noch nicht getan haben.

  • ESRI.ArcGIS.CadastralUI
  • ESRI.ArcGIS.GeoSurvey
  • ESRI.ArcGIS.GeoDatabaseExtensions

Verwenden Sie die folgende Klasse und ihre Methoden, um ein Parcel-Fabric-Objekt aus einem ausgewählten Parcel-Feature in der Karte zu erstellen. Die Methoden werden getestet, wenn Sie jedoch einen Fehler gefunden haben, lassen Sie es mich wissen.

//@FaridCher at GIS.StackExchange //kann ohne ausdrückliche Genehmigung mit ESRI.ArcGIS.CadastralUI kopiert und/oder verbreitet werden; mit ESRI.ArcGIS.Editor; mit ESRI.ArcGIS.esriSystem; mit ESRI.ArcGIS.Geodatabase; Verwenden von ESRI.ArcGIS.GeoDatabaseExtensions; mit ESRI.ArcGIS.Geometry; mit ESRI.ArcGIS.GeoSurvey; Verwenden des Systems; mit System.Collections.Generic; Verwenden von System.Linq; Verwenden von System.Runtime.InteropServices; Verwenden von System.Text; Verwenden von System.Windows.Forms; namespace MyParcelFabric { class CreateParcelFabric_FromPolygonSelection { protected override void OnClick() { var enums = ArcMap.Document.ActiveView.FocusMap.FeatureSelection as IEnumFeature; IFeature feat = enums.Next(); if (feat == null) { zurück; } CreateParcelFabric(feat); } private void CreateParcelFabric(IFeature polygonFeature) { try { UID pUID = new UIDClass(); pUID.Wert = "{114D685F-99B7-4B63-B09F-6D1A41A4DDC1}"; ICadastralExtensionManager2 pCadExtMan = (ICadastralExtensionManager2)ArcMap.Application.FindExtensionByCLSID(pUID); ICadastralEditor pCadEd = (ICadastralEditor)ArcMap.Application.FindExtensionByCLSID(pUID); IParcelEditManager pParcEditorMan = (IParcelEditManager)pCadEd; IEditor pEd = (IEditor)ArcMap.Application.FindExtensionByName("esri-Objekteditor"); if (pEd.EditState == esriEditState.esriStateNotEditing) { MessageBox.Show("Bitte beginnen Sie mit der Bearbeitung und versuchen Sie es erneut."); Rückkehr; } ICadastralPacketManager pCadPacketMan = (ICadastralPacketManager)pCadEd; bool bStartedWithPacketOpen = pCadPacketMan.PacketOpen; if (!bStartedWithPacketOpen) pEd.StartOperation(); //Kartenbearbeitungssitzung starten ICadastralMapEdit pCadMapEdit = (ICadastralMapEdit)pCadEd; pCadMapEdit.StartMapEdit(esriMapEditType.esriMEEmpty, "NewParcel", false); //Jobpaket ICadastralPacket holen pCadaPacket = pCadPacketMan.JobPacket; //Plan erstellen (neu) string sPlanName = "Mein neuer Plan"; IGSPlan pGSPlan = null; pGSPlan = neue GSPlanClass(); // Werte einstellen pGSPlan.Accuracy = 4; pGSPlan.Name = sPlanName; //Plan zum Auftragspaket hinzufügen ICadastralPlan pCadaPlan = (ICadastralPlan)pCadaPacket; pCadaPlan.AddPlan(pGSPlan); //Paket ICadastralParcel erstellen pCadaParcel = (ICadastralParcel)pCadaPacket; IGSparcel pNewGSparcel = new GSparcelClass(); //Stellen Sie sicher, dass alle erweiterten Attribute auf der Parzelle ihre Standardwerte haben set IGSAttributes pGSAttributes = (IGSAttributes)pNewGSParcel; if (pGSAttributes != null) { ICadastralObjectSetup pCadaObjSetup = (ICadastralObjectSetup)pParcEditorMan; pCadaObjSetup.AddExtendedAttributes(pGSAttributes); pCadaObjSetup.SetDefaultValues(pGSAttributes); } //Füge das Paket zum Paket hinzu. (tun Sie dies vor addlines) //Dies ermöglicht es uns, die Paket-ID zu erfassen, //Wenn das Paket an das Paket angehängt ist, kann InsertLine funktionieren. pCadaParcel.AddParcel(pNewGSParcel); pNewGSParcel.Lot = "NeuesParcel"; pNewGSparcel.Type = 7; //Plan festlegen (oben erstellt) IGSPlan thePlan = pCadaPlan.GetPlan(sPlanName); pNewGSparcel.Plan = thePlan; ICadastralPoints pCadaPoints = (ICadastralPoints)pCadaPacket; IMetricUnitConverter pMetricUnitConv = (IMetricUnitConverter)pCadEd; ISegmentCollection-Segmente = polygonFeature.ShapeCopy as ISegmentCollection; //erster Segmentpunkt des Polygons als Start von ParFab var pPt1 = segment.get_Segment(0).FromPoint; IZAware pZAw = (IZAware)pPt1; pZAw.ZAware = true; pPt1.Z = 0; //Vorgabe auf 0 //Konvertieren Sie den Punkt in metrische Einheiten und erhalten Sie eine neue (in-mem) Punkt-ID IGSPoint pGSPointFrom = pMetricUnitConv.SetGSPoint(pPt1); pCadaPoints.AddPoint(pGSPointFrom); int iID_First_Last = pGSPointFrom.Id; int iID1 = iID_First_Last; int iID2 = -1; int-Index = 0; for (int i = 0; i < segment.SegmentCount; i++) { ISegment seg = segment.get_Segment(i); double BearingRad = getBearing(seg.FromPoint, seg.ToPoint); bool computeToPoint = true; if (i == segmente.SegmentCount - 1) computeToPoint = false; IGSLine pGSLine = CreateGSLine(pMetricUnitConv, pCadaPoints, ref pPt1, iID1, BearingRad, seg.Length, 0, -1, -1, -1, computeToPoint, out iID2); iID1 = iID2; iID2 = -1; if (i == segmente.SegmentCount - 1) pGSLine.ToPoint = iID_First_Last; pNewGSparcel.InsertLine(++index, pGSLine); } //Füge radiale Linien für kreisförmige Kurven hinzu pNewGSParcel.AddRadialLines(); // dann setze join=true für das Paket. pNewGSparcel.Joined = true; // dem Paket mitteilen, dass eine Änderung vorgenommen wurde pCadPacketMan.SetPacketModified(true); try { pCadMapEdit.StopMapEdit(true); } catch { if (!bStartedWithPacketOpen) pEd.AbortOperation(); Rückkehr; } if (!bStartedWithPacketOpen) pEd.StopOperation("New Parcel Fabric"); pCadPacketMan.PartialRefresh(); } catch (Ausnahme ex) { MessageBox.Show (ex.Message); } } private IGSLine CreateGSLine(IMetricUnitConverter MetricConversion, ICadastralPoints CatastralPoints, ref IPoint FromPointInToPointOut, int FromPointID, double Direction, double Distance, double Radius, int Accuracy, int UserLineType, int Category, bool ComputeToPoint, out int ToPointID) { //In dieser Funktion , Radius == 0 bedeutet gerade Linie //Wenn der Radius >0 oder <0 ist, dann ist die Linie eine Kreiskurve mit Distance als Sehnenlänge //für Kurven Peilung bedeutet Sehnenpeilung //negativer Radius bedeutet eine Kurve nach links, Kurve mit positivem Radius nach rechts //für keine Genauigkeit, kein Typ oder kein Kategoriedurchlauf in -1 //Peilung ist im Nord-Azimut-Radiant IGSLine pLine = new GSLineClass(); pLine.Bearing = Richtung; // Richtung ist im Bogenmaß Nordazimut doppelt dConvertedDistance = 0; MetricConversion.ConvertDistance(esriCadastralUnitConversionType.esriCUCToMetric, Distance, ref dConvertedDistance); pLine.Distance = dConvertedDistance; // muss in Metern angegeben werden; if (Math.Abs(Radius) > 0) { MetricConversion.ConvertDistance(esriCadastralUnitConversionType.esriCUCToMetric, Radius, ref dConvertedDistance); pLine.Radius = dConvertedDistance; // muss in Metern angegeben werden; } pLine.FromPoint = FromPointID; pLine.ToPoint = -1; if (Genauigkeit > -1) pLine.Genauigkeit = Genauigkeit; if (UserLineType > -1) pLine.LineType = UserLineType; if (Category > -1) pLine.Category = (ESRI.ArcGIS.GeoDatabaseExtensions.esriCadastralLineCategory)Category; //Stellen Sie sicher, dass alle erweiterten Attribute in der Zeile ihre Standardwerte haben set IGSAttributes pGSAttributes = (IGSAttributes)pLine; if (pGSAttributes != null) { ICadastralObjectSetup pCadaObjSetup = (ICadastralObjectSetup)MetricConversion; //QI pCadaObjSetup.AddExtendedAttributes(pGSAttributes); pCadaObjSetup.SetDefaultValues(pGSAttributes); } //Berechnen Sie den neuen Endpunkt für die Linie. //FromPointInToPointOut ist in Einheiten der Kartenprojektion. ICurve pCurv = MetricConversion.GetSurveyedLine(pLine, CatastralPoints, false, FromPointInToPointOut); //pCurv ist auch in den Einheiten der Kartenprojektion. Konvertieren Sie den Endpunkt in metrische Einheiten. FromPointInToPointOut = pCurv.ToPoint; // Übergeben Sie den neuen To-Point wieder heraus FromPointInToPointOut.Z = 0; IGSPoint pGSPointTo = MetricConversion.SetGSPoint(FromPointInToPointOut); if (ComputeToPoint) { CatastralPoints.AddPoint(pGSPointTo); pLine.ToPoint = pGSPointTo.Id; ToPointID = pLine.ToPoint; } sonst ToPointID = -1; if (pCurv ist ICircularArc) { ICircularArc pCircArc = (ICircularArc)pCurv; IPoint pCtrPt = pCircArc.CenterPoint; IZAware pZAw = (IZAware)pCtrPt; pZAw.ZAware = true; pCtrPt.Z = 0; IGSPoint pGSCtrPt = MetricConversion.SetGSPoint(pCtrPt); KatasterPunkte.AddPoint(pGSCtrPt); pLine.CenterPoint = pGSCtrPt.Id; } return pLine; } private double getBearing(IPoint fromPoint, IPoint toPoint) { ILine line = new LineClass(); line.PutCoords(fromPoint, toPoint); doppelter Winkel = Linie.Winkel; Math.PI / 2 zurückgeben - Winkel; } } }

Schau das Video: ArcGIS Parcel Fabric Editing Using Control Points