Gleitkommazahlen paarweise speichern

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.
BlackJack

Also bei mir funktioniert das mit der Datei, die unter der angegeben URL zu finden ist.

Die Fehlermeldung besagt, dass die Länge der Daten nicht durch die Länge eines einzelnen Floats teilbar ist. Also konkret, dass die Dateilänge nicht durch 4 teilbar ist.

Sind Floats auf Deiner Plattform vier Bytes gross? Nachprüfbar mit:

Code: Alles auswählen

In [203]: import array

In [204]: array.array('f').itemsize
Out[204]: 4
Nachtrag: Argh, eine Binärdatei sollte man natürlich auch im Binärmodus öffnen. Unter Windows macht das ja einen Unterschied. Also noch eine kleine Korrektur:

Code: Alles auswählen

    with open(filename, 'rb') as coordinate_file:
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

@musikus:
Ich verstehe nicht, warum du nicht mit der Datei KOOR4.DAT herausrückst, die in deiner Prozedur INTERPOLIEREN.PAS eingelesen wird und deren Output dann erst die anscheinend nicht unproblematische Binärdatei KOOR4.INT ist.
farid
User
Beiträge: 95
Registriert: Mittwoch 8. Oktober 2008, 15:37

BlackJack hat geschrieben:@farid: Das mit den 6-Byte-`Real`\s überrascht mich. Kann es sein, dass die Quelle sich da irrt? Wenn man sich die Datei im Hexeditor anschaut, würde ich auf den ersten Blick behaupten ein 4-Byte-Muster zu sehen.
Ich müsste da erst in meinen alten Turbo Pascal 6 Handbüchern nachschauen, aber die sind im Keller und tief verkramt... :? Aber daß das was mit 6 Bytes/Real war, da glaube ich mich ziemlich genau zu erinnern.

Auf jeden Fall spricht die Dateigröße von KOOR4.INT (97800) nicht dagegen, da sie genau durch 12 (6*2) teilbar ist. Sie ist auch durch 8 (4*2) genau teilbar, was für 4 Bytes/Real spricht, aber nicht durch 16 (8*2), also nicht 8 Bytes/Real... (vorausgesetzt dort sind ausschließlich Paare von Real drin und nichts anderes).

Noch was: wenn ich mich richtig erinnere, hatte auch UCSD-Pascal Reals zwar als 4 Bytes, aber nicht IEEE 754-konform gespeichert.
musikus
User
Beiträge: 14
Registriert: Donnerstag 9. Oktober 2008, 13:39
Kontaktdaten:

numerix hat geschrieben:@musikus:
Ich verstehe nicht, warum du nicht mit der Datei KOOR4.DAT herausrückst, die in deiner Prozedur INTERPOLIEREN.PAS eingelesen wird und deren Output dann erst die anscheinend nicht unproblematische Binärdatei KOOR4.INT ist.

Hi numerix, ein Stück der Datei KOOR4.DAT habe ich schon ganz am Anfang beigefügt.

Nach der letzten Änderung die mir BlackJack geschrieben hat funktioniert das Einlesen der Daten aus dem Binärfile, leider aber noch
nicht ganz so wie ich es brauche.

Hier noch einmal ein Auszug aus der Datei KOOR4.DAT
Die Bedeutung "Richtung, Grad, Minuten, Richtung, Grad, Minuten.
Es ist ein ganz normaler Textfile.


B RENNEL-INSEL
S 11 27 O 159 48
S 11 22 O 160 00
S 11 33 O 160 47
S 11 38 O 160 35
S 11 33 O 160 00
S 11 27 O 159 48
B SANTA CRUZ 1.INSEL
S 10 38 O 165 35
S 10 38 O 165 53
S 10 44 O 165 59
S 10 41 O 165 47
S 10 47 O 165 35
S 10 38 O 165 35
B 2.INSEL
S 11 11 O 166 34
B 3.INSEL
S 11 33 O 166 52
S 11 38 O 167 4
S 11 49 O 166 58
S 11 33 O 166 52
B NEUKALEDONIEN(FRA)
S 20 O 164 1
S 20 21 O 165 24
S 21 18 O 166 34
S 22 4 O 167 21
S 22 20 O 167 9
S 20 52 O 164 54
S 20 O 164 1
farid
User
Beiträge: 95
Registriert: Mittwoch 8. Oktober 2008, 15:37

