"Stranezze" nelle specifiche tecniche di Shapefile


32

Ho scritto una libreria di analisi dello shapefile e ho riscontrato un paio di decisioni di progettazione nelle specifiche che non capisco immediatamente. Spero che ci sia un vecchio sviluppatore ESRI avvizzito qui che può dirmi perché queste cose sono come sono.

  1. Il file di record principale (.shp) è di endianness misto . In particolare, parti dell'intestazione presentano un ordinamento di byte big endian, ma i record sono tutti little endian. In genere lavoro a un livello superiore rispetto a byte e bit, ma tutto ciò che ho letto finora sull'endianness lo segna come insolito. Perché il file non è specificato come endianness uniforme?

  2. Il campo "Lunghezza file", così come altri campi di lunghezza e posizione, sono registrati in parole a 16 bit, anziché nel posizionamento più standard (dalla mia prospettiva limitata) a 8 bit. Come è stata raggiunta questa decisione?

Ho pubblicato una domanda simile su Stack Overflow, ma non ho ricevuto alcuna risposta. Se questo sembra troppo fuori tema per altre persone, potrei sostenere di chiuderlo.


4
Joel Lawhead su GeospatialPython.com ha lavorato per un po 'alla risoluzione dei misteri del file di forma.
Chad Cooper,

Non esattamente correlato, ma pulito! Spero di capirlo.
Canisrufus,

Risposte:


28

Lo sviluppo di shapefile è stato contestuale allo sviluppo di ArcView, che è stato specificamente progettato per essere indipendente dalla piattaforma. (In effetti, ciò si è rivelato essere la sua rovina: basandosi su un'interfaccia sviluppata in una GUI indipendente dalla piattaforma chiamata "Neuron Data", non ha potuto sfruttare molte funzionalità di Windows. Ha finito per riflettere il peggio di tutti i sistemi che è stato commercializzato per.) Anche se le specifiche del file di forma erano strane sin dall'inizio, aveva un certo senso all'interno di questo framework di progettazione: poiché i file di forma erano destinati a molte piattaforme, le loro specifiche non dovrebbero favorire nessuna di esse e quindi dovrebbero essere ugualmente odiose ai programmatori di tutte le persuasioni.

La seconda domanda sembra basarsi su un presupposto che non è vero. Ad esempio, il campo "Lunghezza file" appare all'offset di byte 24 nell'intestazione principale ed è un numero intero (firmato) a quattro byte (32 bit), come deve essere per rappresentare una lunghezza fino a 2 ^ 31- 1. È preceduto da un "Codice file" a quattro byte e da altri cinque campi a quattro byte riservati per un utilizzo futuro: quando si riserva tale spazio, ovviamente si desidera rendere i campi più grandi ragionevolmente possibili, che all'epoca era di 32 bit, al fine di mantenere la massima flessibilità possibile. Aiuta anche ad allineare i campi numerici in un file sui confini delle parole:


2
:) Esattamente quello che stavo cercando. Quando dico che il campo "Lunghezza file" è "registrato in parole a 16 bit", quello che sto tentando di dire è che il valore dell'intero a 32 bit registra la lunghezza del file in parole a 16 bit. (Dalla specifica: "Il valore per la lunghezza del file è la lunghezza totale del file in parole a 16 bit"). Sembra che possa rappresentare una lunghezza in byte di 2 * 2 ^ 31-1, che sembra essere di circa 4 GB. Lo stesso vale per i valori nel file .shx. Sembra che dovrebbe essere in grado di supportare file di lunghezza fino a 2 * 2 ^ 31-1 byte. Cosa mi sto perdendo?
Canisrufus,

Un buon punto: l'ho perso. In realtà, il design avrebbe potuto altrettanto facilmente rendere lunghezze e offset dei file (puntatori nel file .shx) in termini di parole di quattro byte, aumentando così la dimensione possibile del file .shp a 4 * (2 ^ 31-1) (circa 8 miliardi di byte). Non ho idea del perché hanno scelto le parole a due byte, e nemmeno il motivo per cui usano sistematicamente firmato interi in cui interi senza segno sono sia più adeguata e prevedono il doppio di spazio di archiviazione.
whuber

