Shapefile技術仕様の「奇数」


32

私はシェープファイル解析ライブラリを書いてきましたが、すぐには理解できない仕様の設計上の決定にいくつか遭遇しました。これらの事柄がなぜそうなのかを教えてくれる、賢明な古いESRI開発者がここにいることを望んでいます。

  1. メインレコードファイル(.shp)は混合エンディアンです。具体的には、ヘッダーの一部はビッグエンディアンのバイト順を特徴としていますが、レコードはすべてリトルエンディアンです。私は通常、バイトやビットよりも高いレベルで作業しますが、エンディアンについてこれまで読んだことはすべて、これを異常であるとマークしています。なぜファイルは均一なエンディアンであると指定されていないのですか?

  2. 「ファイルの長さ」フィールドは、他の長さおよび位置フィールドと同様に、より標準的な(私の限られた観点から)8ビットのポジショニングではなく、16ビットのワードで記録されます。この決定はどのようにして達成されましたか?

Stack Overflowで同様の質問を投稿しましたが、応答がありませんでした。これが他の人にとって話題から外れているように思える場合、私はそれを閉じることをサポートできます。


4
GeospatialPython.comの Joel Lawheadは、しばらくの間、シェープファイルの謎の解決に取り組んできました。
チャドクーパー

正確には関連していませんが、すっきりしています!私はそれを理解することを願っています。
-canisrufus

回答:


28

シェープファイルの開発は、プラットフォームに依存しないように特別に設計されたArcViewの開発と同時に行われました。(実際、それはその没落であることが判明しました。「Neuron Data」と呼ばれるプラットフォームに依存しないGUIで開発されたインターフェイスに依存するため、多くのWindows機能を利用できませんでした。シェイプファイルの仕様は最初から奇妙でしたが、このデザインフレームワーク内でループのような意味を成していました:シェープファイルは多くのプラットフォームを対象としているため、それらの仕様はいずれも優先するべきではなく、したがって同様に不快なはずですすべての説得力のあるプログラマーに。

2番目の質問は、正しくない仮定に基づいているようです。たとえば、「ファイル長」フィールドは、メインヘッダーのバイトオフセット24に表示され、最大2 ^ 31-の長さを表すために必要な(符号付き)4バイト(32ビット)整数です。 1。その前に4バイトの「ファイルコード」と、将来の使用のために予約されている5つの4バイトフィールドがあります。そのようなスペースを確保する場合、もちろん、可能な限りフィールドをできるだけ大きくしたい最大限の柔軟性を維持するために、32ビットでした。また、ファイル内の数値フィールドを単語境界に揃えることも役立ちます。


2
:)まさに私が探していたもの。「ファイル長」フィールドが「16ビットワードで記録される」と言うとき、私が言いたいのは、32ビット整数の値が16ビットワードでファイル長を記録するということです。(仕様から:「ファイルの長さの値は、16ビットワードでのファイルの全長です」)。2 * 2 ^ 31-1のバイト長を表すことができるようで、約4 GBに見えます。.shxファイルの値についても同様です。2 * 2 ^ 31-1バイトまでのファイル長をサポートできるはずです。私は何が欠けていますか?
-canisrufus

良い点-私はそれを見逃した。実際、4バイトワードの観点からファイルの長さとオフセット(.shxファイル内のポインター)を簡単に作成できたため、.shpファイルのサイズを4 *(2 ^ 31-1)に増やすことができました。 (約80億バイト)。なぜ2バイトの単語を選択したのか、また、符号なし整数がより適切であり、2倍のストレージを提供する符号付き整数を一貫して使用ている理由すらわかりません。
whuber

1
16ビットの奇妙さは、当時使用されていた16ビットコンピューターに関係しているのだろうかint。ネイティブは16ビットだった。
マイクT

@Mike、それは常に可能性です。ただし、80286 PC(c。1984)でさえ、32ビットintをネイティブにサポートしていました。レジスタペアを使用してそれらと演算を行いました。
whuber

5
Esriの同僚は、エンディアンネスの混在が意図的に行われたことを覚えていると言います。「クロスプラットフォームの問題のため、開発者にそれを完全に処理させる」という方針に沿った何か。しかし、もちろん、これはすべて外典です。
mkennedy

10

誰かがこれらの答えなどを知っていますが、彼らは話していません。

文書化されていないsbnファイルとsbxファイルをデコードするために協力してきたチームは、似ているがさらに奇妙な、より多くの奇妙な点を同時に発見しました。

シェープファイル構造のほとんどは論理的で非常に効率的であり、ESRI開発者が考え抜いたことを示唆しています。まるで狂人が投げ込まれた賢い開発者がたくさんいたようです。

他の投稿で示唆されているように、奇妙な点はおそらく、現在私たちにとって異質な機械または言語の要件の結果です。

16ビットの単語はスペースを節約する簡単な方法だといつも思っていました。ファイルを処理するときは、メモリに16ビットワード値を保持する必要があることがわかります。スペースを節約するために値を計算する戦略は、今日でもバイナリ形式で一般的です。しかし、Mikeのネイティブなint提案も同様に可能性があります。

エンディアンの反転は奇妙です。誰も私が見た良い答えを持っていません。

dbf形式は、1960年代に始まったdbase III形式からリッピングされました。それ以来、広く使用されており、foxproやxbaseなどの他の名前で見つけることができます。

シェープファイルフォーマットの欠陥、奇妙な点、制限にもかかわらず、GISの分野内および周辺では頑固に存続しています。それを置き換える他のすべての試みは、単純なベクターストレージには肥大化しすぎているか、独自のものです。ESRIでさえ、シェープファイルは初心者がArcINFO、カバレッジ、およびジオデータベースに移行するおもちゃになると考えていました。インターネットはおそらく、このフォーマットの普及に大きな影響を与えていたでしょう。