musikus hat geschrieben:Nach der letzten Änderung die mir BlackJack geschrieben hat funktioniert das Einlesen der Daten aus dem Binärfile, leider aber noch
nicht ganz so wie ich es brauche.
Kannst Du bestätigen, daß diese Datei mit Turbo Pascal erstellt wurde (und nicht etwa mit einem anderen Pascal-Compiler/Interpreter)? Dann suche ich mal das genaue Bitmuster aus der Borland-Doku heraus.
musikus
User
Beiträge: 14
Registriert: Donnerstag 9. Oktober 2008, 13:39
Kontaktdaten:

BlackJack hat geschrieben:Also bei mir funktioniert das mit der Datei, die unter der angegeben URL zu finden ist.

Die Fehlermeldung besagt, dass die Länge der Daten nicht durch die Länge eines einzelnen Floats teilbar ist. Also konkret, dass die Dateilänge nicht durch 4 teilbar ist.

Sind Floats auf Deiner Plattform vier Bytes gross? Nachprüfbar mit:

Code: Alles auswählen

In [203]: import array

In [204]: array.array('f').itemsize
Out[204]: 4
Nachtrag: Argh, eine Binärdatei sollte man natürlich auch im Binärmodus öffnen. Unter Windows macht das ja einen Unterschied. Also noch eine kleine Korrektur:

Hi BlackJack, nach der letzten kleinen Änderung "with open(filename, 'rb') as coordinate_file:" funktioniert das Einlesen.

Es wird aber der ganze File eingelesen, da die Daten aber noch umgerechnet werden müssen (Grad in Bogen), sollte die Funktion aber jeweils nur
einen Satz Daten einlesen und beim nächsten Aufruf den Nächsten.

Die Sache ist für mich noch so undurchsichtig das ich im Moment nicht
in der Lage bin das selber zu modifizieren, ich verstehe es einfach nicht :-(

Auf jeden Fall schon mal an Alle vielen Dank für Eure Hilfe, das ist schon
ein großer Schritt in die richtige Richtung.

Gruß musikus




Code: Alles auswählen

    with open(filename, 'rb') as coordinate_file:
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Schau dir doch einfach die Dokus zu den einzelnen Funktionen an und probier nen bischen in der Shell rum.

Code: Alles auswählen

In [1]: l = range(20)

In [2]: itr = iter(l)

In [3]: itr.next()
Out[3]: 0

In [4]: itr.next()
Out[4]: 1

In [5]: l
Out[5]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

In [6]: for i in itr:
   ...:     print i
   ...:     
   ...:     
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

In [7]: itr.next()
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)

/home/dax/<ipython console> in <module>()

StopIteration: 

In [8]: itr = iter(l)

In [9]: zip(itr, itr)
Out[9]: 
[(0, 1),
 (2, 3),
 (4, 5),
 (6, 7),
 (8, 9),
 (10, 11),
 (12, 13),
 (14, 15),
 (16, 17),
 (18, 19)]
Schau dir einfach die Hilfe zu iter() an.
farid
User
Beiträge: 95
Registriert: Mittwoch 8. Oktober 2008, 15:37

farid hat geschrieben:Kannst Du bestätigen, daß diese Datei mit Turbo Pascal erstellt wurde (und nicht etwa mit einem anderen Pascal-Compiler/Interpreter)? Dann suche ich mal das genaue Bitmuster aus der Borland-Doku heraus.
Okay, ich antworte auf meine eigene Frage.

Laut Doku von TP 6.0, gibt es folgende interne Darstellungen:

* Real: belegt 6 Bytes (48 Bit), die so angeordnet sind:

MSB -> LSB

v (1 bit): Vorzeichenbit
f (39 bit): Mantisse
e (8 bit): Exponent

if 0 < e <= 255 then w = (-1)^v * 2^(e-129) * (1.f)
if e = 0 then w = 0

NaNs und denormalisierte Zahlen können nicht im Format Real gespeichert werden: denormalisierte Zahlen werden gleich 0 gesetzt, NaNs und Unendlichkeiten erzeugen einen Überlauf.

* Single: belegt 4 Bytes (32 bit), die so angeordnet sind:

MSB -> LSB

v (1 bit): Vorzeichenbit
e (8 bit): Exponent
f (23 bit): Mantisse

if 0 < e and e < 255 then w = (-1)^v * 2^(e-127) * (1.f)
if e = 0 and f <> 0 then w = (-1)^v * 2^(-126) * (0.f)
if e = 0 and f = 0 then w = (-1)^v * 0
if e = 255 and f = 0 then w = (-1)^v * Inf
if e = 255 and f <> 0 then w = NaN

* Double: belegt 8 Bytes (64 bit), die so angeordnet sind:

MSB -> LSB

v (1 bit): Vorzeichenbit
e (11 bit): Exponent
f (52 bit): Mantisse

if 0 < e and e < 2047 then w = (-1)^v * 2^(e-1023) * (1.f)
if e = 0 and f <> 0 then w = (-1)^v * 2^(-1022) * (0.f)
if e = 0 and f = 0 then w = (-1)^v * 0
if e = 2047 and f = 0 then w = (-1)^v * Inf
if e = 2047 and f <> 0 then w = NaN

* Extended: belegt 10 Bytes (80 bit), die so angeordnet sind:

MSB -> LSB

v (1 bit): Vorzeichenbit
e (15 bit): Exponent
i (1 bit): (siehe Formel unten)
f (63 bit): Mantisse

if 0 <= e and e < 32767 then w = (-1)^v * 2^(e-16383) * (i.f)
if e = 32767 and f = 0 then w= (-1)^v * Inf
if e = 32767 and f <> 0 then w = NaN

Das müßte man jetzt nur noch zu einem Python-Modul umschreiben (z.B. indem man sich an 'struct' oder 'array' anlehnt, und schon kann man dann die Turbo Pascal Binärdaten lesen.

Hoffentlich habe ich da keine Tippfehler drin. ;)
BlackJack

@musikus: Was funktioniert denn jetzt genau nicht? Also bei mir sehen die Daten (gekürzt) so aus:

Code: Alles auswählen

[(-9.6499996185302734, 79.266670227050781),
 (-9.5333328247070312, 78.949996948242188),
 (-9.4166669845581055, 78.633331298828125),
 (-9.2119045257568359, 78.352378845214844),
 (-9.0071430206298828, 78.071426391601562),
 (-8.8023815155029297, 77.790473937988281),
 (-8.5976190567016602, 77.509521484375),
 (-8.3928565979003906, 77.228569030761719),
 (-8.1880950927734375, 76.947616577148438),
 (-7.9833331108093262, 76.666664123535156),
 (-8.2460784912109375, 76.367645263671875),
 (-8.5088233947753906, 76.068626403808594),
 (-8.7715682983398438, 75.769607543945312),
# ...
 (-76.55853271484375, -64.778045654296875),
 (-76.602027893066406, -65.080490112304688),
 (-76.645523071289062, -65.382926940917969),
 (-76.689018249511719, -65.68536376953125),
 (-76.732521057128906, -65.987808227539062),
 (-76.776016235351562, -66.290245056152344),
 (-76.819511413574219, -66.592681884765625),
 (-76.863006591796875, -66.895118713378906),
 (-76.906501770019531, -67.197563171386719),
 (-76.949996948242188, -67.5),
 (200.0, 200.0)]
In wiefern weichen die die vom erwarteten Ergebnis ab?