1
Mi chiedo se la stranezza a 16 bit abbia a che fare con i computer a 16 bit utilizzati all'epoca, dove un nativo intera a 16 bit.
Mike T,

È sempre una possibilità, @Mike. Tuttavia, anche i PC 80286 (c. 1984) supportarono nativamente gli inte a 32 bit - usarono coppie di registri per fare l'aritmetica con loro.
whuber

5
Un collega di Esri afferma di ricordare che il mix di endianness era deliberato. Qualcosa sulla falsariga di "faremo in modo che gli sviluppatori lo gestiscano direttamente a causa di problemi multipiattaforma". Ma, ovviamente, è tutto apocrifo.
mkennedy,

10

Qualcuno là fuori conosce queste risposte e altro, ma non sta parlando.

Il team con cui ho lavorato per decodificare i file sbn e sbx non documentati ha scoperto molte più stranezze che sono entrambe simili ma anche più bizzarre allo stesso tempo.

La maggior parte delle strutture dello shapefile sono logiche e molto efficienti, il che suggerisce agli sviluppatori ESRI di aver riflettuto. È come se avessero avuto un sacco di sviluppatori intelligenti con un folle gettato dentro.

Come suggerito da altri post, le stranezze sono probabilmente il risultato di requisiti di linguaggio o macchina che ci sono estranei adesso.

Ho sempre sospettato che le parole a 16 bit fossero un modo semplice per risparmiare spazio. Scoprirai che devi tenere in memoria i valori delle parole a 16 bit durante la gestione dei file. La strategia di calcolo dei valori per risparmiare spazio è comune nei formati binari anche oggi. Ma anche il suggerimento int nativo di Mike è altrettanto probabile.

Il lancio di endian è semplicemente strano. Nessuno ha una buona risposta che io abbia visto.

Il formato dbf è stato strappato dal formato dbase III originato negli anni '60. Da allora è stato ampiamente utilizzato e può essere trovato sotto altri nomi tra cui foxpro e xbase.

Nonostante i difetti, le stranezze e le limitazioni del formato shapefile, persiste ostinatamente dentro e intorno al campo del GIS. Ogni altro tentativo di sostituirlo è stato troppo gonfio per una semplice memorizzazione vettoriale o troppo proprietario. Persino l'ESRI pensava che gli shapefile sarebbero stati un giocattolo che avrebbe spostato i principianti verso ArcINFO, coperture e geodatabase. Internet probabilmente ha molto a che fare con il decollo del formato.

Ho imparato molto scrivendo pyshp. Scrivere un parser è un modo fantastico per imparare un formato.


Hmm. Buona risposta. Non capisco come l'uso di parole a 16 bit risparmi spazio. Per i miei scopi (creazione di ArrayBufferViews in javascript), tutto ciò che fa è costringermi a moltiplicare per due per ottenere l'offset corretto: sto bruciando cicli extra senza alcun vantaggio. Vuoi elaborare?
Canisrufus,

1
Sì, dal momento che hanno usato gli integ firmati, il loro valore più alto su questi valori sarebbe 32.767 in modo da poter memorizzare numeri più grandi in 2 byte anziché 4. I valori assegnati alle parole a 16 bit come ho detto sono valori che tieni in mano RAM quando si lavora con shapefile per operazioni di lettura e scrittura. Elaborare uno schema per risparmiare spazio sui doppi (che ho visto in altri formati binari) è sempre brutto e complicato. Quindi si sono limitati a un semplice schema per i valori della dimensione dei dati.
GeospatialPython.com,

Inoltre - ho scoperto nei file shx che all'inizio mi hanno sconcertato. I file SHX dispongono di riquadri di delimitazione per funzioni mappate su una griglia intera 256x256. Questa tecnica è comune nell'indicizzazione ma non su una griglia così piccola. Salvano le coordinate come caratteri a 1 byte anziché ints. Ecco perché la griglia è solo 256x256. Ora questo è decisamente avaro di memoria anche per gli anni '90! Esistono ovviamente molte altre efficienze come il raggruppamento implicito di parti mediante un indice. Hai ragione: queste tecniche comportano maggiori oneri per il programmatore. Quindi l'uso della memoria deve essere stata una priorità.
GeospatialPython.com,

