Hallo GIS-Freunde,
ich habe da folgendes Problem: Aus meiner Microsoft Access-Datenbank muss ich Shapefiles, also Point-Shapes, besser wären (für die Darstellung) sogar Line-Shapes erstellen. Jetzt werden viele an die "Add XY-Funktion" denken, aber das funktioniert in meinem Fall nicht, da meine Access-Tabelle leider für andere Auswertungen ein anderes Format haben muss. Die Koordinaten für ein zuküftiges Shape stehen alle in einer ZEILE und nicht wie üblich in einer Spalte. Also bildet jede Spalte der Tabelle einen anderen Koordinatenpunkt. Ich habe insgesamt 32 Lat-Werte und 32 Lon-Werte. In den ersten 32 Spalten stehen demnach hintereinander weg Lat-Werte und dann erst folgen ebenfalls hintereinander die Lon-Werte.
Beispielsweise steht der erste Koordinatenpunkt in der 1. Spalte (Breite) und in der 33.Spalte (Länge), der zweite dann wiederum in der 2. Spalte (Breite) und in der 34. Spalte (Länge) usw...
So, ich hoffe ihr habt jetzt eine Vorstellung bekommen, wie die Tabelle aussieht.
Da ich ein sehr großes Datenvolumen habe, müsste das ganze dann noch automatisch ablaufen.
Also das Script müsste irgendwie erstmal ein Shape erzeugen, sich die Koordinaten dann irgendwie aus der Access-Tabelle ziehen und das dann immer wieder wiederholen (für jede ZEILE der Tabelle, denn jede Zeile repräsentiert ein Shape)
Leider bin ich ein Neuling in VBA und wurde aus vielen Scripts, die ich unter esri.com gefunden habe nicht so richtig schlau.
Ich weiß, es klingt kompliziert, aber ich denke/hoffe, dass alles möglich ist und mir jemand hier im Forum helfen kann.
Ach ja, ich arbeite mit ArcGIS 9.2
Mit besten Grüßen,
Dennis
ich habe da folgendes Problem: Aus meiner Microsoft Access-Datenbank muss ich Shapefiles, also Point-Shapes, besser wären (für die Darstellung) sogar Line-Shapes erstellen. Jetzt werden viele an die "Add XY-Funktion" denken, aber das funktioniert in meinem Fall nicht, da meine Access-Tabelle leider für andere Auswertungen ein anderes Format haben muss. Die Koordinaten für ein zuküftiges Shape stehen alle in einer ZEILE und nicht wie üblich in einer Spalte. Also bildet jede Spalte der Tabelle einen anderen Koordinatenpunkt. Ich habe insgesamt 32 Lat-Werte und 32 Lon-Werte. In den ersten 32 Spalten stehen demnach hintereinander weg Lat-Werte und dann erst folgen ebenfalls hintereinander die Lon-Werte.
Beispielsweise steht der erste Koordinatenpunkt in der 1. Spalte (Breite) und in der 33.Spalte (Länge), der zweite dann wiederum in der 2. Spalte (Breite) und in der 34. Spalte (Länge) usw...
So, ich hoffe ihr habt jetzt eine Vorstellung bekommen, wie die Tabelle aussieht.
Da ich ein sehr großes Datenvolumen habe, müsste das ganze dann noch automatisch ablaufen.
Also das Script müsste irgendwie erstmal ein Shape erzeugen, sich die Koordinaten dann irgendwie aus der Access-Tabelle ziehen und das dann immer wieder wiederholen (für jede ZEILE der Tabelle, denn jede Zeile repräsentiert ein Shape)
Leider bin ich ein Neuling in VBA und wurde aus vielen Scripts, die ich unter esri.com gefunden habe nicht so richtig schlau.
Ich weiß, es klingt kompliziert, aber ich denke/hoffe, dass alles möglich ist und mir jemand hier im Forum helfen kann.
Ach ja, ich arbeite mit ArcGIS 9.2
Mit besten Grüßen,
Dennis
- Anmelden oder Registieren, um Kommentare verfassen zu können
Gespeichert von Johann Damm am Mi., 17.09.2008 - 15:04
Permalinkwarum nicht über "xy-Daten hinzufügen"? Das Ganze 32 mal mit jeweils den passenden Koordinatenpaaren (x= Spalte1, y = Spalte33 ),
(x = Spalte2, y = Spalte34) und so fort.
Den ganzen Krempel in einen Gruppenlayer als Punkt-Shapes.
Anschließend neues Line-Shape anlegen, Fangenmodus an die Punkte (aus dem Gruppenlayer) und ein Polgon digitalisieren- fertig.
Ist vielleicht umständlich aber erfordert kein Studium von VBA oder elendige Abfragen in der ACCESS-Datenbank.
Gruß
Johann
Gespeichert von Dennis am Mi., 17.09.2008 - 16:42
Permalinkdanke erst einmal für deine Antwort. Ich dachte schon, dass mir hier gar keiner mehr antwortet. Deine Überlegung ist gar nicht schlecht. Das würde auch gehen, wenn ich nur insgesamt eine Zeile habe. Ich versuche es nochmal kurz zu erklären: Ich möchte ein Punktshape oder besser noch Linienshape aus den Koordinaten erstellen, die in einer Zeile stehen. Also besteht nachher das Shapefile insgesamt aus 32 Punkten, die aber nunmal in meiner Access-Tabelle in einer Zeile nebeneinander stehen. Darunter folgen dann ungefähr noch 2920 Zeilen, von denen aber wiederum jede Zeile ein Shapefile werden müsste.
Bei deinem Vorschlag würde ich alleine schon bei dem ersten Koordinatenpaar 2920 Punkte erhallten, die aber niemals zusammengehören. Nur die Punkte aus der ersten Zeile der jeweiligen Spalten (z.B. 1 ; 33) gehören zusammen.
Vielleicht haben hier einige schon einmal was von Trajektorien gehört. Eine Trajektorie gibt den Weg eines Luftpakets an, den es zurückgelegt hat. In einer ZEILE meiner Access-Tabelle stehen die Koordinaten für diese Trajektorie. Trajektorien stellt man normalerweise als Linien da, um genau den Weg des Luftpakets wider zu spiegeln. Daher wäre für mich die beste Lösung ein Linienshape. Da ich aber nur Punkte habe, wäre es auch erstmal gut, ein Punktshape für jede Trajektorie zu erzeugen.
Ich benötige demnach kein Polygon!
Beste Grüße,
Dennis
Gespeichert von Wolfgang am Do., 18.09.2008 - 08:40
Permalinkmal ein kurzes brainstorming:
Wenn ich höre, dass Koordinatenpaare hintereinander in einer Zeile stehen, denke ich spontan an das GoogleEarth-Format kml. Das ist ein einfaches XML-Format. Du müsstest also deine Koordinatenzeile in ein KML einbauen, dann erhältst Du eine Google-Earth Polylinie (vorausgesetzt, die Koordinaten liegen geografisch vor). Die kannst Du dann mit dem kleinen Programm "kml2shp" in ein Shape umwandeln.
Ich würde mal folgendes versuchen:
In GoogleEarth eine Linie zeichnen und das Ganze als KML abspeichern. Dann die Datei in einem Editor öffnen und mal anschauen, wie die Koordinaten da drinstehen. Dann diese durch die eigenen ersetzen - fertig!
Hier ein Beispiel einer einfachen Linie aus zwei Punkten:
<Placemark>
<name>extruded</name>
<LineString>
<extrude>1</extrude>
<tessellate>1</tessellate>
<altitudeMode>relativeToGround</altitudeMode>
<coordinates>
-122.364167,37.824787 -122.363917,37.824423
</coordinates>
</LineString>
</Placemark>
In der Zeile "coordinates" stehen alle Koordinaten einer Linie hintereinander (Punkt als Dezimalzeichen, Komme als Trenner, Leerzeichen zwischen den Koordinatenpaaren)
Viel Erfolg!
Wolfgang
http://www.ili-gis.com
Gespeichert von Dennis am Fr., 19.09.2008 - 13:58
Permalinkdanke für deinen Tipp. Ich habe das mal ausprobiert und es würde auch gehen, wenn ich einen kleinen Datensatz hätte. Dann könnte ich das manuell austauschen und könnte ein Shape erzeugen. Allerdings muss ich mehrere tausend shapes erzeugen und daher muss das ganze automatisch geschehen.
Ich habe mal bei support.esri.com ein Forenbeitrag entdeckt, wo einer ähnliche Probleme hatte. Er hat dann ein Script geschreieben, dass ich hier mal übernommen hab. Leider bekomme ich es bei mir nicht richtig zum Laufen, vielleicht kann mir einer schreiben, was ich daran verändern müsste, damit es bei mir läuft:
Public Sub XY2Shape()
On Error GoTo ErrorHandler:
'New property set for workspacefactory
Dim pPropset As IPropertySet
Set pPropset = New PropertySet
'Provider = MS OLE DB provider for Access.
pPropset.SetProperty "CONNECTSTRING", "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:\YourDatabase.mdb"
'Create the new workspace/feature workspace objects
Dim pWorkspaceFact As IWorkspaceFactory
Set pWorkspaceFact = New OLEDBWorkspaceFactory
Dim pWorkspace As IWorkspace
Set pWorkspace = pWorkspaceFact.Open(pPropset, 0)
Dim pFeatWorkspace As IFeatureWorkspace
Set pFeatWorkspace = pWorkspace
'If a sub-set of the table is required and views are supported by the data source
'Create a view of the table selection you wish to use.
Dim SQLstr As String
SQLstr = "CREATE VIEW NewTable AS SELECT * FROM TableA WHERE TableA.FieldA = 'something'"
'Create the view and fetch the datasetnames from the workspace
pWorkspace.ExecuteSQL SQLstr
Dim pEnumDataset As IEnumDatasetName
Dim pDataset As IDatasetName
Set pEnumDataset = pWorkspace.DatasetNames(esriDTAny)
Set pDataset = pEnumDataset.Next
Do Until pDataset Is Nothing
If pDataset.Name = "NewTable" Then
Exit Do
End If
Set pDataset = pEnumDataset.Next
Loop
'Create the new table object from the dataset name
Dim pTable As ITable
Set pTable = pFeatWorkspace.OpenTable(pDataset.Name)
Dim pTableName As IName
Dim pDS As IDataset
Set pDS = pTable
Set pTableName = pDS.FullName
'Set the field properties for the event theme
Dim pXYEvent2FieldsProperties As IXYEvent2FieldsProperties
Set pXYEvent2FieldsProperties = New XYEvent2FieldsProperties
With pXYEvent2FieldsProperties
.XFieldName = "lon"
.YFieldName = "lat"
.ZFieldName = ""
End With
'Set the spatial reference for the event theme
Dim pSpatialReferenceFactory As ISpatialReferenceFactory
Dim pProjectedCoordinateSystem As IProjectedCoordinateSystem
Set pSpatialReferenceFactory = New SpatialReferenceEnvironment
Set pProjectedCoordinateSystem = pSpatialReferenceFactory.CreateProjectedCoordinate System(esriSRProjCS_NAD1983SPCS_MT) 'Replace with your coordinate system
Dim pXYEventSourceName As IXYEventSourceName
Set pXYEventSourceName = New XYEventSourceName
'Combine all the properties for the event theme
With pXYEventSourceName
Set .EventProperties = pXYEvent2FieldsProperties
Set .SpatialReference = pProjectedCoordinateSystem
Set .EventTableName = pTableName
End With
Dim pName As IName
Dim pXYEventSource As IXYEventSource
Set pName = pXYEventSourceName
Set pXYEventSource = pName.Open
'This will be the output Shapefile
Dim pShapeName As IDatasetName
Set pShapeName = New FeatureClassName
Dim pShapeWSFactory As IWorkspaceFactory
Dim pShapeWS As IDataset
Dim pShapeWSName As IWorkspaceName
Set pShapeWSFactory = New ShapefileWorkspaceFactory
Set pShapeWS = pShapeWSFactory.OpenFromFile("C:\temp", Application.hWnd)
Set pShapeWSName = pShapeWS.FullName
pShapeName.Name = "NewShapefile"
Set pShapeName.WorkspaceName = pShapeWSName
'Convert XYEventSource to Shapefile
Dim pFDConverter As IFeatureDataConverter
Set pFDConverter = New FeatureDataConverter
pFDConverter.ConvertFeatureClass pName, Nothing, Nothing, pShapeName, Nothing, Nothing, "", 1000, Application.hWnd
MsgBox "Conversion complete", vbExclamation
'Create a new feature layer and assign shapefile to it
Dim pFeatureWorkspace As IFeatureWorkspace
Set pFeatureWorkspace = pShapeWS
Dim pFlayer As IFeatureLayer
Set pFlayer = New FeatureLayer
Set pFlayer.FeatureClass = pFeatureWorkspace.OpenFeatureClass("NewShapefile")
pFlayer.Name = "YourLayerName"
'Add the FeatureLayer to the FocusMap
Dim pDoc As IMxDocument
Set pDoc = ThisDocument
Dim pMap As IMap
Set pMap = pDoc.FocusMap
pMap.AddLayer pFlayer
Exit Sub
ErrorHandler:
MsgBox Err.Number & Err.Description
End Sub
Klar, an dem Punkt mit Source=D:\YourDatabase habe ich natürlich den Pfad meiner Datenbank eingegeben und die sql-Abfrage erzeugt auch eine neue Tabelle in meiner Access-Datenbank.
Da ich mich nicht so mit ArcObjects auskenne, kann mir hier vielleicht jemand sagen, welche kleinen Veränderungen ich an dem Script vornehmen müsste, damit zum Schluss ein Shape in ArcMap erzeugt wird.
Gruß,
Dennis
Gespeichert von Wolfgang am Fr., 19.09.2008 - 16:53
Permalinknochmal zu meiner ersten Idee:
Mach doch einfach einen Serienbrief in Word, mit der Access-Tabelle als Datenquelle und dem KML-Text als "Gerüst". Dann speicherst Du den fertigen "Brief" als TXT-Datei und benennst sie in *.kml um - fertig!
Also in etwa so:
<Placemark>
<name>extruded</name>
<LineString>
<extrude>1</extrude>
<tessellate>1</tessellate>
<altitudeMode>relativeToGround</altitudeMode>
<coordinates>
[TABELLENWERT]
</coordinates>
</LineString>
</Placemark>
[NÄCHSTER DATENSATZ]
Gruß
Wolfgang