Und was versuchst Du eigentlich genau zu machen? Hoffentlich keine 1:1-Umsetzung der Pascal-Programme? Denn dieses Zwischenformat ist ziemlich ekelig. Nicht nur, dass man mit solchen Binärdaten Probleme mit der Portabilität bekommen kann, sondern auch, dass ganz normale Koordinaten wie (100.0, 100.0) und (200.0, 200.0) besondere Bedeutungen haben, ist extrem unschön. Wenn irgend wann einmal so eine Koordinate ganz regulär in den Daten vorkommt, fällt man damit auf die Nase.

Wird diese Zwischendatei wirklich benötigt? Kann man die Interpolation nicht einfach als Schritt vor dem Zeichenen in das Programm einbauen? Die Zeiten, dass man bei so etwas Rechenzeit oder Speicher sparen musste, sind ja mittlerweile vorbei. Zumindest bei diesen kleinen Datenmengen, denn 12k interpolierte Koordinaten sind ja ein Witz.

Und die beiden Prozeduren die wir kennen, sehen nicht nach gutem Programmierstil nach heutigen Massstäben aus. Das sind ja wirklich Prozeduren, also Namen für Code-Abschnitte die auf globalen Daten operieren und keine in sich abgeschlossenen Funktionen.
BlackJack

@farid: Ich denke das mit dem Fliesskommaformat ist jetzt erledigt, es sind TurboPascal-`Single` also C-`float`\s und die sind kein Problem. Und problematisch wäre eigentlich auch nur TurboPascal's `Real` weil das kein IEEE-Format ist, sondern etwas selbst gebackenes von Borland.

@musikus: Wie schon gesagt, die Zeiten von zu wenig Speicher sind vorbei, 12k Koordinaten passen problemlos in den Speicher, auch mehrfach.

Ansonsten kann man natürlich auch immer 8-Byte-Blöcke lesen und die dekodieren:

Code: Alles auswählen

#!/usr/bin/env python
from __future__ import with_statement
import struct
from functools import partial


def iter_coordinates_file(data_file):
    return (struct.unpack('ff', block)
            for block in iter(partial(data_file.read, 8), ''))


def main():
    with open('KOOR4.INT', 'rb') as data_file:
        for x, y in iter_coordinates_file(data_file):
            print x, y


if __name__ == '__main__' :
    main()
musikus
User
Beiträge: 14
Registriert: Donnerstag 9. Oktober 2008, 13:39
Kontaktdaten:

BlackJack hat geschrieben:@musikus: Was funktioniert denn jetzt genau nicht? Also bei mir sehen die Daten (gekürzt) so aus:

Code: Alles auswählen

[(-9.6499996185302734, 79.266670227050781),
 (-9.5333328247070312, 78.949996948242188),
 (-9.4166669845581055, 78.633331298828125),
 (-9.2119045257568359, 78.352378845214844),
 (-9.0071430206298828, 78.071426391601562),
 (-8.8023815155029297, 77.790473937988281),
 (-8.5976190567016602, 77.509521484375),
 (-8.3928565979003906, 77.228569030761719),
 (-8.1880950927734375, 76.947616577148438),
 (-7.9833331108093262, 76.666664123535156),
 (-8.2460784912109375, 76.367645263671875),
 (-8.5088233947753906, 76.068626403808594),
 (-8.7715682983398438, 75.769607543945312),
# ...
 (-76.55853271484375, -64.778045654296875),
 (-76.602027893066406, -65.080490112304688),
 (-76.645523071289062, -65.382926940917969),
 (-76.689018249511719, -65.68536376953125),
 (-76.732521057128906, -65.987808227539062),
 (-76.776016235351562, -66.290245056152344),
 (-76.819511413574219, -66.592681884765625),
 (-76.863006591796875, -66.895118713378906),
 (-76.906501770019531, -67.197563171386719),
 (-76.949996948242188, -67.5),
 (200.0, 200.0)]

In wiefern weichen die die vom erwarteten Ergebnis ab?

