Aussenpolygon des TIN

Hallo Forum,

kennt jemand eine Möglichkeit, aus einem bestehenden TIN das Umringpolygon (Polygon zum Ausschneiden) zu extrahieren - bzw. die Dreieckspolygone, die eine Dreiecksseite besitzen, die an kein weiteres Dreieck grenzt.

Grüße Andreas
Hallo nochmal, das ist mein Script, mit dem ich versuche die Dreiecke zu erhalten, die nur 2 Nachbardreiecke haben - leider ohne Erfolg, die Ergebnisliste ist leer. Kann es sein das auch die Aussepolygone ein imaginäres 3. Dreieck als nachbarn haben?

Wer kann weiterhelfen?

theview=av.getactivedoc
thelist = {}
for each t in theview.getthemes
if (t.is(STheme)) then
thelist = thelist.add( t.getname)
end
end

talist = {}

thestheme = msgbox.listasstring ( thelist, "", "")
if (thestheme = nil) then
exit
end

thetin = theview.findtheme(thestheme).getsurface

anzahltri = thetin.getnumTriangles

for each i in 0 .. (anzahltri - 1)

thetrilist = thetin.NeighborTriangles(i)
anzahl = thetrilist.count
if (anzahl <> 3) then
talist.add(i)
end

end

msgbox.info("Fertig","Feritg")

msgbox.listasstring(talist,"","")
Hallo Andreas,

das Problem deines Skriptes hängt wohl mit den ominösen 'masked Triangles' zusammen. Ich hatte bisher keine besondere Veranlassung mich näher um Sinn und Zweck dieser Teile zu kümmern, weiß aber zumindest, dass es Sie gibt. Diese masked Triangles musst du auf jeden Fall als Nachbardreiecke ausschließen.

Deine Schleife könnte dann z.B. so aussehen :

for each i in 0 .. (anzahltri - 1)

if (thetin.IsTriangleMasked(i).not) then
thetrilist = thetin.NeighborTriangles(i)

thetrilist2 = List.Make
for each j in thetrilist
if (thetin.IsTriangleMasked(j).not) then
thetrilist2.add(j)
end
end

anzahl = thetrilist2.count
if (anzahl <> 3) then
talist.add(i)
end

end

end

(sollte so funktionieren ...)

Möglicherweise ist es aber einfacher, sich aus dem schönen Tool Convert TIN into 3D shapefiles von Monsieur Guillotin etwas zu basteln. Damit kannst du die Dreiecke in ein Polygonshape überführen, die Polygone überlagern und damit die Dreiecksformen für dein Umringpolygon erhalten.

Maxilla
Hallo Maxilla,

genau das war der entscheidende Punkt. Jetzt klappt alles. Das von dir benannte Tool benutze ich auch bisweilen aber bei diesem Geländemodell (aufgeteilt in 7 TIN's insgesamt 130 MB) macht sich jede Bearbeitung der aller Dreiecke schwierig.

Habe nichts-desto-trotz eine ganz einfache Lösung gefunden. Einfach das TIN mit dem 3D-Analyst-Werkzeug "Interpolate Polygon" grob umfahren - das Ergebnis ist das benötigte Aussen(hüllen)polygon.

Gruß Andreas

Mein ErgebnisScript sieht übnrigens wie folgt aus:

'------------Input sammeln

theview=av.getactivedoc
thelist = {}
for each t in theview.getthemes
if (t.is(STheme)) then
thelist = thelist.add( t.getname)
end
end

talist = {}

thestheme = msgbox.listasstring ( thelist, "", "")
if (thestheme = nil) then
exit
end

thetin = theview.findtheme(thestheme).getsurface

anzahltri = thetin.getnumTriangles

'------------Input sammeln


'------------FileDialog

def = av.GetProject.MakeFileName("TIN3eck", "shp")
def = FileDialog.Put(def, "*.shp", "Neues 3D-Polythema für Dreiecke")
if (def = nil) then
exit
end

'------------FileDialog


'------------Erstellung Shape

theClass = PolyGonZ

theOutFTab = FTab.MakeNew(def, theClass)
fld = Field.Make("ID", #FIELD_DECIMAL, 8, 0)
fld.SetVisible(FALSE)
'hoehe = Field.make("Hoehe", #FIELD_DECIMAL, 11, 3)
theOutFTab.AddFields({fld})
theOutFTab.SetEditable(TRUE)
theTheme = FTheme.Make(theOutFTab)
theView.AddTheme(theTheme)
theTheme.SetActive(FALSE)
theTheme.SetVisible(FALSE)
shapeField = theOutFTab.FindField("Shape")
theOutFTab.BeginTransaction

'------------Erstellung Shape


'------------Schleife durch alle Dreiecke

for each i in 0 .. (anzahltri - 1)

if (thetin.IsTriangleMasked(i).not) then

thetrilist = thetin.NeighborTriangles(i)

thetrilist2 = List.Make
for each j in thetrilist
if (thetin.IsTriangleMasked(j).not) then
thetrilist2.add(j)
end
end

anzahl = thetrilist2.count
if (anzahl <> 3) then
talist.add(i)
end

end

end

'------------Schleife durch alle Dreiecke

ap = talist.count
msgbox.info("Liste ferig. Es werden nun "+ ap.asstring +" Dreiecke zu Polygonen konvertiert." ,"Liste ferig")

'------------Schreibe Dreiecke in Shape

for each tri in talist

rec = theOutFTab.AddRecord
tripoly = thetin.ReturnTriangle(tri)
theOutFTab.SetValue(shapeField, rec, tripoly)

end

theOutFTab.EndTransaction
theOutFTab.SetEditable(False)

'------------Schreibe Dreiecke in Shape

msgbox.info("Shape fertig.","Shape fertig")