MapX Tipps


Layer vorhanden ?
Dataset vorhanden ?
Dataset erzeugen
Layer packen
Alle Datumparameter ausdrucken
Layer löschen
Koordinatentransformation mit MapX
Layer in Datenbank speichern
Breite und Höhe aus TIF-Header

MapVerm
Home (Übersicht)

Layer vorhanden ?

Public Function IsLayer(Map, Name$) As Boolean
Dim Lyr As MapXLib.Layer
For Each Lyr In Map.Layers
  If UCase(Lyr.Name) = UCase(Name) Then IsLayer = True: Exit Function
Next
IsLayer = False
End Function

Dataset vorhanden ?

Public Function IsDataset(Map, Name$) As Boolean
Dim Lyr As MapXLib.Dataset
For Each Lyr In Map.DataSets
    If UCase(Lyr.Name) = UCase(Name) Then IsDataset = True: Exit Function
Next
IsDataset = False
End Function

Dataset erzeugen

Public Sub MakeDataset(Map, Lyr As Layer, Optional LyrName)
On Error GoTo E1
If IsMissing(LyrName) Then LyrName = Lyr.Name
Map.DataSets.Add miDataSetLayer, Lyr, LyrName
Exit Sub
E1:
If Err.Number <> 1006 And Err.Number <> 1067 Then ShowError "MakeDataset"
End Sub

Layer packen

Private Function lyrPackTable(ByRef m As Map, Lyr As Layer, ByVal FName As String, Optional LayerName As String) As Layer
Dim linfPacked As New LayerInfo
Dim ds As Dataset
For Each ds In m.DataSets
  If ds.Layer.Name = Lyr.Name Then Exit For
Next
If ds.Layer.Name <> Lyr.Name Then Exit Function
On Error Resume Next
Kill FName
On Error GoTo 0
linfPacked.Type = miLayerInfoTypeNewTable
linfPacked.AddParameter "Filespec", FName
linfPacked.AddParameter "Fields", ds.fields
linfPacked.AddParameter "Features", Lyr.AllFeatures
If LayerName <> "" Then linfPacked.AddParameter "Name", LayerName
Set lyrPackTable = m.Layers.Add(linfPacked)
End Function

Alle Datumparameter ausdrucken

Public Sub AllDatum()
Dim i As Integer, D As New Datum, s$
Open "DatumWGS" For Output As 99
s = "<TABLE BORDER=1><TR><TD>Nr</TD><TD>Ellipsoid</TD><TD>PrimeMeridian</TD><TD>RotateX</TD>"
s = s + "<TD>RotateY</TD><TD>RotateZ</TD><TD>ScaleAdjust</TD><TD>ShiftX</TD><TD>ShiftY</TD>"
s = s + "<TD>ShiftZ</TD></TR><TD>Eccentricity</TD><TD>Flattening</TD><TD>SemiMajorAxis</TD>"
s = s + "<TD>SemiMinorAxis</TD>"
Print #99, s
Do While i < 1111
  i = i + 1
  If i = 200 Then i = 1000
  D.SetFromList i
  If D.Ellipsoid <> 28 Then 'WGS84
    s = "<TR><TD>" & i & "</TD>"
    s = s + "<TD>" & D.Ellipsoid & "</TD>"
    s = s + "<TD>" & D.RotateX & "</TD><TD>" & D.RotateY & "</TD><TD>" & D.RotateZ & "</TD>"
    s = s + "<TD>" & D.ScaleAdjust & "</TD>"
    s = s + "<TD>" & D.ShiftX & "</TD><TD>" & D.ShiftY & "</TD><TD>" & D.ShiftZ & "</TD>"
    s = s + "<TD>" & D.Eccentricity & "</TD><TD>" & D.Flattening & "</TD>"
    s = s + "<TD>" & D.SemiMajorAxis & "</TD><TD>" & D.SemiMinorAxis & "</TD>"
    Print #99, s
  End If
Loop: Print #99, "</Table>": Close 99
End Sub

Layer löschen

Function FileExist(Datei$) As Boolean
  Dim l As Long
  On Error Resume Next
  If InStr(Datei, "*") Then
    If Len(Dir(Datei)) Then FileExist = True
  Else
    l = FileLen(Datei)
    FileExist = Not (Err.Number > 0)
  End If
  On Error GoTo 0
End Function


Public Sub KillLayer(B$)
  Dim A$
  A = B & "."
  If FileExist(A + "TAB") Then Kill A + "TAB"
  If FileExist(A + "DAT") Then Kill A + "DAT"
  If FileExist(A + "ID") Then Kill A + "ID"
  If FileExist(A + "MAP") Then Kill A + "MAP"
End Sub

Koordinatentransformation mit MapX