Bei mir sehen die Daten inzwischen auch so aus,
ich brauche aber nur immer einen Datensatz weil die Daten
noch umgerechnet werden müssen.


Und was versuchst Du eigentlich genau zu machen? Hoffentlich keine 1:1-Umsetzung der Pascal-Programme? Denn dieses Zwischenformat ist ziemlich ekelig. Nicht nur, dass man mit solchen Binärdaten Probleme mit der Portabilität bekommen kann, sondern auch, dass ganz normale Koordinaten wie (100.0, 100.0) und (200.0, 200.0) besondere Bedeutungen haben, ist extrem unschön. Wenn irgend wann einmal so eine Koordinate ganz regulär in den Daten vorkommt, fällt man damit auf die Nase.

Wird diese Zwischendatei wirklich benötigt?

Das sind die Koordinaten mit denen eine Winkelgetreue Abbildung
der Welt erzeugt werden soll und zwar um jeden X beliebigen Punkt. Wenn das Format so schlecht ist, könnte man auch aus den Rohdaten "KOOR4.DAT" ein anderes Format erzeugen.


Kann man die Interpolation nicht einfach als Schritt vor dem Zeichenen in das Programm einbauen? Die Zeiten, dass man bei so etwas Rechenzeit oder Speicher sparen musste, sind ja mittlerweile vorbei. Zumindest bei diesen kleinen Datenmengen, denn 12k interpolierte Koordinaten sind ja ein Witz.

Und die beiden Prozeduren die wir kennen, sehen nicht nach gutem Programmierstil nach heutigen Massstäben aus. Das sind ja wirklich Prozeduren, also Namen für Code-Abschnitte die auf globalen Daten operieren und keine in sich abgeschlossenen Funktionen.


Das ist wohl wahr, wie schon gesagt ist das ein uraltes Programm und mit heißer Nadel gestrickt.

Für heut möchte ich mich verabschieden und bedanke mich noch
einmal bei Allen für die freundliche Hilfe, werde mir das alles in Ruhe ansehen und vielleicht komme ich jetzt schon alleine zurecht.

Gute Nacht musikus
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Also du scheiterst gerade echt daran, dass du immer nur einen Datensatz brauchst?

Das meinst du nicht ganz ernst, oder? Arbeite das Tutorial durch!
musikus
User
Beiträge: 14
Registriert: Donnerstag 9. Oktober 2008, 13:39
Kontaktdaten:

audax hat geschrieben:Also du scheiterst gerade echt daran, dass du immer nur einen Datensatz brauchst?

Das meinst du nicht ganz ernst, oder? Arbeite das Tutorial durch!

Hallo audax, nein das meine ich nicht im Ernst, war gestern schon zu kaputt um noch einmal zu Antworten,
es ist alles ok und es funktioniert so wie ich es mir vorgestellt habe.

Das Problem was für Euch keines war ist gelöst und ich bedanke mich
noch einmal recht herzlich für die Hilfestellung, vielen Dank an Alle

Gruß musikus
BlackJack

Kann es sein, dass die Daten in der `*.DAT`-Datei an festen Spalten ausgerichtet sind? Sonst kann die `Interpolieren.pas` so nicht funktionieren. Und bei dem zweiten Beispiel aus der Datei ist die letzte Insel nicht eindeutig weil bei der ersten und letzten Koordinate bei der Breitenangabe entweder die Grad- oder die Minutenangabe fehlt.

Hier ist mal eine Umsetzung vom Interpolieren: http://paste.pocoo.org/show/87675/

Das Eingabeformat entspricht dem, was Du hier gezeigt hast. In dem auskommentierten Block in `parse_coordinate()` ist (natürlich ungetesteter) Code für ein Format mit festen Spalten, basierend auf dem Pascal-Quelltext.