1
Yah, ho letto il tuo articolo scritto. Stai facendo il buon lavoro del Signore su quello;) Sto aspettando con impazienza la tua analisi finale. Per quanto riguarda il problema a 16 bit, non sono sicuro che il tuo punto valga. 1. Nei file SHP e SHX, non ci sono campi a 16 bit, a meno che non mi sbagli di grosso. 2. La rappresentazione di valori a 16 bit anziché a 8 bit raddoppia solo la lunghezza descrittiva (2 * 2 ^ 15), che avrebbero potuto ottenere semplicemente utilizzando un int senza segno (2 ^ 16). Alla fine non sta risparmiando spazio.
Canisrufus,

Quando si fa riferimento a "utilizzo della memoria" è difficile stabilire se si intende RAM o disco. All'inizio degli anni '90, un'unità da 2 GB e 16-32 MB di RAM erano piuttosto di fascia alta: salvare un po 'di spazio per i file (o larghezza di banda della rete) sarebbe comunque importante. Un ingegnere informatico responsabile vorrebbe riflettere attentamente sulle implicazioni per i loro futuri clienti di compromessi nello spazio-tempo nelle loro scelte; con il senno di poi darei loro il beneficio del dubbio a meno che la scelta non fosse ovviamente, devastantemente inefficiente.
whuber

5

Questa è la mia opinione su di esso.

Il formato Shapefile si è probabilmente evoluto da ARC / INFO che aveva una storia che risale alle sue origini FORTRAN / PR1ME. Tutti i formati ARC / INFO avevano questa intestazione da 100 byte e la grande endianess del codice file e della lunghezza del file (ad esempio Coverages, TINs).

Quando gli Shapefile sono stati realizzati per ArcView 1, ESRI si è concentrato sull'irruzione nel mercato Microsoft Windows e il resto del formato Shapefile è fortemente focalizzato sull'essere un piccolo endian dei PC.

Il costante passaggio tra endianess era, presumibilmente, la necessità di supportare le origini legacy, anticipando i benefici sull'irruzione nella piattaforma.


Sembra plausibile. Grazie per l'intuizione!
whuber

Questa è la mia congettura preferita sull'endianità. Ora tutto ciò di cui abbiamo bisogno è Dangermond per pubblicare "L'ESRI Tell All, Technical Edition" per vedere se hai ragione!
Canisrufus,

2
Se il formato dello shapefile si è evoluto dai formati ARC / INFO, era notevolmente precedente alla v7. Nel 1994, quando ho iniziato ad ESRI, AV2 era già uscito e il lavoro di sviluppo per ARC / INFO 7 era in corso.
mkennedy,

Buon punto, Melita. Il punto cruciale di questa risposta - che alcune scelte di formato potrebbero in definitiva avere origini Fortran - sarebbe ancora vero fino alle applicazioni Arc e Info originali.
whuber

Grazie @mkennedy, ho rimosso il riferimento alla v7. Ricordo ancora i giorni in cui i manuali utente ARC / INFO originali (era v3 .. v6) avevano intestazioni che credo fossero state prese dal codice FORTRAN.
Stephen Quan,

4

Ho sempre pensato che la divisione degli endian fosse causata dal fatto che due team erano uno su Sun Workstation e l'altro su PC e che non si incontravano fino alla fine del processo di sviluppo.

Mi piacerebbe sapere cosa è successo davvero.


3
Penso che ESRI fosse un po 'più coordinato di così. Anzi, semmai, il loro software ha la tendenza a sembrare che ci sia stato troppo coinvolgimento del comitato nella sua progettazione.
whuber

0

Penso che da qualche parte laggiù abbia sentito qualcosa sull'origine di dbf / foxpro.
Sarebbe potuto essere solo uno strano sogno che avevo fatto.


5
Le parti .shp e .shx, che sono in questione qui, sono state progettate in modo completamente indipendente dal formato .dbf, che era in circolazione da quasi 20 anni.
whuber

0

Devi capire che gli shapefile sono stati introdotti circa 20 anni fa, a quel tempo c'erano una miriade di formati di file incoerenti e mal progettati, quindi gli shapefile non fanno eccezione. Ho scritto io stesso un parser di file di forma e devo dire che ho avuto molti più problemi con l'analisi del formato DBF rispetto agli stessi file di forma (.SHP).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.