"Keanehan" dalam spesifikasi teknis Shapefile

32

Saya telah menulis perpustakaan parsing shapefile, dan telah menemui beberapa keputusan desain dalam spesifikasi yang saya tidak segera mengerti. Saya berharap ada pengembang ESRI tua yang keriput di sini yang dapat memberi tahu saya mengapa hal-hal ini terjadi.

  1. File rekaman utama (.shp) adalah campuran endianness . Secara khusus, bagian-bagian dari header fitur pemesanan big endian byte, tetapi catatan semua sedikit endian. Saya biasanya bekerja pada level yang lebih tinggi daripada byte dan bit, tetapi semua yang saya baca sejauh ini tentang endianness menandai ini sebagai tidak biasa. Mengapa file yang ditentukan tidak endianness seragam?

  2. Bidang "Panjang File", serta bidang panjang dan posisi lainnya, direkam dalam kata-kata 16-bit, alih-alih lebih standar (dari perspektif terbatas saya) pemosisian 8 bit. Bagaimana keputusan ini dicapai?

Saya memposting pertanyaan serupa di Stack Overflow, tetapi tidak mendapat tanggapan. Jika ini kelihatannya terlalu asing bagi orang lain, saya dapat mendukung untuk menutupnya.

canisrufus
sumber
4
Joel Lawhead di GeospatialPython.com telah bekerja untuk memecahkan misteri shapefile untuk sementara waktu.
Chad Cooper
Tidak persis terkait, tetapi rapi! Saya harap angka itu keluar.
canisrufus

Jawaban:

28

Pengembangan shapefile bersamaan dengan pengembangan ArcView, yang secara khusus dirancang untuk menjadi platform independen. (Bahkan, itu ternyata kejatuhannya: dengan mengandalkan antarmuka yang dikembangkan dalam platform independen GUI yang disebut "Neuron Data," itu tidak bisa mengambil keuntungan dari banyak kemampuan Windows. Itu akhirnya mencerminkan yang terburuk dari semua sistem itu telah dipasarkan untuk.) Meskipun spesifikasi shapefile aneh sejak awal, itu membuat semacam pengertian gila dalam kerangka desain ini: karena shapefile dimaksudkan untuk banyak platform, spesifikasi mereka tidak boleh berpihak pada salah satu dari mereka dan karenanya harus sama menjengkelkannya untuk programmer dari semua persuasi.

Pertanyaan kedua tampaknya didasarkan pada asumsi yang tidak benar. Misalnya, bidang "Panjang File" muncul pada byte offset 24 di header utama dan merupakan bilangan bulat (ditandatangani) empat-byte (32 bit), karena harus mewakili panjang hingga 2 ^ 31- 1. Itu didahului oleh "File Code" empat byte dan lima bidang empat byte lainnya yang dicadangkan untuk penggunaan di masa mendatang: ketika Anda memesan ruang seperti itu, tentu saja Anda ingin membuat bidang sebesar mungkin, yang pada saat itu adalah 32 bit, untuk mempertahankan fleksibilitas sebesar mungkin. Ini juga membantu untuk menyelaraskan bidang angka dalam file pada batas kata:

whuber
sumber
2
:) Persis apa yang saya cari. Ketika saya mengatakan bahwa bidang "Panjang File" adalah "direkam dalam kata-kata 16-bit", apa yang saya coba katakan adalah bahwa nilai integer 32-bit mencatat panjang file dalam kata-kata 16-bit. (Dari spec: "Nilai untuk panjang file adalah panjang total file dalam kata-kata 16-bit"). Sepertinya itu dapat mewakili panjang byte 2 * 2 ^ 31-1, yang terlihat sekitar 4 GB. Hal yang sama berlaku untuk nilai-nilai dalam file .shx. Sepertinya itu harus dapat mendukung panjang file hingga 2 * 2 ^ 31-1 byte. Apa yang saya lewatkan?
canisrufus
Poin bagus - saya melewatkan itu. Sebenarnya, desain bisa dengan mudah membuat panjang dan offset file (pointer dalam file .shx) dalam hal empat kata, sehingga meningkatkan ukuran file .shp yang mungkin menjadi 4 * (2 ^ 31-1) (sekitar 8 miliar byte). Saya tidak tahu mengapa mereka memilih kata dua-byte, atau bahkan mengapa mereka secara konsisten menggunakan bilangan bulat yang ditandatangani di mana bilangan bulat yang tidak ditandatangani keduanya lebih tepat dan menyediakan penyimpanan dua kali lebih banyak.
whuber
1
Saya ingin tahu apakah keanehan 16-bit berkaitan dengan komputer 16-bit yang digunakan pada saat itu, di mana asli int16-bit.
Mike T
Selalu ada kemungkinan, @Mike. Namun, bahkan 80286 PC (c. 1984) secara native mendukung int 32-bit - mereka menggunakan pasangan register untuk melakukan aritmatika dengannya.
whuber
5
Seorang kolega Esri mengatakan bahwa dia ingat campuran endian-ness disengaja. Sesuatu di sepanjang baris 'kami akan membuat pengembang menanganinya langsung karena masalah lintas platform.' Tapi, tentu saja, ini semua apokrif.
mkennedy
10