Die Lösung ist "lazy", d.h. es wird immer nur eine Zeile gelesen und verarbeitet. Aber wie gesagt, die Grenzen von TurboPascal sind heutzutage überholt, man kann auch mehr als 64 KiB in eine Datenstruktur stecken. :-) In Python würde man da wahrscheinlich eher mit OOP heran gehen und das Eingabeformat in eine Liste mit Polygon-Objekten umwandeln und im Speicher halten. Sollten die Datenmengen zu gross für den Speicher werden, weil man heutzutage natürlich auch viel mehr Punkte für eine höhere Auflösung verarbeiten kann, dann könnte man die Daten in eine Datenbank stecken.
musikus
User
Beiträge: 14
Registriert: Donnerstag 9. Oktober 2008, 13:39
Kontaktdaten:

BlackJack hat geschrieben:Kann es sein, dass die Daten in der `*.DAT`-Datei an festen Spalten ausgerichtet sind? Sonst kann die `Interpolieren.pas` so nicht funktionieren.

Hallo BlackJack, ja, die Daten der KOOR4.DAT sollten an feste Spalten
gebunden sein. Die Daten wurden von Hand (nicht von mir) aus Landkarten übertragen und danach von einer Sekrätärin eingetippt.
Aus diesen Daten sollte diese spezielle projektion der Welt erzeugt werden. Das sich da hunderte Fehler eingeschlichen haben liegt an
der Sache, die ersten Ergebnisse erinnerten eher an einen Schnittmusterbogen und nicht an eine Weltkarte. Nachdem die meisten
Fehler behoben waren stellte sich herraus das wie nicht anders zu erwarten die Koordinaten zu unregelmäßig und zu spärlich waren.
Das war der Grund um ein Hilfsprogramm zu erstellen um mit diesen
die Daten etwas aufzupäppeln. Das zu der Entstehungsgeschichte
dieses Programms.



Und bei dem zweiten Beispiel aus der Datei ist die letzte Insel nicht eindeutig weil bei der ersten und letzten Koordinate bei der Breitenangabe entweder die Grad- oder die Minutenangabe fehlt.


Das kann gut sein, habe einfach jeweils ein Stück aus der Datei
kopiert an der man die Struktur erkennen kann, muss wohl in
den sauren Apfel beißen und versuchen diese Fehler noch zu
korrigieren, das kann ich mir aber auch sparen denn das Programm
wird nicht gebraucht, mache das einfach aus reinem Interesse.


Hier ist mal eine Umsetzung vom Interpolieren: http://paste.pocoo.org/show/87675/

Bin wirklich beeindruckt wie Du so etwas einfach aus dem Ärmel schüttelst,
leider funktioniert das Programm bei mir auch wieder
nicht, ich habe zwar erkannt das einiges fehlt (KOOR4.DAT) wird
nicht geöffnet und es wird auch keine neue Datei erzeugt aber
das ist auch nicht so wichtig denn das "Interpolieren" ist nur
ein Hilfsprogramm und wird nur einmal gebraucht, da ich auch
das Turbopascal wieder installiert habe kann ich die Datei nötigenfalls
auch mit dem Pascalprogramm verbessern.


Das Eingabeformat entspricht dem, was Du hier gezeigt hast. In dem auskommentierten Block in `parse_coordinate()` ist (natürlich ungetesteter) Code für ein Format mit festen Spalten, basierend auf dem Pascal-Quelltext.

Die Lösung ist "lazy", d.h. es wird immer nur eine Zeile gelesen und verarbeitet. Aber wie gesagt, die Grenzen von TurboPascal sind heutzutage überholt, man kann auch mehr als 64 KiB in eine Datenstruktur stecken. :-) In Python würde man da wahrscheinlich eher mit OOP heran gehen und das Eingabeformat in eine Liste mit Polygon-Objekten umwandeln und im Speicher halten. Sollten die Datenmengen zu gross für den Speicher werden, weil man heutzutage natürlich auch viel mehr Punkte für eine höhere Auflösung verarbeiten kann, dann könnte man die Daten in eine Datenbank stecken.

