Inhalt einer großen Textdatei ändern (Zahlen)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
tco95ttocs
User
Beiträge: 18
Registriert: Mittwoch 1. April 2009, 15:52

Hi
folgendes Problem. Hab ein Polygonshapefile, in welchem ich die Polygone um einen x und y Betrag verschieben will. Allerdings gibts sowas nicht für das automatische Rechnen in ArcGIS! Hab die Daten jetzt als Textdatei, die wie folgt aussieht:
  • Polygon
    0 0
    0 3586150.1069 5672011.7506 1.#QNAN 1.#QNAN
    1 3586398.3978 5672622.5866 1.#QNAN 1.#QNAN
    2 3586529.1344 5672944.2231 1.#QNAN 1.#QNAN
    3 3586657.5397 5673118.1048 1.#QNAN 1.#QNAN
    4 3586690.9307 5673163.3214 1.#QNAN 1.#QNAN
    5 3586896.0089 5673177.281 1.#QNAN 1.#QNAN
    6 3587000.5517 5673097.1636 1.#QNAN 1.#QNAN
    7 3587102.4327 5673139.9236 1.#QNAN 1.#QNAN
    8 3587247.8961 5673129.0518 1.#QNAN 1.#QNAN
    9 3587300.4637 5672944.5544 1.#QNAN 1.#QNAN
    10 3587452.1103 5672943.5229 1.#QNAN 1.#QNAN
    11 3587532.9135 5672587.874 1.#QNAN 1.#QNAN
    12 3587659.892 5672433.7481 1.#QNAN 1.#QNAN
    2 0
    0 3589796.6325 5676569.2281 1.#QNAN 1.#QNAN
    1 3589904.4378 5676544.9746 1.#QNAN 1.#QNAN
    2 3589990.4409 5676553.4289 1.#QNAN 1.#QNAN
    3 3590012.5684 5676502.3723 1.#QNAN 1.#QNAN
    4 3589919.4407 5676447.7363 1.#QNAN 1.#QNAN
    5 3589935.5362 5676349.1035 1.#QNAN 1.#QNAN
    6 3589765.4609 5676298.6425 1.#QNAN 1.#QNAN
    7 3589794.2728 5676239.9299 1.#QNAN 1.#QNAN
    8 3589640.9925 5676150.8722 1.#QNAN 1.#QNAN
    9 3589404.061 5676133.4198 1.#QNAN 1.#QNAN
    10 3589414.4363 5676043.4775 1.#QNAN 1.#QNAN
    11 3589478.0464 5676047.7386 1.#QNAN 1.#QNAN
    12 3589519.1777 5675959.7377 1.#QNAN 1.#QNAN
    13 3589602.741 5676002.246 1.#QNAN 1.#QNAN
    14 3589674.5849 5675802.6652 1.#QNAN 1.#QNAN
    15 3589947.7882 5675902.2325 1.#QNAN 1.#QNAN
    16 3590036.9771 5675644.8463 1.#QNAN 1.#QNAN
Dabei ist die 1. Zahl der Punkt die 2. der X und der 3. der Y-Wert. Die letzten beiden sind uninteressant. die Zeile mit 0 0 und 2 0 gibt die Nummer des folgenden Polygones an. Dies kann bis zu 100 pro Datei gehn!
Nun soll in der Datei jeder X-Wert und y-wert um einen bestimmten vorher ausgerechneten Betrag geändert werden.

Wie kann ich das am schnellsten tun?

Die Anzahl der Zeichen pro Zeile ist ebenso wie die Anzahl der Zeilen beliebig groß, gleiches gilt für die Größe der x und y werte...

Ich hoffe einer hat ne Idee. Wenn nicht sogar ne Lösung ohne Textdatei ;)
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wie wäre es mit
  • Ausgangsdatei zeilenweise lesen
    am Leerzeichen splitten
    Werte holen + ändern
    zeilenweise in neue Datei schreiben
Gruß, noisefloor
Benutzeravatar
krisi12345
User
Beiträge: 205
Registriert: Mittwoch 4. März 2009, 16:56
Wohnort: Das schöne München
Kontaktdaten:

Daran habe ICH auch schon gedacht,
Vieleicht ist dir aber nicht aufgefallen das die Datei nicht nur aus Positions Werten besteht. Und die dazu noch in meheren Teilen aufgebaut sind.
[url=http://www.pc-tutos.de/Tutorials/Tutorials.htm]Wie verändert man Spiele oder Computer nach Wunsch? www.PC-Tutos.de[/url]
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ist doch egal. :-)

Dann baust du nach dem Split halt eine Abfrage ein, die die Länge der Sequenz, die aus dem Split entsteht, entsteht. Wenn = 2 einfach nix machen und Werte in die Ausgabe schreiben.

Oder du analysierst die Zeile vor dem Split per RegEx. Die erste Variante ist IMHO aber einfacher.

Gruß, noisefloor
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hilft dir das vielleicht? Oben rechts in der Auswahl geht's auch zu verschiedenen Foren...
tco95ttocs
User
Beiträge: 18
Registriert: Mittwoch 1. April 2009, 15:52

danke für die antworten...