Seseorang di luar sana tahu jawaban ini dan banyak lagi tetapi mereka tidak berbicara.

Tim saya telah bekerja dengan untuk memecahkan kode file sbn dan sbx tidak berdokumen telah menemukan lebih banyak keanehan yang sama-sama mirip namun bahkan lebih aneh pada saat yang sama.

Sebagian besar struktur shapefile logis dan sangat efisien yang menyarankan pengembang ESRI memikirkan semuanya. Sepertinya mereka memiliki banyak pengembang pintar dengan satu orang gila dilemparkan ke dalam.

Seperti yang disarankan oleh posting lain, keanehan mungkin hasil dari persyaratan mesin atau bahasa yang asing bagi kami sekarang.

Saya selalu menduga kata 16-bit adalah cara mudah untuk menghemat ruang. Anda akan menemukan bahwa Anda harus memegang nilai kata 16-bit dalam memori saat menangani file. Strategi penghitungan nilai untuk menghemat ruang sudah umum dalam format biner bahkan hingga hari ini. Tapi saran int asli Mike juga sama mungkin.

Membalikkan endian hanya aneh. Tidak ada yang punya jawaban bagus yang pernah saya lihat.

Format dbf dirobek dari format dbase III yang berasal dari tahun 1960-an. Ini telah banyak digunakan sejak dan dapat ditemukan dengan nama lain termasuk foxpro dan xbase.

Meskipun cacat format keanehan, keanehan, dan keterbatasan itu tetap ada di dalam dan di sekitar bidang GIS. Setiap upaya lain untuk menggantikannya terlalu membengkak untuk penyimpanan vektor sederhana atau terlalu eksklusif. Bahkan ESRI berpikir shapefile akan menjadi mainan yang akan menggerakkan pemula menuju ArcINFO, cakupan, dan geodatabase. Internet mungkin banyak hubungannya dengan format lepas landas.

Saya belajar banyak menulis pyshp. Menulis parser adalah cara yang fantastis untuk mempelajari format.

GeospatialPython.com
sumber
Hmm. Jawaban yang bagus. Saya tidak mengerti bagaimana penggunaan kata-kata 16-bit menghemat ruang. Untuk tujuan saya (membangun ArrayBufferViews dalam javascript), semua yang dilakukannya adalah memaksa saya untuk mengalikannya dengan dua untuk mendapatkan offset yang benar: Saya membakar siklus tambahan tanpa manfaat. Maukah Anda menguraikan?
canisrufus
1
Ya - karena mereka menggunakan ints yang ditandatangani, mereka berada di ujung atas nilai-nilai itu akan menjadi 32.767 sehingga mereka dapat menyimpan angka yang lebih besar dalam 2-byte, bukan 4. Nilai-nilai yang diberikan pada kata-kata 16-bit seperti yang saya katakan adalah nilai yang akhirnya Anda pegang RAM ketika bekerja dengan shapefile untuk operasi baca dan tulis. Datang dengan skema untuk menghemat ruang pada ganda (yang saya lihat dalam format biner lainnya) selalu jelek dan rumit. Jadi mereka hanya terjebak dengan skema sederhana untuk nilai ukuran data.
GeospatialPython.com
Juga - saya temukan di file shx yang membuat saya bingung pada awalnya. File SHX memiliki kotak pembatas untuk fitur yang dipetakan ke grid integer 256x256. Teknik ini umum dalam pengindeksan tetapi tidak pada kotak yang kecil. Mereka menyimpan koordinat sebagai karakter 1-byte alih-alih int. Itu sebabnya kotak hanya 256x256. Nah, itu benar-benar pelit dengan ingatan bahkan untuk tahun 1990-an! Tentu saja ada banyak efisiensi lain seperti pengelompokan bagian tersirat menggunakan indeks. Anda benar - teknik ini memberi beban lebih pada programmer. Jadi penggunaan memori harus menjadi prioritas.
GeospatialPython.com
1
Yah, aku membaca tulisanmu. Anda melakukan pekerjaan tuan yang bagus dalam hal itu;) Saya dengan sabar menunggu analisis akhir Anda. Mengenai masalah 16-bit, saya tidak yakin maksud Anda. 1. Dalam file SHP dan SHX, tidak ada bidang 16 bit, kecuali saya salah besar. 2. Mewakili nilai 16-bit alih-alih nilai 8-bit hanya menggandakan panjang yang dapat dideskripsikan (2 * 2 ^ 15), yang dapat mereka capai hanya dengan menggunakan int yang tidak ditandatangani (2 ^ 16). Ini pada akhirnya tidak menghemat ruang.
canisrufus
Ketika Anda merujuk pada "penggunaan memori" sulit untuk mengatakan apakah yang Anda maksud adalah RAM atau disk. Pada awal 90-an, drive 2 GB dan 16-32 MB RAM cukup canggih: menghemat ruang file (atau bandwidth jaringan) masih akan menjadi penting. Seorang insinyur perangkat lunak yang bertanggung jawab ingin memikirkan dengan hati-hati melalui implikasi untuk pelanggan masa depan pengorbanan waktu dalam pilihan mereka; di belakang saya akan memberi mereka keuntungan dari keraguan kecuali pilihannya jelas, sangat tidak efisien.
Whuber
5