Für dich ist das alles ganz einfach, für mich sehr undurchsichtig, hätte
nicht gedacht das es so kompliziert ist, habe schon fast bedauert das
ich mich auf die alten Tage noch einmal mit Programmieren befasse :-)

Habe auch schon nach den "Weltkoordinaten" im Internet gesucht, leider bis heute vergeblich.
Da es sich bei dem endgültigen Ergebnis des Programms um eine Vektorgrafik handelt,
müsste die Anzahl der Koordinaten nicht sehr viel größer sein.
Vor 20 Jahren wurde die "Welt"mit einem HP 7574A Flachbettplotter ausgegeben,
ich habe ein Programm mit dem ich die Plottdatei anzeigen und unter anderem auch in eine PDF
Datei umwandeln kann. Wie gesagt für mich ist das alles nur Spielerei, trotzdem noch eimal vielen Dank

Gruß musikus
BlackJack

@musikus: Wenn das nicht nur reines Interesse an *dem* speziellem Programm mit den vorhandenen Daten ist: Es gibt auch andere, freie Programme und eine Menge Daten im Netz. Zum Beispiel die Generic Mapping Tools.

Was funktioniert denn an dem Programm nicht? Öffnen von Dateien fehlt nicht wirklich, es liest halt von der Standard-Eingabe und schreibt auf die Standard-Ausgabe. Wenn man Dateien lesen/schreiben möchte, muss man mit Shell-Umleitungen arbeiten. Also zum Beispiel:

Code: Alles auswählen

./interpolieren.py < KOOR4.DAT > ergebnis.txt
So viel aus dem Ärmel geschüttelt ist da auch nicht, weil der Grossteil aus der `Interpolieren.pas` ist, nur halt ein wenig "pythonischer" aufgeschrieben und auf mehrere Funktionen aufgeteilt.

Das Suchwort für "Weltkoordinaten" ist in diesem Fall "coast lines" oder "shore lines", also Küstenlinien. Da gibt es einiges in verschiedenen Formaten und Auflösungen im Netz. Überwiegend von amerikanischen, staatlichen Stellen. Die haben in vielen Bereichen den Grundsatz, dass Daten, die mit Steuergeldern gesammelt oder erstellt wurden, auch dem Steuerzahler kostenlos zur Verfügung gestellt werden sollten. Eine Quelle ist zum Beispiel die National Oceanic and Atmospheric Administration (NOAA).

Bei http://rimmer.ngdc.noaa.gov/mgg/coast/getcoast.html kann man zum Beispiel den Bereich eingeben und welches Format man gerne hätte. Die vier Optionen sollten alle einfache ASCII-Textdateien mit Koordinaten sein. Ich habe mir nur die ersten beiden angeschaut, die sind einfach mit eigenen Programmen zu parsen. Allerdings bekommt man nur Ausschnitte bis zu einer bestimmten Grösse. Sinnvoller wäre es also die kompletten Daten, die hinter dem Webdienst stehen herunter zu laden.
musikus
User
Beiträge: 14
Registriert: Donnerstag 9. Oktober 2008, 13:39
Kontaktdaten:

BlackJack hat geschrieben:@musikus: Wenn das nicht nur reines Interesse an *dem* speziellem Programm mit den vorhandenen Daten ist: Es gibt auch andere, freie Programme und eine Menge Daten im Netz. Zum Beispiel die Generic Mapping Tools.

Was funktioniert denn an dem Programm nicht? Öffnen von Dateien fehlt nicht wirklich, es liest halt von der Standard-Eingabe und schreibt auf die Standard-Ausgabe. Wenn man Dateien lesen/schreiben möchte, muss man mit Shell-Umleitungen arbeiten. Also zum Beispiel:

Code: Alles auswählen

./interpolieren.py < KOOR4.DAT > ergebnis.txt
Hi BlackJack,
leider muss ich noch einmal nachfragen, bin nicht in der Lage den von dir vorgeschlagenen Code
./interpolieren.py < KOOR4.DAT > ergebnis.txt
in daa Interpolationsprogramm einzufügen. Bei Google und auch in allen Python Büchern die ich habe ist nichts zu finden.

