"Extravagâncias" na especificação técnica Shapefile

32

Escrevi uma biblioteca de análise de shapefile e encontrei algumas decisões de design na especificação que não entendo imediatamente. Espero que exista um desenvolvedor ESRI velho e enrugado por aqui que possa me dizer por que essas coisas são do jeito que são.

  1. O arquivo de registro principal (.shp) é de natureza mista . Especificamente, partes do cabeçalho apresentam grande quantidade de bytes endian, mas os registros são todos pouco endian. Normalmente, trabalho em um nível superior a bytes e bits, mas tudo o que li até agora sobre endianness o considera incomum. Por que o arquivo não especificado é de endianness uniforme?

  2. O campo "Comprimento do arquivo", assim como outros campos de comprimento e posição, são gravados em palavras de 16 bits, em vez do posicionamento mais padrão (da minha perspectiva limitada) de 8 bits. Como essa decisão foi tomada?

Publiquei uma pergunta semelhante no Stack Overflow, mas não obtive resposta. Se isso parecer muito fora do assunto para outras pessoas, eu poderia apoiar o fechamento.

canisrufus
fonte
4
Joel Lawhead, no GeospatialPython.com , vem trabalhando na solução de mistérios de shapefile há um tempo.
Chad Cooper
Não exatamente relacionado, mas limpo! Espero que descubram.
Canisrufus

Respostas:

28

O desenvolvimento de shapefiles foi simultâneo ao desenvolvimento do ArcView, que foi projetado especificamente para ser independente de plataforma. (De fato, essa foi a sua queda: contando com uma interface desenvolvida em uma GUI independente de plataforma chamada "Neuron Data", não foi possível tirar proveito de muitos recursos do Windows. Acabou refletindo o pior de todos os sistemas que Embora a especificação do shapefile fosse estranha desde o início, ela fazia um sentido meio estranho nessa estrutura de design: como os shapefiles eram destinados a muitas plataformas, suas especificações não deveriam favorecer nenhuma delas e, portanto, deveriam ser igualmente desagradáveis. para programadores de todas as persuasões.

A segunda pergunta parece basear-se em uma suposição que não é verdadeira. Por exemplo, o campo "Tamanho do arquivo" aparece no deslocamento de byte 24 no cabeçalho principal e é um número inteiro de quatro bytes (assinado) (32 bits), como deve ser para representar um comprimento de até 2 ^ 31- 1 Ele é precedido por um "Código de arquivo" de quatro bytes e mais cinco campos de quatro bytes reservados para uso futuro: quando você estiver reservando esse espaço, é claro que deseja tornar os campos tão grandes quanto possível, o que na época foi de 32 bits, a fim de manter a maior flexibilidade possível. Também ajuda a alinhar campos numéricos em um arquivo nos limites das palavras:

whuber
fonte
2
:) Exatamente o que eu estava procurando. Quando digo que o campo "Comprimento do arquivo" está "gravado em palavras de 16 bits", o que estou tentando dizer é que o valor do número inteiro de 32 bits registra o comprimento do arquivo em palavras de 16 bits. (Na especificação: "O valor para o tamanho do arquivo é o comprimento total do arquivo em palavras de 16 bits"). Parece que pode representar um comprimento de byte de 2 * 2 ^ 31-1, que parece ter cerca de 4 GB. O mesmo vale para os valores no arquivo .shx. Parece que ele deve suportar comprimentos de arquivo de até 2 * 2 ^ 31-1 bytes. o que estou perdendo?
Canisrufus
Bom ponto - eu perdi isso. Na verdade, o design poderia facilmente ter comprimentos e deslocamentos de arquivo (ponteiros no arquivo .shx) em termos de palavras de quatro bytes, aumentando assim o tamanho possível do arquivo .shp para 4 * (2 ^ 31-1) (cerca de 8 bilhões de bytes). Não tenho idéia do motivo pelo qual eles escolheram palavras de dois bytes, nem mesmo porque usam consistentemente números inteiros assinados, onde números não assinados são mais apropriados e fornecem o dobro de armazenamento.
whuber
1
Gostaria de saber se a singularidade de 16 bits tem a ver com computadores de 16 bits usados ​​na época, onde um nativo inttinha 16 bits.
Mike T
É sempre uma possibilidade, @ Mike. No entanto, mesmo os PCs 80286 (c. 1984) suportavam nativamente 32 bits de ints - eles usavam pares de registradores para fazer aritmética com eles.
whuber
5
Um colega da Esri diz que lembra que a mistura de endianismo foi deliberada. Algo parecido com 'faremos com que os desenvolvedores lidem com isso completamente por causa de problemas entre plataformas'. Mas, é claro, tudo isso é apócrifo.
mkennedy
10

