[Gfoss] Tabelle

Se i due shp sono *veramente* uguali, puoi anche aprire i due dbf (ad
es. con OOo, copiarne uno e incollarlo sull'altro. Un hack orrybile, ma
risolvi alla svelta.

Questa cosa e' da non fare mai !!!

perche' si perde l'allineamento tra la parte geometrica (.shp) e
quella alfanumerica (.dbf).

Nel senso che a 1 record nel dbf deve corrispondere 1 record nel file .shp.
E questa e' una regola ferrea per lo shapefile.

Addirittura e' altrettanto importante che alla prima geometria
corrisponda il primo record nel dbf.
Alla seconda geometria corrisponda il secondo record.
Per cui altra cosa da non fare e' riordinare i records nel dbf !!!.

Se si appende nuovi record con OO nel dbf, ignorando la parte geometrica,
ci si ritrova con n geometrie nel file .shp e n+m records nel file .dbf.

La conseguenza e che poi programmi GIS poi se va bene segnalano
anomalie nello shapefile. Se va male, tirano dritto e i risultati sono
semplicemente molto sbagliati.

--
~~~~~~~~~~~~~~~~~
§ Andrea §
§ Peri §
~~~~~~~~~~~~~~~~~

Andrea Peri ha scritto:

Questa cosa e' da non fare mai !!!
perche' si perde l'allineamento tra la parte geometrica (.shp) e
quella alfanumerica (.dbf).

Nel senso che a 1 record nel dbf deve corrispondere 1 record nel file .shp.
E questa e' una regola ferrea per lo shapefile.

Addirittura e' altrettanto importante che alla prima geometria
corrisponda il primo record nel dbf.
Alla seconda geometria corrisponda il secondo record.
Per cui altra cosa da non fare e' riordinare i records nel dbf !!!.
    

giusto amor di precisione, non è proprio esattamente così ...
a) il DBF ha una struttura con record a lunghezza fissa, e dichiara nell'header
    sia quanti record contiene che quale è la lunghezza record in bytes;
    quindi è molto facile sia leggerlo sequenzialmente oppure posizionarsi
    su di un record arbitrario a piacere
b) lo SHP ha una struttura con entità a lunghezza variabile [una polilinea
    con 2 vertici occupa ovviamente molto meno spazio di una con 1.000
    vertici]
c) poi però la "terna" shapefile prevede anche lo SHX, che ha una
    lunghezza record fissa, e che contiene l'OFFSET associato all'entità
    geometrica contenuta nello SHP

Quindi il "modo giusto" per interpretare gli shapefiles è il seguente:
- si legge la riga N dello DBF e si recuperano gli attributi informativi
- se legge la riga N dello SHX
- quindi si "salta" [fseek() o anologhi] nello SHP all'offset indicato
   sullo SHX e si recupera l'entità geometrica corrispondente

Ergo non esiste nessun vincolo tale da imporre una corrispondenza
1:1 tra le righe del DBF e quelle dello SHP, almeno "da specifica ESRI".

Purtoppo molti pacchetti "shape-like" ignorano del tutto lo SHX,
o lo gestiscono in modo molto fantasioso e/o perverso, e quindi
occorre utilizzare la "corrispondenza forzata 1:1" tra DBF e SHP
di cui parla Andrea come soluzione di ripiego per potere ignorare
gli SHX mal generati.

Insomma: "prima ci si distacca dallo standard, poi si
creano pastrocchi vari per sopravvivere al caos,
ed alla fine il pastrocchio diventa lo standard de facto"

... questa situazione non mi è nuova ...

ciao Sandro Furieri

Andrea Peri ha scritto:

Se i due shp sono *veramente* uguali, puoi anche aprire i due dbf (ad
es. con OOo, copiarne uno e incollarlo sull'altro. Un hack orrybile, ma
risolvi alla svelta.

Questa cosa e' da non fare mai !!!

Come tutti gli hack orrybili... :wink:
pc
--
Paolo Cavallini, see: http://www.faunalia.it/pc

Scusa, ma devo contraddirti decisamente.

Il file .shx non ci entra niente con l'abbinamento tra geometria e attributi.
Esso contiene solo l'indicizzazione spaziale, e qui non centra,
perche' l'indicizzazione spaziale non rappresenta il legame tra
attributi nel dbf e geometria nel .shp.

Prova ne e' che in assenza del file .shx e' sempre possibile
recuperare il corretto abbinamento tra dbf e shp. Al riguardo qualche
mese fa' vi fu' un thread su questo argomento e su un programmino che
si chiamava "shapecheck".

Tornando a noi: leggiti le specifiche esri dello shapefile.
In essa sono contenute esattamente le descrizioni su come si deve procedere.

http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf

An ESRI shapefile consists of a main file, an index file, and a dBASE

table. The main

file is a direct access, variable-record-length file in which each

record describes a shape

with a list of its vertices. In the index file, each record contains

the offset of the

corresponding main file record from the beginning of the main file.

The dBASE table

contains feature attributes with one record per feature. The

one-to-one relationship

between geometry and attributes is based on record number. Attribute

records in the

dBASE file must be in the same order as records in the main file.

Come e' riportato dalle suddette specifiche la relazione tra geometria
e attribute e' basata ssul record number (numero del record)
E nei dbf il record number e' il numero di posizione nel file DBF.
Ergo, il primo record del dbf si associa alla prima geometria e cosi' via.

Anche il concetto del posizionamento a piacere, non centra niente.
Ogni record del file .dbf ha lunghezza fissa, contenuta nell'header
del file dbf.
per cui se vuoi posizionarti nel record numero 27 e nell'header e'
riportato che un record e' lungo 150 byte, basta fare una
moltiplicazione e sai quanti bytes saltare.

Questo pero' , ribadisco, non vuol dire niente.

Quindi il "modo giusto" per interpretare gli shapefiles è il seguente:
- si legge la riga N dello DBF e si recuperano gli attributi informativi
- se legge la riga N dello SHX
- quindi si "salta" [fseek() o anologhi] nello SHP all'offset indicato
   sullo SHX e si recupera l'entità geometrica corrispondente

Ergo non esiste nessun vincolo tale da imporre una corrispondenza
1:1 tra le righe del DBF e quelle dello SHP, almeno "da specifica ESRI".

Invece e' proprio l'opposto.
Deve esserci una corrispondenza 1:1 se si vuole restare sullo
standard, altrimenti si
crea un qualcosa che poi non viene letto correttamente da altri programmi.

e maggior riprova riporto quest'altra frasettina sempre presente nel
doc. di specifiche esri.

The table must contain one record per shape feature.
The record order must be the same as the order of shape features in

the main (*.shp)

Mi pare chiaro.

Andrea.

2008/3/3, Alessandro Furieri <a.furieri@lqt.it>:

giusto amor di precisione, non è proprio esattamente così ...
a) il DBF ha una struttura con record a lunghezza fissa, e dichiara
nell'header
    sia quanti record contiene che quale è la lunghezza record in bytes;
    quindi è molto facile sia leggerlo sequenzialmente oppure posizionarsi
    su di un record arbitrario a piacere
b) lo SHP ha una struttura con entità a lunghezza variabile [una polilinea
    con 2 vertici occupa ovviamente molto meno spazio di una con 1.000
    vertici]
c) poi però la "terna" shapefile prevede anche lo SHX, che ha una
    lunghezza record fissa, e che contiene l'OFFSET associato all'entità
    geometrica contenuta nello SHP

Quindi il "modo giusto" per interpretare gli shapefiles è il seguente:
- si legge la riga N dello DBF e si recuperano gli attributi informativi
- se legge la riga N dello SHX
- quindi si "salta" [fseek() o anologhi] nello SHP all'offset indicato
   sullo SHX e si recupera l'entità geometrica corrispondente

Ergo non esiste nessun vincolo tale da imporre una corrispondenza
1:1 tra le righe del DBF e quelle dello SHP, almeno "da specifica ESRI".

--
~~~~~~~~~~~~~~~~~
§ Andrea §
§ Peri §
~~~~~~~~~~~~~~~~~

On Mon, 3 Mar 2008 11:16:43 +0100, Andrea Peri wrote

Scusa, ma devo contraddirti decisamente.
Il file .shx non ci entra niente con l'abbinamento tra
geometria e attributi.
Esso contiene solo l'indicizzazione spaziale, e qui non centra,
perche' l'indicizzazione spaziale non rappresenta il legame tra
attributi nel dbf e geometria nel .shp.

Scusami te, ma rimango della mia idea.
Continuo a pensare che la via "meno rischiosa"
per associare geometrie ed attributi è proprio
quella di basarsi sull'SHX.

Sempre da http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf
[i.e. la ben nota specifica ESRI ufficiale che rende
shapefile un formato pubblicamente documentato]:

a) shp record header:
   Byte 0 Record Number Integer BigEndian
   Byte 4 Content Length Integer BigEndian

b) shx record:
   Byte 0 Offset Offset Integer BigEndian
   Byte 4 Content Length Integer BigEndian

- The main file is a direct access, variable-record-length
  file in which each record describes a shape with a list
  of its vertices.
- In the index file, each record contains the offset of the
  corresponding main file record from the beginning of the
  main file.
- The dBASE table contains feature attributes with one record per
  feature. The one-to-one relationship between geometry and
  attributes is based on record number.