pyshpを書くことをたくさん学びました。パーサーを書くことは、フォーマットを学ぶための素晴らしい方法です。


うーん いい答えだ。16ビットワードを使用するとスペースが節約される方法がわかりません。私の目的(javascriptでArrayBufferViewsを構築する)のために、正しいオフセットを取得するために2を乗算することを強制するだけです:私は利益のために余分なサイクルを燃やしています。詳しく説明していただけますか?
-canisrufus

1
はい-符号付き整数を使用しているため、それらの値の上限は32,767になり、4ではなく2バイトでより大きな数値を格納できます。前述の16ビットワードに割り当てられた値は、最終的に保持する値です読み取りおよび書き込み操作のためにシェープファイルを操作するときのRAM。doubleのスペースを節約するスキーム(他のバイナリ形式で見た)を考え出すことは、常にalwaysくて複雑です。そのため、データサイズ値の単純なスキームに固執しました。
GeospatialPython.com

また、shxファイルで、最初は困ったことに気付きました。SHXファイルには、256x256整数グリッドにマッピングされた機能の境界ボックスがあります。この手法はインデックス作成では一般的ですが、小さいグリッドでは一般的ではありません。これらは、intではなく1バイト文字として座標を保存します。そのため、グリッドは256x256だけです。今では、1990年代であっても、記憶にとんでもないケチなのです!もちろん、インデックスを使用した暗黙的なグループ化のような他の多くの効率があります。あなたは正しい-これらの手法はプログラマにより多くの負担をかける。したがって、メモリ使用量を優先する必要がありました。
GeospatialPython.com

1
ええ、私はあなたの記事を読みました。あなたはその上で主の良い仕事をしています;)私はあなたの最終的な分析を熱心に待っています。16ビットの問題については、あなたの主張が正しいかどうかわかりません。1. SHPおよびSHXファイルには、私がひどく間違えない限り、16ビットフィールドはありません。2. 8ビット値ではなく16ビット値を表すと、記述可能な長さ(2 * 2 ^ 15)が2倍になります。これは、符号なしint(2 ^ 16)を使用するだけで実現できます。最終的にはスペースを節約しません。
-canisrufus

「メモリ使用量」を参照するとき、RAMとディスクのどちらを意味するかを判断するのは困難です。90年代前半、2 GBのドライブと16〜32 MBのRAMはかなりハイエンドでした。ファイルスペース(またはネットワーク帯域幅)を節約することは依然として重要です。責任あるソフトウェアエンジニアは、将来の顧客が選択する時空間のトレードオフの影響を慎重に検討したいと考えます。後から考えると、選択が明らかに、破壊的に非効率的でない限り、私は彼らに疑いの利益を与えるでしょう。
whuber

5

これは私の考えです。

シェープファイル形式は、おそらくFORTRAN / PR1MEの起源に由来する歴史を持つARC / INFOから進化したものです。すべてのARC / INFO形式には、この100バイトのヘッダーと、ファイルコードとファイル長の大きなエンディアン(カバレッジ、TINなど)がありました。

シェープファイルがArcView 1用に作成されたとき、ESRIはMicrosoft Windows市場への参入に焦点を合わせ、シェープファイルフォーマットの残りはPCのリトルエンディアンに重点を置いていました。

エンディアンネス間の絶え間ない切り替えは、おそらく、プラットフォームに侵入することの利点を予想しながら、レガシーの起源をサポートする必要性でした。


これはもっともらしい。洞察力をありがとう!
whuber

これは、エンディアンについての私のお気に入りの推測です。必要なのは、Dangermondが「ESRI Tell All、Technical Edition」を発行して、あなたが正しいかどうかを確認することだけです!
-canisrufus

2
シェープファイル形式がARC / INFO形式から発展した場合、v7よりもかなり早くなりました。私がESRIで仕事を始めた1994年、AV2はすでに発売されており、ARC / INFO 7の開発作業が進行中でした。
mkennedy

良い点、メリタ。この回答の要点(一部の形式の選択肢は最終的にFortranに由来する可能性があります)は、元のArcおよびInfoアプリケーションにまでさかのぼります。
whuber

@mkennedyに感謝します。v7への参照を削除しました。オリジナルのARC / INFOユーザーマニュアル(v3 .. v6時代)には、FORTRANコードから取られたと思われるヘッダーがあった時代を今でも覚えています。
スティーブンクアン

4

エンディアンの分割は、一方がSunワークステーションに、もう一方がPCにあり、開発プロセスの終わり近くまで会わないことが原因であると常に考えていました。

私は本当に何が起こったのか知りたいです。


3
ESRIはそれよりも少し調整されていたと思います。実際、どちらかといえば、彼らのソフトウェアは、その設計に委員会の関与が多すぎるように見える傾向があります。
whuber

0

そこのどこかでdbf / foxproの起源について何か聞いたことがあると思います。
それはちょうど私が持っていた奇妙な夢だったかもしれません。


5
ここで問題になっている.shpおよび.shxパーツは、ほぼ20年前に存在していた.dbfフォーマットとは完全に独立して設計されました。
whuber

0

シェープファイルは約20年前に導入されたことを理解する必要がありますが、当時は一貫性がなく、設計が不十分なファイル形式が無数にあったため、シェープファイルも例外ではありません。私は自分でシェープファイルパーサーを作成しましたが、シェープファイル(.SHP)自体と比較して、DBF形式の解析に多くの問題があったと言わざるを得ません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.