Startsystem mit Koordinaten übergeben, Zielsystem ist hier fest (Bessel 3.Streifen).
Public Sub ToGK3(Lsys As String, y#, x#, y3#, x3#)
  Dim pt As New Point, ft As New Feature
  SetLSys Lsys, Map1
  pt.Set y, x: Set ft = Map1.FeatureFactory.CreateSymbol(pt)
  SetLSys "DA0", Map1
  y3 = ft.CenterX: x3 = ft.CenterY
End Sub

Public Sub SetLSys(a$, Map As MapXLib.Map)
  Dim coord As New MapXLib.CoordSys
  If a = "" Then Exit Sub
  Select Case UCase(Left(a, 2))
    Case "GPS": Map.NumericCoordSys.Set 1, 104: Exit Sub
    Case "FS": coord.Set 30, 1000, 7, 13.62720367, 52.41864828, 0, 0, 0, 1, 40000, 10000
    Case "CA", "CB", "CR": coord.Set 8, 1000, 7, 6, 0, 0, 0, 0, 0, 2500000, 0
    Case "DA", "DB", "DR": coord.Set 8, 1000, 7, 9, 0, 0, 0, 0, 0, 3500000, 0
    Case "EA", "EB", "ER": coord.Set 8, 1000, 7, 12, 0, 0, 0, 0, 0, 4500000, 0
    Case "FA", "FB", "FR": coord.Set 8, 1000, 7, 15, 0, 0, 0, 0, 0, 5500000, 0
    Case "CC": coord.Set 8, 1001, 7, 6, 0, 0, 0, 0, 0, 2500000, 0
    Case "DC": coord.Set 8, 1001, 7, 9, 0, 0, 0, 0, 0, 3500000, 0
    Case "EC": coord.Set 8, 1001, 7, 12, 0, 0, 0, 0, 0, 4500000, 0
    Case "FC": coord.Set 8, 1001, 7, 15, 0, 0, 0, 0, 0, 5500000, 0
  End Select
  Map.NumericCoordSys = coord
  AktLsys = a
End Sub

Layer in Datenbank speichern

Public Sub ToMdb(f As Form, LayerName$)
Dim ds As MapXLib.Dataset, Lyr As MapXLib.Layer, ftrs As Features, ftr As Feature, rv As RowValue, rvs As RowValues
Dim DsRows As Long, DsCols As Long, i As Long, J As Long
Dim db As Database, dy As Recordset, Sql$, t$, typ%, A$, W%, D%

On Error GoTo E2
'
Set Lyr = frmMain.Map1.Layers(LayerName)
MakeDataset frmMain.Map1, Lyr
Set ds = frmMain.Map1.DataSets.Item(LayerName)
f.Data1.Caption = ds.Name & " Datensätze:" & ds.RowCount
Sql = "CREATE TABLE[" & LayerName & "]("
Set ftrs = Lyr.AllFeatures
DsCols = ds.fields.Count + 1
DsRows = ftrs.Count

For i = 0 To DsCols - 2
  t = "[" & ds.fields.Item(i + 1).Name & "]"
  'typ = ds.Fields.Item(i + 1).Type
  typ = ds.fields.Item(i + 1).TypeEx
  Select Case typ
    Case 0: A = "Text" 'String
    Case 1: A = "Double" 'Numeric
    Case 2: A = "Date" 'Datum
    Case 3: A = "Long" 'Integer
    Case 4: A = "Short" 'SmallInteger
    Case 5: A = "Double" 'Double
    Case 6: A = "Boolean" 'Boolean
  End Select
  If typ = 1 Then
    W = ds.fields.Item(i + 1).Precision
    D = ds.fields.Item(i + 1).Decimals
  ElseIf typ = 0 Then
    W = ds.fields.Item(i + 1).Width: A = A & "(" & W & ")"
  End If
  If i > 0 Then Sql = Sql + ","
  Sql = Sql + t + A
Next: Sql = Sql + ",[FeatureKey]Long)"

On Error Resume Next
Set db = CreateDatabase(App.Path & "\Mein.mdb", dbLangGeneral, dbVersion30)
'On Error GoTo E2
Set db = OpenDatabase(App.Path & "\Mein.mdb", False, False, "")
db.Execute Sql
db.Execute "Delete * from " & LayerName
db.Execute ("alter table " & LayerName & " add column CenterX double;")
db.Execute ("alter table " & LayerName & " add column CenterY double;")

Set dy = db.OpenRecordset(LayerName)

Lyr.BeginAccess miAccessRead
i = 1
For Each ftr In ftrs
  Set rvs = ds.RowValues(ftr)
  dy.AddNew
  For J = 0 To rvs.Count - 1
    Set rv = rvs(J + 1)
    If Not IsNull(rv.Value) Then
      If dy(J).Type = dbText Then
         dy(J) = rv.Value
      Else
         dy(J) = rv.Value
      End If
    End If
  Next
  dy(J) = ftr.FeatureKey: dy("centerx") = ftr.CenterX: dy("centery") = ftr.CenterY: dy.Update
  i = i + 1
Next
Lyr.EndAccess miAccessEnd

MsgBox i & " Elemente in Tabelle " & LayerName & " exportiert -- "

e1: On Error GoTo 0: Exit Sub
E2: ShowError: Resume e1
End Sub

Breite und Höhe auf TIF_Header

Sub GetTif(Datei$, W&, H&)
'H. Adelt 20.04.2004
'W=Breite, H=Höhe aus TIF-HEADER
'Datei = "D:\temp\1040\1040eo.tif"
Dim A$, L&
Close 2: Open Datei For Binary As 2
Seek 2, 5:  A = Input(4, 2)
L = (Asc(Mid(A, 1, 1)) + Asc(Mid(A, 2)) * 256#) + 21
Seek 2, L:  A = Input(4, 2)
W = (Asc(Mid(A, 3, 1)) + Asc(Mid(A, 4)) * 256#)
Seek 2, L + 12: A = Input(4, 2)
H = (Asc(Mid(A, 3, 1)) + Asc(Mid(A, 4)) * 256#): Close 2
End Sub


Seitenanfang Dipl.-Ing. Hans Adelt