Quindi le strutture dati che consentono di associare
dinamicamente geometria ed attributi informativi con
accessi random che usano l'SHX come struttura guida
ci sono tutte. Poi però ti dicono anche:

- Attribute records in the dBASE file must be in the
  same order as records in the main file.

Insomma, quanto meno ci sono un paio di ridondanze
[ambiguità ? contraddizioni ?] di troppo che si prestano
anche troppo bene ad interpretazioni ed implementazioni
"varie", in primis da parte di ESRI stessa.

Infatti posso dirti per esperienza personale che tutti i
non pochi shapes che mi sono capitati sotto mano che
non presentavano per nulla una corrispondenza 1:1
nell'ordinamento del DBF e dello SHP erano sicuramente
stati generati con ArcView e/o ArcGis.

Prova ne e' che in assenza del file .shx e' sempre possibile
recuperare il corretto abbinamento tra dbf e shp. Al riguardo qualche
mese fa' vi fu' un thread su questo argomento e su un programmino che
si chiamava "shapecheck".

Qui siamo in pieno hacking "a rischio".
Uno shapefile privo di SHX [oppure che presenti uno SHX
corrotto / malformed] sarebbe sempre meglio considerarlo
come "non utilizzabile"; non dubito affatto che nel 90%
dei casi si possa ricostruire lo shx a partire dai soli
shp+dbf, ma si tratta comunque di "operazioni a luci rosse"

ciao Sandro Furieri

b) shx record:
Byte 0 Offset Offset Integer BigEndian
Byte 4 Content Length Integer BigEndian

- The main file is a direct access, variable-record-length
file in which each record describes a shape with a list
of its vertices.
- In the index file, each record contains the offset of the
corresponding main file record from the beginning of the
main file.
- The dBASE table contains feature attributes with one record per
feature. The one-to-one relationship between geometry and
attributes is based on record number.

Quindi le strutture dati che consentono di associare
dinamicamente geometria ed attributi informativi con
accessi random che usano l'SHX come struttura guida
ci sono tutte. Poi però ti dicono anche:

- Attribute records in the dBASE file must be in the
same order as records in the main file.

Insomma, quanto meno ci sono un paio di ridondanze
[ambiguità ? contraddizioni ?] di troppo che si prestano
anche troppo bene ad interpretazioni ed implementazioni
"varie", in primis da parte di ESRI stessa.

Io non riesco a cogliere le contraddizioni/ambiguita' che indichi.

Byte 0 Offset Offset Integer BigEndian
Byte 4 Content Length Integer BigEndian

Nell'shx, l'offset si riferisce al punto di partenza nel file shp, e
il content lenght indica quanti bytes occupa lo shape a partire
dall'offset nel file .shp.
Nel file .shx non vi e' nessuna indicazione utile per rintracciare la
corrispondente parte degli attributi nel file .dbf.

Quindi le strutture dati che consentono di associare
dinamicamente geometria ed attributi informativi con
accessi random che usano l'SHX come struttura guida
ci sono tutte. Poi però ti dicono anche:

- Attribute records in the dBASE file must be in the
same order as records in the main file.

Insomma, quanto meno ci sono un paio di ridondanze
[ambiguità ? contraddizioni ?] di troppo che si prestano
anche troppo bene ad interpretazioni ed implementazioni
"varie", in primis da parte di ESRI stessa.

Ribadisco che non riesco a vedere come sia possibile raggiungere gli
attributi giusti
partendo dall' shx senza tener conto che la parte dbf e' regolata
secondo un ordine posizionale con il file shp.
Nel file shx non vi e' traccia della posizione sul file dbf ove
trovare gli attributi relativi a uno specifico shape.

Ciao,

--
~~~~~~~~~~~~~~~~~
§ Andrea §
§ Peri §
~~~~~~~~~~~~~~~~~

a.furieri@lqt.it ha scritto:
...

Insomma, quanto meno ci sono un paio di ridondanze [ambiguità ? contraddizioni ?] di troppo che si prestano anche troppo bene ad interpretazioni ed implementazioni "varie", in primis da parte di ESRI stessa.

A mio avviso la questione sulla ridondanza è molto semplice:
l'shx è un indice per l'accesso rapido al file shp, per tanto,
è un di più, una ottimizzazione, come spesso accade ridodante
rispetto ai dati che indicizza.

E' analogo agli altri file non documentati, ma prodotti
da ArcGis, che forniscono indici spaziali e indici sugli attributi.

Questo almeno è il mio punto di vista. D'altro canto, il
fatto che il contenuto di un file .shx possa essere inferito
analizzato il .shp lo qualifica direttamente come dato derivato
(un di più, appunto).
Ciao
Andrea