Ini adalah pendapat saya.

Format shapefile kemungkinan besar berevolusi dari ARC / INFO yang memiliki sejarah sejak dari asal FORTRAN / PR1ME. Semua format ARC / INFO memiliki tajuk 100 byte ini dan endianess Besar dari Kode File dan Panjang File (misalnya Cakupan, TIN).

Ketika Shapefile dibuat untuk ArcView 1, ESRI berfokus pada membobol pasar Microsoft Windows dan sisanya dari format Shapefile sangat terfokus untuk menjadi endian kecil PC.

Pergantian konstan antara endianess adalah, mungkin kebutuhan untuk mendukung asal-usul warisan sambil mengantisipasi manfaat dari menerobos ke dalam platform.

Stephen Quan
sumber
Ini kedengarannya masuk akal. Terima kasih untuk wawasan!
whuber
Ini adalah dugaan favorit saya tentang endianness. Sekarang yang kita butuhkan adalah Dangermond untuk menerbitkan "The ESRI Tell All, Edisi Teknis" untuk melihat apakah Anda benar!
canisrufus
2
Jika format shapefile berevolusi dari format ARC / INFO, itu jauh lebih awal dari v7. Pada tahun 1994 ketika saya mulai di ESRI, AV2 sudah keluar, dan pekerjaan pengembangan untuk ARC / INFO 7 sedang berlangsung.
mkennedy
Poin bagus, Melita. Inti dari jawaban ini - bahwa beberapa pilihan format mungkin pada akhirnya memiliki asal Fortran - masih benar sepanjang jalan kembali ke aplikasi Arc dan Info yang asli.
whuber
Terima kasih @kenkeny, saya menghapus referensi ke v7. Saya masih ingat hari-hari dimana manual pengguna ARC / INFO asli (v3 .. v6 era) memiliki header yang saya percaya diambil dari kode FORTRAN.
Stephen Quan
4

Saya selalu berasumsi bahwa perpecahan endian disebabkan oleh memiliki dua tim satu di Sun Workstations dan yang lainnya di PC dan mereka tidak bertemu sampai menjelang akhir proses pengembangan.

Saya ingin tahu apa yang sebenarnya terjadi.

Ian Turton
sumber
3
Saya pikir ESRI sedikit lebih terkoordinasi dari itu. Memang, jika ada, perangkat lunak mereka memiliki kecenderungan untuk terlihat seperti ada terlalu banyak keterlibatan komite dalam desainnya.
Whuber
0

Saya pikir di suatu tempat di belakang sana saya mendengar sesuatu tentang asal usul dbf / foxpro.
Itu bisa saja hanya mimpi aneh yang saya miliki.

Brad Nesom
sumber
5
Bagian .shp dan .shx, yang dipertanyakan di sini, dirancang sepenuhnya terlepas dari format .dbf, yang telah ada selama hampir 20 tahun sebelumnya.
whuber
0

Anda harus memahami shapefile diperkenalkan sekitar 20 tahun yang lalu, pada saat itu ada banyak sekali format file yang tidak konsisten dan dirancang dengan buruk, jadi tidak terkecuali shapefile. Saya telah menulis parser shapefile sendiri dan saya harus mengatakan saya memiliki lebih banyak masalah dengan parsing format DBF dibandingkan dengan shapefile (.SHP) sendiri.

Igor Brejc
sumber