Alguém lá fora sabe essas respostas e muito mais, mas não está falando.

A equipe com a qual estou trabalhando para decodificar os arquivos sbn e sbx não documentados descobriu muitas mais esquisitices que são semelhantes e ainda mais bizarras ao mesmo tempo.

A maioria das estruturas de shapefile é lógica e muito eficiente, o que sugere que os desenvolvedores da ESRI pensaram no assunto. É como se tivessem um monte de desenvolvedores inteligentes com um lunático.

Conforme sugerido por outras postagens, as esquisitices provavelmente são o resultado de requisitos de máquina ou idioma que são estranhos para nós agora.

Eu sempre suspeitei que as palavras de 16 bits eram uma maneira fácil de economizar espaço. Você descobrirá que precisa manter os valores das palavras de 16 bits na memória ao manipular arquivos. A estratégia de calcular valores para economizar espaço é comum em formatos binários até hoje. Mas a sugestão int nativa de Mike também é igualmente provável.

O lançamento de endian é simplesmente estranho. Ninguém tem uma boa resposta que eu já tenha visto.

O formato dbf foi extraído do formato dbase III, originado na década de 1960. Ele tem sido amplamente utilizado desde então e pode ser encontrado sob outros nomes, incluindo foxpro e xbase.

Apesar das falhas, esquisitices e limitações do formato shapefile, ele persiste teimosamente dentro e ao redor do campo de GIS. Todas as outras tentativas de substituí-lo foram inchadas demais para armazenamento vetorial simples ou proprietárias demais. Até a ESRI achou que os shapefiles seriam um brinquedo que levaria os iniciantes ao ArcINFO, coberturas e geodatabases. A Internet provavelmente tinha muito a ver com o formato decolando.

Eu aprendi muito escrevendo pyshp. Escrever um analisador é uma maneira fantástica de aprender um formato.

GeospatialPython.com
fonte
Hmm. Boa resposta. Não entendo como o uso de palavras de 16 bits economiza espaço. Para meus propósitos (criar ArrayBufferViews em javascript), tudo o que faz é forçar-me a multiplicar por dois para obter o deslocamento correto: estou queimando ciclos extras sem nenhum benefício. Você elaboraria?
precisa saber é
1
Sim - como eles usavam entradas assinadas, a extremidade superior desses valores seria 32.767, para que eles possam armazenar números maiores em 2 bytes em vez de 4. Os valores atribuídos às palavras de 16 bits, como eu disse, são valores que você acaba mantendo RAM ao trabalhar com shapefiles para operações de leitura e gravação. Criar um esquema para economizar espaço em duplas (que eu já vi em outros formatos binários) é sempre feio e complicado. Então, eles apenas mantiveram um esquema simples para valores de tamanho de dados.
GeospatialPython.com
Além disso - eu descobri nos arquivos shx que me surpreenderam primeiro. Os arquivos SHX têm caixas delimitadoras para recursos mapeados para uma grade inteira de 256x256. Essa técnica é comum na indexação, mas não em uma grade tão pequena. Eles salvam as coordenadas como caracteres de 1 byte em vez de ints. É por isso que a grade tem apenas 256x256. Agora isso é absolutamente mesquinho com memória, mesmo para os anos 90! Obviamente, existem muitas outras eficiências, como o agrupamento implícito de peças usando um índice. Você está certo - essas técnicas sobrecarregam o programador. Portanto, o uso da memória deve ter sido uma prioridade.
GeospatialPython.com
1
Sim, eu li suas anotações. Você está fazendo o bom trabalho do senhor nessa questão;) Aguardo ansiosamente sua análise final. Em relação ao problema de 16 bits, não tenho certeza de que seu argumento seja válido. 1. Nos arquivos SHP e SHX, não há campos de 16 bits, a menos que eu esteja muito enganado. 2. Representar valores de 16 bits em vez de valores de 8 bits apenas dobra o comprimento descritivo (2 * 2 ^ 15), o que eles poderiam ter conseguido simplesmente usando um int não assinado (2 ^ 16). Em última análise, não economiza espaço.
canisrufus
Quando você se refere ao "uso da memória", é difícil dizer se você quer dizer RAM ou disco. No início dos anos 90, uma unidade de 2 GB e 16-32 MB de RAM eram bastante sofisticadas: economizar algum espaço no arquivo (ou largura de banda da rede) ainda seria importante. Um engenheiro de software responsável gostaria de pensar cuidadosamente nas implicações para seus futuros clientes das trocas de tempo e espaço em suas escolhas; em retrospectiva, daria a eles o benefício da dúvida, a menos que a escolha fosse obviamente, devastadoramente ineficiente.
whuber
5