ja an split hab ich auch schon gedacht, hoffte, das mir gleich einer den code fdafür schreibt;)...
werd ichs morgen mal selber in Angriff nehmen
einzig der Zeitaufwand beim durchlaufen macht mir dann sorgen, da ja doch dann insgesammt so 45000 Datein analysiert werden müssen, die glaub so zw. 100 und mehreren tausend zeilen besteht.

@snafu: ja ARCGIS ist gut, allerdings gibts da nix, was ich fürs automatische Verschieben nutzen kann. Dort geht es nur per Hand und darauf kann ich verzichten glaub ich zumal das Script auch in 1, 2 oder 3 Jahren auf neuere Daten noch angewandt werden soll!
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
einzig der Zeitaufwand beim durchlaufen macht mir dann sorgen,
Ich habe vor kurzen ein kleines Skript geschrieben, dass was ähnliches mit einer csv-Datei macht. Also lesen, Zeilen per RegEx suchen und zurückschreiben.

Bei einer csv-Datei mit ~350.000 Zeilen dauert das bei 1,66 GHz ca. 5 Sekunden, wobei nur ein Kern genutzt wird. Also sollte sich dein Problem zeitnah lösen lassen. :-)

Der folgende Code macht das was du möchtest:

Code: Alles auswählen

eingabe = file('gis.poly', 'r')
ausgabe = file('gis_neu.poly', 'w')

offset = 100000

for zeile in eingabe:

   zeile = zeile.split()
   
   if len(zeile) > 2:
       zeile[1] = float(zeile[1]) + offset
       zeile[2] = float(zeile[2]) + offset
   zeile = map(str,zeile)
   
   zeile = ' '.join(zeile)
   zeile = zeile + '\n'
      
   ausgabe.write(zeile)
Musst du halt nur noch so umstricken, dass eingabe, ausgabe und offset dynamisch generiert werden.

Gruß, noisefloor
pudeldestodes
User
Beiträge: 65
Registriert: Samstag 9. Juni 2007, 23:45

Wenn du alles in einer Shapefile hast, könntest du auch direkt in ArcGIS über die Attributtabelle alle markieren, Edit, Move und die Koordinaten relativ zum derzeitigen Punkt angeben (y + 15m). Sollte eigentlich funktionieren.

Und ArcGIS ist ein scheißlahmer Dreckshaufen. So, das musste mal gesagt werden, das Ding nervt mich derzeit nur....
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

Interessant, wie viele GIS Nutzer hier versteckt sind. Ärger mich auch grade mit ArcGIS rum :D

Das mit dem Move benutze ich oft, zumindest bei geringer Featurezahl klappt das ganz gut, k.A. wie das mit 1000 Polygonen performt. Reicht aber wahrscheinlich für ein paar Kaffee ...
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

@noisefloor: Zum öffnen von Dateien solltest du besser "open" benutzen. Und noch wichtiger: Es existiert ein CSV-Modul ;-)
Das Leben ist wie ein Tennisball.
tco95ttocs
User
Beiträge: 18
Registriert: Mittwoch 1. April 2009, 15:52

pudeldestodes hat geschrieben:Wenn du alles in einer Shapefile hast, könntest du auch direkt in ArcGIS über die Attributtabelle alle markieren, Edit, Move und die Koordinaten relativ zum derzeitigen Punkt angeben (y + 15m). Sollte eigentlich funktionieren.
naja würd ich ja so machen, allerdings ist es halt so, dass ich das eben ca. 12000 mal machen müsste, da 12000 unterschiedliche verschiebungen und darauf hab ich keine Lust, abgesehen davon müsst ich davor auch erstmal noch die 12000 SHP-Files erzeugen, aber das ist ne andere sache...

@noisefloor:

na wenns so schnlee geht bin ich ja beruhigt:)
und danke für den Codeschnippsel, hab vorhin wohl noch ne elegantere Lösung gefunden, gibt ja im GIS die möglichkeit des exportierens in eine textdatei und dann das importiern, beides pythonscripte, da werd ich das beim importieren einfach mit reinbauen und gut ist, zumindst sollte das theoretisch so funktionieren :)
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@EyDu:
Zum öffnen von Dateien solltest du besser "open" benutzen.
Ich hatte gelesen, dass open() seit Version 2.2 als veraltet gekennzeichnet ist. Die Python-Doku (http://docs.python.org/library/functions.html#open) sagt in der Tat aber das Gegenteil.

Gruß, noisefloor
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

Im Übrigen hat ArcGIS auch eine Python Schnittstelle 8) allerdings wird die Manipulation über die Textdateien schneller zum Erfolg führen, zumal man dazu kein ArcGIS braucht, was immer besser ist ...

Übersicht
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

noisefloor hat geschrieben:
Zum öffnen von Dateien solltest du besser "open" benutzen.
Ich hatte gelesen, dass open() seit Version 2.2 als veraltet gekennzeichnet ist.
Ja, das ist in verschiedenen Versionen verschieden. Mal ist es ``deprecated``, mal ist es ``recommended`` ;). Momentan wirds empfohlen und ich denke dass das nun so bleiben wird.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
tco95ttocs
User
Beiträge: 18
Registriert: Mittwoch 1. April 2009, 15:52

das es ne phyton schnittstelle gibt ist klar, sonst würd ich die kaum nutzen ;)
so das Script steht soweit hab aber noch so paar andere Problemchen:)
Antworten