Was mich auch noch sehr irritiert ist, dass außer von dem Module SYS keines der von dir verwendeten Module in meinen Büchern beschrieben wird.


from __future__ import division, with_statement
import sys
from itertools import groupby, imap, takewhile
from operator import itemgetter


So viel aus dem Ärmel geschüttelt ist da auch nicht, weil der Grossteil aus der `Interpolieren.pas` ist, nur halt ein wenig "pythonischer" aufgeschrieben und auf mehrere Funktionen aufgeteilt.

Das Suchwort für "Weltkoordinaten" ist in diesem Fall "coast lines" oder "shore lines", also Küstenlinien. Da gibt es einiges in verschiedenen Formaten und Auflösungen im Netz. Überwiegend von amerikanischen, staatlichen Stellen. Die haben in vielen Bereichen den Grundsatz, dass Daten, die mit Steuergeldern gesammelt oder erstellt wurden, auch dem Steuerzahler kostenlos zur Verfügung gestellt werden sollten. Eine Quelle ist zum Beispiel die National Oceanic and Atmospheric Administration (NOAA).

Bei http://rimmer.ngdc.noaa.gov/mgg/coast/getcoast.html kann man zum Beispiel den Bereich eingeben und welches Format man gerne hätte. Die vier Optionen sollten alle einfache ASCII-Textdateien mit Koordinaten sein. Ich habe mir nur die ersten beiden angeschaut, die sind einfach mit eigenen Programmen zu parsen. Allerdings bekommt man nur Ausschnitte bis zu einer bestimmten Grösse. Sinnvoller wäre es also die kompletten Daten, die hinter dem Webdienst stehen herunter zu laden.

Da habe ich mir schon einige Files geholt, werde aber erst mal mit meiner Datei experimentieren um mir nicht noch mehr Probleme einzuhandeln.

Für eine Antwort bedanke ich mich im Voraus
Gruß musikus
BlackJack

Der Programmaufruf war für die Shell gemeint, also bei Windows die "DOS-Eingabeaufforderung" oder wie immer das auch bei aktuellen Windows-Versionen heisst. Die '<' und '>' und die Dateinamen gehören nicht zum Programmaufruf selber, sondern sind Anweisungen an die Shell, die Ein- und Ausgabe des Programms in/von den Dateien um zu leiten.

Die Module werden in der Python-Dokumentation erwähnt. Eine Übersicht gibt's im Modul-Index. Da sind 380 Module für Python 2.5.2 in der Standardbibliothek aufgelistet. Die wird wohl kaum ein Buch komplett abdecken.
musikus
User
Beiträge: 14
Registriert: Donnerstag 9. Oktober 2008, 13:39
Kontaktdaten:

Guten Morgen BlackJack,
vielen Dank für die Geduld, da ich nicht mit der DOS Shell arbeite, ich benutze "Wing-Personal" manchmal auch die Python IDLE, konnte es auch so nicht funktionieren, jetzt weiß ich wenigstens warum.

Vielen Dank auch für den Tip mit dem "Module-Index", den werde ich mir gleich mal besorgen, das es 380 Standartmodule für Python2.5.2 gibt hätte ich auch nicht gedacht, sich damit einigermaßen auszukennen ist ja eine Wissenschaft für sich.

Wünsche noch einen schönen Tag.
Gruß musikus
farid
User
Beiträge: 95
Registriert: Mittwoch 8. Oktober 2008, 15:37

musikus hat geschrieben:Vielen Dank auch für den Tip mit dem "Module-Index", den werde ich mir gleich mal besorgen, das es 380 Standartmodule für Python2.5.2 gibt hätte ich auch nicht gedacht, sich damit einigermaßen auszukennen ist ja eine Wissenschaft für sich.
In der "Library Reference" werden die Module der Python Standard Library thematisch gruppiert. Das hilft ein wenig, sich darin zurecht zu finden. ;)
Antworten