Esta é a minha opinião.

O formato Shapefile provavelmente evoluiu do ARC / INFO, que tinha um histórico que remonta às origens do FORTRAN / PR1ME. Todos os formatos ARC / INFO tinham esse cabeçalho de 100 bytes e a grande endianidade do código e do comprimento do arquivo (por exemplo, coberturas, TINs).

Quando os Shapefiles foram criados para o ArcView 1, a ESRI estava focada em invadir o mercado do Microsoft Windows e o restante do formato Shapefile está fortemente focado em ser pouco endian dos PCs.

A alternância constante entre endianess era, presumivelmente, a necessidade de apoiar as origens herdadas, antecipando os benefícios ao invadir a plataforma.

Stephen Quan
fonte
Isso parece plausível. Obrigado pela compreensão!
whuber
Esta é a minha conjectura favorita sobre o endianness. Agora tudo o que precisamos é Dangermond para publicar "The ESRI Tell All, Technical Edition" para ver se você está certo!
canisrufus
2
Se o formato shapefile evoluiu dos formatos ARC / INFO, foi consideravelmente anterior à v7. Em 1994, quando eu comecei na ESRI, o AV2 já estava fora e o trabalho de desenvolvimento para o ARC / INFO 7 estava em andamento.
Mcknedy
Bom ponto, Melita. O cerne desta resposta - que algumas opções de formato podem finalmente ter origens do Fortran - ainda seria verdadeiro desde os aplicativos Arc e Info originais.
whuber
Obrigado @mkennedy, removi a referência à v7. Ainda me lembro dos dias em que os manuais do usuário originais do ARC / INFO (v3 .. v6 era) tinham cabeçalhos que, acredito, foram retirados do código FORTRAN.
Stephen Quan
4

Sempre presumi que a divisão endian era causada por ter duas equipes, uma nas estações de trabalho Sun e a outra nos PCs, e elas não se reuniam até perto do final do processo de desenvolvimento.

Eu adoraria saber o que realmente aconteceu.

Ian Turton
fonte
3
Eu acho que a ESRI foi um pouco mais coordenada do que isso. De fato, o software deles tem a tendência de parecer que houve muito envolvimento do comitê em seu design.
whuber
0

Acho que em algum lugar lá atrás, ouvi algo sobre a origem do dbf / foxpro.
Isso poderia ter sido apenas um sonho estranho que eu tive.

Brad Nesom
fonte
5
As partes .shp e .shx, que estão em questão aqui, foram projetadas de forma completamente independente do formato .dbf, que existe há quase 20 anos.
whuber
0

Você precisa entender que os shapefiles foram introduzidos há cerca de 20 anos, naquela época havia uma infinidade de formatos de arquivo inconsistentes e mal projetados, portanto, os shapefiles não são exceção. Eu mesmo escrevi um analisador de shapefile e devo dizer que tive muitos problemas ao analisar o formato DBF em comparação com os próprios shapefiles (.SHP).

Igor Brejc
fonte