"Kuriositäten" in der technischen Spezifikation von Shapefile

32

Ich habe eine Shapefile-Parsing-Bibliothek geschrieben und einige Designentscheidungen in der Spezifikation getroffen , die ich nicht sofort verstehe. Ich hoffe, es gibt hier einen alten ESRI-Entwickler, der mir sagen kann, warum diese Dinge so sind, wie sie sind.

  1. Die Hauptdatensatzdatei (.shp) weist eine gemischte Endianität auf . Insbesondere sind Teile des Headers nach Big-Endian-Bytes sortiert, die Datensätze sind jedoch alle Little-Endian-Bytes. Ich arbeite normalerweise auf einer höheren Ebene als Bytes und Bits, aber alles, was ich bisher über Endianness gelesen habe, kennzeichnet dies als ungewöhnlich. Warum ist die angegebene Datei nicht einheitlich?

  2. Das Feld "Dateilänge" sowie andere Längen- und Positionsfelder werden in 16-Bit-Wörtern anstelle der (aus meiner Sicht begrenzten) Standard-8-Bit-Positionierung aufgezeichnet. Wie ist diese Entscheidung zustande gekommen?

Ich habe eine ähnliche Frage zu Stack Overflow gestellt, aber keine Antwort erhalten. Wenn dies für andere Leute zu unangebracht erscheint, kann ich es unterstützen, es zu schließen.

canisrufus
quelle
4
Joel Lawhead von GeospatialPython.com hat eine Weile an der Lösung von Shapefile-Rätseln gearbeitet.
Chad Cooper
Nicht genau verwandt, aber ordentlich! Ich hoffe das es herauskommt.
Canisrufus

Antworten:

28

Die Entwicklung von Shapefiles ging mit der Entwicklung von ArcView einher, das speziell für die Plattformunabhängigkeit konzipiert wurde. (Tatsächlich stellte sich heraus, dass dies ein Misserfolg war: Wenn man sich auf eine Schnittstelle stützte, die in einer plattformunabhängigen GUI namens "Neuron Data" entwickelt wurde, konnte man nicht viele Windows-Funktionen nutzen. Am Ende spiegelte sie das schlechteste aller Systeme wider wurde vermarktet für.) Obwohl die Shapefile-Spezifikation von Anfang an seltsam war, ergab sie innerhalb dieses Design-Frameworks einen gewissen Sinn: Da Shapefiles für viele Plattformen gedacht waren, sollte ihre Spezifikation keine von ihnen bevorzugen und daher gleichermaßen abscheulich sein für Programmierer aller Überzeugungen.

Die zweite Frage scheint auf einer Annahme zu beruhen, die nicht wahr ist. Beispielsweise erscheint das Feld "File Length" am Byte-Offset 24 im Hauptheader und ist eine (vorzeichenbehaftete) Vier-Byte- (32-Bit-) Ganzzahl, wie sie sein muss, um eine Länge von bis zu 2 ^ 31- darzustellen. 1. Davor stehen ein Vier-Byte- "Dateicode" und fünf weitere Vier-Byte-Felder, die für die zukünftige Verwendung reserviert sind: Wenn Sie solchen Speicherplatz reservieren, möchten Sie die Felder natürlich so groß wie möglich machen, was zu der Zeit der Fall ist war 32 Bit, um die größtmögliche Flexibilität beizubehalten. Es hilft auch, numerische Felder in einer Datei an Wortgrenzen auszurichten:

whuber
quelle
2
:) Genau das, wonach ich gesucht habe. Wenn ich sage, dass das Feld "Dateilänge" in 16-Bit-Wörtern aufgezeichnet ist, versuche ich zu sagen, dass der Wert der 32-Bit-Ganzzahl die Dateilänge in 16-Bit-Wörtern aufzeichnet. (Aus der Spezifikation: "Der Wert für die Dateilänge ist die Gesamtlänge der Datei in 16-Bit-Wörtern"). Es scheint, als könnte es eine Bytelänge von 2 * 2 ^ 31-1 darstellen, was ungefähr 4 GB entspricht. Gleiches gilt für die Werte in der .shx-Datei. Es sieht so aus, als ob es Dateilängen von bis zu 2 * 2 ^ 31-1 Bytes unterstützen sollte. Was vermisse ich?
Canisrufus
Guter Punkt - das habe ich verpasst. Tatsächlich hätte das Design genauso gut Dateilängen und -offsets (Zeiger in der .shx-Datei) in Form von 4- Byte-Wörtern erstellen können, wodurch die mögliche Größe der .shp-Datei auf 4 * (2 ^ 31-1) erhöht worden wäre. (ungefähr 8 Milliarden Bytes). Ich habe keine Ahnung, warum sie Zwei-Byte-Wörter gewählt haben oder warum sie konsequent vorzeichenbehaftete Ganzzahlen verwenden, wenn vorzeichenlose Ganzzahlen angemessener sind und doppelt so viel Speicherplatz bieten.
whuber
1
Ich frage mich, ob die 16-Bit-Kuriosität mit 16-Bit-Computern zu tun hat, die zu der Zeit verwendet wurden, als ein Native 16-Bit-Computer intwar.
Mike T
Es ist immer eine Möglichkeit, @Mike. Sogar die 80286-PCs (um 1984) unterstützten 32-Bit-Ints - sie verwendeten Registerpaare, um mit ihnen zu rechnen.
Whuber
5
Ein Esri-Kollege sagt, dass er sich daran erinnert, dass die Mischung aus Endian-ness bewusst war. Etwas in der Art von "Wir werden Entwickler dazu bringen, das Problem aufgrund plattformübergreifender Probleme zu lösen." Aber das ist natürlich alles apokryphisch.
Mkennedy
10

