Векторные трехмерные построения - это не ГИСовская сфера, поэтому удивляться тут нечему. Инструмент этот не единственный для трехмерки, и ГИС-разработки вряд ли двинутся в этом направлении... Но простой интерсект решит именно эту проблему ;) Не помню как его делать в AM 9x, чтобы атрибуты сохранялись, а для AV3x вот проверенный скриптик - не раз вместе с ним приходилось тальвеги трехмерить.
Статьи на тему "Как трехмерить векторы средствами ГИС" на geoFAQ нету, все недосуг. Однако сам принцип отработан и описан, могу поделиться черновым текстом.
Скрипт вот: по любой линии делает точки с атрибутами любых пересекаемых линий. Собрать точки в уже трехмерный профиль - понятное дело, EditTools. Тоолько для настоящего профиля этого мало, сами понимаете.
'---------------------------------------------------
' Name: view.polyint2pnt
'
' Title: Locate intersections points of polylines or polygon boundaries.
'
' Topics: Analysis
'
' Description: Calculates the location of intersections points of two
' themes: polylines and/or polygon. Feature attributes for
' both input feature themes are included in the new point
' theme attrubute table.
'
' Requires: A ViewGUI Buttonbar button or Menu item
'
' Self: NIL
'
' Returns: NIL
'------ snag the themes -------
theTitle = "Polyline Intersections to Points"
theThemes = av.getActiveDoc.GetThemes
if (theThemes.Count < 2 ) then
Return NIL
end
theLineThemes = {}
for each thm in theThemes
if ((thm.GetFTab.FindField("shape").GetType = #FIELD_SHAPELINE) OR (thm.GetFTab.FindField("shape").GetType = #FIELD_SHAPEPOLY)) then
theLineThemes.Add(thm)
end
end
if (theLineThemes.Count < 2 ) then
Return NIL
end
the2Themes = MsgBox.MultiList(theLineThemes,"Select two polyline themes:",theTitle)
if (the2Themes = NIL) then Return NIL end
if (the2Themes.Count <> 2 ) then
Return NIL
end
fTab0 = the2Themes.Get(0).GetFTab
shpFld0 = fTab0.FindField("shape")
fList0 = {}
for each f in fTab0.GetFields
if (f.IsTypeShape.not) then
fList0.Add(f.Clone)
end
end
if (fTab0.GetSelection.Count > 0) then
colToProc0 = fTab0.GetSelection
nRecs0 = colToProc0.Count
else
colToProc0 = fTab0
nRecs0 = colToProc0.GetNumRecords
end
fTab1 = the2Themes.Get(1).GetFTab
shpFld1 = fTab1.FindField("shape")
fList1 = {}
for each f in fTab1.GetFields
if (f.IsTypeShape.not) then
fList1.Add(f.Clone)
end
end
if (fTab1.GetSelection.Count > 0) then
colToProc1 = fTab1.GetSelection
nRecs1 = colToProc1.Count
else
colToProc1 = fTab1
nRecs1 = colToProc1.GetNumRecords
end
'------- create a new point theme with fields -------
fnDefault = FileName.Make("$HOME").MakeTmp("shape","shp")
fnOutput = FileDialog.Put( fnDefault,"*.shp","Output Shape File" )
if (fnOutput = nil) then exit end
fnOutput.SetExtension("shp")
outFTab = FTab.MakeNew( fnOutput, POINT )
idField = Field.Make("ID",#FIELD_DECIMAL,11,0)
outFTab.AddFields({idField})
outFTab.AddFields(fList0)
outFTab.AddFields(fList1)
'------- intersect the shapes -------
nCount = 0
theID = 1
av.ShowMsg("Intersecting Shapes")
for each rec0 in colToProc0
shp0 = fTab0.ReturnValue(shpFld0,rec0)
for each rec1 in colToProc1
shp1 = fTab1.ReturnValue(shpFld1,rec1)
theMultiPoint = MultiPoint.MakeEmpty
theMultiPoint = shp0.PointIntersection (shp1)
outShpFld = outFTab.FindField("Shape")
if (theMultiPoint <> NIL) then
thePoints = theMultiPoint.AsList
for each pnt in thePoints
newRec = outFTab.AddRecord
outFTab.SetValue(outShpFld, newRec, pnt)
outFTab.SetValue(outFTab.FindField("ID"), newRec, theID)
theID = theID + 1
for each f in 1 .. (fTab0.GetFields.Count-1)
theValue = fTab0.ReturnValue(fTab0.GetFields.Get(f),rec0)
outFTab.SetValue(outFTab.GetFields.Get(f+1),newRec,theValue)
end
for each f in 1 .. (fTab1.GetFields.Count-1)
theValue = fTab1.ReturnValue(fTab1.GetFields.Get(f),rec1)
outFTab.SetValue(outFTab.GetFields.Get(f+fTab0.GetFields.Count),newRec,theValue)
end
end
end
end
nCount = nCount + 1
av.SetStatus((nCount / nRecs0) * 100)
end
av.ClearStatus
av.ClearMsg
if (MsgBox.YesNo("Add shapefile as theme to a view?",
theTitle, TRUE).Not) then
exit
end
'- add the new point theme to a view
lstViews = {}
for each d in av.GetProject.GetDocs
if (d.Is(View)) then
lstViews.Add( d )
end
end
lstViews.Add("<New View>")
vweAddTo = MsgBox.ListAsString( lstViews,"Add Theme to:", theTitle )
if (vweAddTo <> nil) then
if (vweAddTo = "<New View>") then
vweAddTo = View.Make
vweAddTo.GetWin.Open
end
thmNew = FTheme.Make(outFTab)
vweAddTo.AddTheme( thmNew )
vweAddTo.GetWin.Activate
end
'-------------------------------------------------