Jemand da draußen kennt diese und weitere Antworten, aber er redet nicht.

Das Team, mit dem ich zusammengearbeitet habe, um die undokumentierten sbn- und sbx-Dateien zu dekodieren, hat viele weitere Kuriositäten entdeckt, die sich ähneln und gleichzeitig noch bizarrer sind.

Die meisten Shapefile-Strukturen sind logisch und sehr effizient, was darauf hindeutet, dass sich die ESRI-Entwickler Gedanken gemacht haben. Es ist, als hätten sie eine Menge kluger Entwickler mit einem Wahnsinnigen.

Wie bereits in anderen Beiträgen erwähnt, sind die Seltsamkeiten wahrscheinlich das Ergebnis maschineller oder sprachlicher Anforderungen, die uns derzeit fremd sind.

Ich hatte immer den Verdacht, dass 16-Bit-Wörter eine einfache Möglichkeit sind, Platz zu sparen. Sie werden feststellen, dass Sie die 16-Bit-Wortwerte im Speicher halten müssen, wenn Sie mit Dateien arbeiten. Die Strategie, Werte platzsparend zu berechnen, ist bereits heute in Binärformaten üblich. Aber Mikes angeborener Int-Vorschlag ist ebenso wahrscheinlich.

Das Endian-Flipping ist einfach komisch. Niemand hat eine gute Antwort, die ich gesehen habe.

Das dbf-Format wurde aus dem in den 1960er Jahren entstandenen dbase III-Format gerippt. Es ist seitdem weit verbreitet und kann unter anderen Namen wie Foxpro und Xbase gefunden werden.

Trotz der Mängel, Kuriositäten und Einschränkungen des Shapefile-Formats bleibt es hartnäckig im und um das GIS-Gebiet. Jeder andere Versuch, es zu ersetzen, war zu aufgebläht für eine einfache Vektorspeicherung oder zu proprietär. Sogar ESRI dachte, Shapefiles wären ein Spielzeug, das Anfänger in Richtung ArcINFO, Coverages und Geodatabases bewegen würde. Das Internet hatte wahrscheinlich viel mit dem Formatstart zu tun.

Ich habe viel gelernt, pyshp zu schreiben. Das Schreiben eines Parsers ist eine fantastische Möglichkeit, ein Format zu lernen.

GeospatialPython.com
quelle
Hmm. Gute Antwort. Ich verstehe nicht, wie die Verwendung von 16-Bit-Wörtern Platz spart. Für meine Zwecke (beim Erstellen von ArrayBufferViews in Javascript) muss ich nur mit zwei multiplizieren, um den korrekten Offset zu erhalten: Ich brenne zusätzliche Zyklen ohne Nutzen. Würden Sie näher darauf eingehen?
Canisrufus
1
Ja, da sie signierte Ints verwendet haben, sind diese Werte am oberen Ende 32.767, sodass sie größere Zahlen in 2 Bytes anstelle von 4 speichern können RAM bei der Arbeit mit Shapefiles für Lese- und Schreibvorgänge. Es ist immer hässlich und kompliziert, sich ein Schema auszudenken, um Platz im Doppel zu sparen (was ich in anderen Binärformaten gesehen habe). Also hielten sie einfach an einem einfachen Schema für Datengrößenwerte fest.
GeospatialPython.com
Auch - ich habe in den shx-Dateien entdeckt, was mich anfangs verblüffte. SHX-Dateien haben Begrenzungsrahmen für Features, die einem 256 x 256-Ganzzahlraster zugeordnet sind. Diese Technik ist bei der Indizierung üblich, jedoch nicht in einem so kleinen Raster. Sie speichern die Koordinaten als 1-Byte-Zeichen anstelle von Ints. Deshalb ist das Raster nur 256x256. Nun, das ist sogar für die 90er Jahre geradezu ein Geizhals! Es gibt natürlich noch viele andere Effizienzen, wie die implizite Gruppierung von Teilen mithilfe eines Index. Sie haben Recht - diese Techniken belasten den Programmierer mehr. Die Speichernutzung muss also eine Priorität gewesen sein.
GeospatialPython.com
1
Yah, ich habe dein Schreiben gelesen. Du machst die gute Arbeit des Lords in dieser Sache;) Ich freue mich sehr auf deine endgültige Analyse. In Bezug auf das 16-Bit-Problem bin ich mir nicht sicher, ob Ihr Punkt zutrifft. 1. In den SHP- und SHX-Dateien gibt es keine 16-Bit-Felder, es sei denn, ich irre mich zutiefst. 2. Die Darstellung von 16-Bit-Werten anstelle von 8-Bit-Werten verdoppelt nur die beschreibbare Länge (2 * 2 ^ 15), die sie einfach mit einem vorzeichenlosen int (2 ^ 16) hätten erreichen können. Es spart letztendlich keinen Platz.
Canisrufus
Wenn Sie sich auf "Speichernutzung" beziehen, ist es schwer zu sagen, ob Sie RAM oder Festplatte meinen. In den frühen 90er Jahren waren ein 2-GB-Laufwerk und 16-32 MB RAM recht hochwertig: Das Einsparen von Speicherplatz (oder Netzwerkbandbreite) wäre immer noch von Bedeutung. Ein verantwortungsbewusster Softwareentwickler möchte die Auswirkungen von Zeit-Raum-Kompromissen auf seine zukünftigen Kunden sorgfältig abwägen. im nachhinein würde ich ihnen den Vorteil des Zweifels geben, es sei denn, die Wahl war offensichtlich verheerend ineffizient.
whuber
5

Das ist meine Einstellung dazu.

Das Shapefile-Format ist höchstwahrscheinlich aus ARC / INFO hervorgegangen, dessen Geschichte auf FORTRAN / PR1ME zurückgeht. Alle ARC / INFO-Formate hatten diesen 100-Byte-Header und die Big-Endianess des Dateicodes und der Dateilänge (z. B. Coverages, TINs).

Als Shapefiles für ArcView 1 erstellt wurden, konzentrierte sich ESRI darauf, in den Microsoft Windows-Markt einzudringen, und der Rest des Shapefile-Formats konzentriert sich stark darauf, ein kleines Endian von PCs zu sein.

Der ständige Wechsel zwischen Endianess war vermutlich die Notwendigkeit, die alten Ursprünge zu unterstützen und gleichzeitig die Vorteile eines Einbruchs in die Plattform zu erwarten.

Stephen Quan
quelle
Das klingt plausibel. Vielen Dank für den Einblick!
Whuber
Dies ist meine Lieblingsvermutung über die Endianität. Jetzt brauchen wir nur noch Dangermond, um "The ESRI Tell All, Technical Edition" zu veröffentlichen und zu sehen, ob Sie Recht haben!
canisrufus
2
Wenn sich das Shapefile-Format von ARC / INFO-Formaten entwickelt hat, war es erheblich früher als v7. Als ich 1994 bei ESRI anfing, war AV2 bereits draußen und die Entwicklungsarbeiten für ARC / INFO 7 waren im Gange.
mkennedy
Guter Punkt, Melita. Der Kern dieser Antwort - dass einige Formatauswahlmöglichkeiten letztendlich Fortran-Ursprung haben könnten - würde bis zu den ursprünglichen Arc- und Info-Anwendungen zutreffen.
Whuber
Danke @mkennedy, ich habe den Verweis auf v7 entfernt. Ich erinnere mich noch an die Tage, als die ursprünglichen ARC / INFO-Benutzerhandbücher (Ära v3 .. v6) Überschriften enthielten, die meines Erachtens dem FORTRAN-Code entnommen waren.
Stephen Quan
4

Ich bin immer davon ausgegangen, dass der Endian-Split durch zwei Teams auf Sun Workstations und auf PCs verursacht wurde, die sich erst gegen Ende des Entwicklungsprozesses trafen.

Ich würde gerne wissen, was wirklich passiert ist.

Ian Turton
quelle
3
Ich denke, dass ESRI ein bisschen koordinierter war. Tatsächlich scheint es, als ob ihre Software zu sehr an der Gestaltung des Komitees beteiligt war.
Whuber
0

Ich glaube, irgendwo dort habe ich etwas über die Entstehung von dbf / foxpro gehört.
Das könnte nur ein seltsamer Traum gewesen sein, den ich hatte.

Brad Nesom
quelle
5
Die hier fraglichen .shp- und .shx-Teile wurden völlig unabhängig vom .dbf-Format entwickelt, das es vor fast 20 Jahren gab.
whuber
0

Man muss verstehen, dass Shapefiles vor etwa 20 Jahren eingeführt wurden. Damals gab es unzählige inkonsistente und schlecht gestaltete Dateiformate, daher sind Shapefiles keine Ausnahme. Ich habe selbst einen Shapefile-Parser geschrieben und ich muss sagen, dass ich im Vergleich zu den Shapefiles (.SHP) selbst viel mehr Probleme beim Parsen des DBF-Formats hatte.

Igor Brejc
quelle