Shapefile teknik özelliklerinde “Tuhaflıklar”


32

Shapefile ayrıştırma kütüphanesi yazıyorum ve şartnamede anlayamadığım birkaç tasarım kararıyla karşılaştım . Umarım buralarda neden böyle olduklarını söyleyebilecek, eski bir ESRI geliştiricisi var.

  1. Ana kayıt dosyası (.shp) karma endianness'tendir . Özellikle, başlığın bölümleri büyük endian bayt sıralamasına sahiptir, ancak kayıtların hepsi küçük endian'dır. Genelde bayt ve bitlerden daha yüksek bir seviyede çalışırım, ancak endianness hakkında şimdiye kadar okuduğum her şey bunu olağandışı olarak işaretler. Dosya neden tekdüze bir endian olmadı?

  2. "Dosya Uzunluğu" alanı ve diğer uzunluk ve konum alanları, daha standart (sınırlı perspektifime göre) 8 bit konumlandırma yerine 16 bitlik kelimelerle kaydedilir. Bu karara nasıl ulaşıldı?

Stack Overflow'ta da benzer bir soru yayınladım ancak yanıt alamadım. Bu diğer insanlara konu dışı geliyorsa, kapanmasını destekleyebilirim.


4
GeospatialPython.com adresindeki Joel Lawhead, bir süredir şekil dosyası gizemlerini çözmeye çalışıyor.
Chad Cooper

Tam olarak ilişkili değil, ama temiz! Umarım çözersin.
canisrufus

Yanıtlar:


28

Shapefiles'in geliştirilmesi, özellikle platformdan bağımsız olacak şekilde tasarlanmış olan ArcView'in gelişimi ile eşzamanlıydı. (Aslında, bunun çöküşü olduğu ortaya çıktı: "Neuron Data" adı verilen ve bağımsız bir GUI platformunda geliştirilen bir arayüze dayanarak birçok Windows özelliğinden yararlanamadı. Tüm sistemlerin en kötüsünü yansıttı. () pazarlanmıştır.) Şekil dosyası özelliği baştan beri garip olsa da, bu tasarım çerçevesi içinde çok çeşitli bir anlam ifade ediyordu: şekil dosyaları birçok platform için tasarlandığından, özellikleri bunlardan hiçbirini desteklememeli ve bu nedenle eşit derecede iğrenç olmalı. Bütün iknaların programcılarına.

İkinci sorunun doğru olmayan bir varsayıma dayandığı görülmektedir. Örneğin, "Dosya Uzunluğu" alanı ana başlıktaki 24 bayt ofsetinde görünür ve en fazla 2 ^ 31- uzunluğunu temsil etmesi gerektiği için (işaretli) dört baytlık (32 bit) bir tamsayıdır. 1. Öncelikle dört baytlık bir "Dosya Kodu" ve gelecekteki kullanım için ayrılmış beş dört baytlık alandan önce gelir: böyle bir alanı sakladığınızda, tabii ki alanları olabildiğince makul büyüklükte yapmak istiyorsunuz. mümkün olan en yüksek esnekliği sağlamak için 32 bittik. Bir dosyadaki sayısal alanları kelime sınırlarına göre hizalamak da yardımcı olur:


2
:) Tam olarak ne aradığımı. "Dosya Uzunluğu" alanının "16 bitlik kelimelerle kaydedildiğini" söylediğimde, söylemeye çalıştığım şey, 32 bitlik tamsayı değerinin dosya uzunluğunu 16 bitlik kelimelerle kaydetmesidir. (Spesifikasyondan: "Dosya uzunluğu için değer, dosyanın 16 bitlik sözcüklerdeki toplam uzunluğudır"). Yaklaşık 4 GB gibi görünen 2 * 2 ^ 31-1 bayt uzunluğunu temsil ediyor gibi görünüyor. Aynısı, .shx dosyasındaki değerler için de geçerlidir. 2 * 2 ^ 31-1 byte'a kadar dosya uzunluklarını destekleyebilmesi gerektiği görülüyor. Neyi kaçırıyorum?
canisrufus

İyi nokta - Bunu özledim. Aslında, tasarım dört byte kelimesi cinsinden dosya uzunlukları ve ofsetlerini (.shx dosyasındaki işaretçiler) kolayca yapabilecek ve böylece .shp dosyasının muhtemel boyutunu 4 * 'e (2 ^ 31-1) yükseltmiş olabilir. (yaklaşık 8 milyar bayt). Neden iki baytlık kelimeler seçtiklerini ya da işaretsiz tamsayıların her ikisi de daha uygun olduğu ve iki kat daha fazla depolama alanı sağladığı durumlarda sürekli olarak işaretli tamsayıları kullandıklarını bile bilmiyorum .
whuber

1
16 bitlik tuhaflığın, yerli bir kişinin int16 bitlik olduğu o dönemde kullanılan 16 bit bilgisayarlarla ilgisi olup olmadığını merak ediyorum .
Mike T

Her zaman bir olasılıktır @Mike. Bununla birlikte, 80286 PC'ler bile (yaklaşık 1984) doğal olarak 32-bit inç'i destekledi - onlarla aritmetik yapmak için kayıt çiftleri kullandılar.
whuber

5
Bir Esri meslektaşı, zenginlik karışımının kasıtlı olduğunu hatırladığını söylüyor. 'Platformlar arası sorunlar nedeniyle geliştiricilerin bunu doğrudan ele almasını sağlayacağız.' Fakat, elbette, bunların hepsi kıyamet.
mkennedy

10

Dışarıdaki biri bu cevapları ve daha fazlasını biliyor ama konuşmuyorlar.

Belgelenmemiş sbn ve sbx dosyalarının kodunu çözmek için birlikte çalıştığım ekip, aynı anda hem daha da tuhaf hem de daha tuhaf olan birçok tuhaflık keşfetti.

Shapefile yapılarının çoğu, ESRI geliştiricilerinin düşündüğü şeyleri öneren mantıklı ve çok verimlidir. Sanki bir çılgınca atılmış bir sürü akıllı geliştiriciye sahiplermiş gibi.

Diğer gönderiler tarafından önerildiği gibi, tuhaflıklar muhtemelen şu anda bize yabancı olan makine veya dil gereksinimlerinin sonucudur.

Her zaman 16-bit kelimelerin yer kazanmanın kolay bir yolu olduğundan şüphelendim. Dosyaları kullanırken 16 bitlik kelime değerlerini bellekte tutmanız gerektiğini göreceksiniz. Yer kazanmak için değer hesaplama stratejisi, bugün bile ikili formatlarda yaygındır. Ancak Mike'ın yerli int önerisi de aynı şekilde muhtemel.

Endian-saygısız sadece garip. Kimsenin gördüğüm kadar iyi bir cevabı yok.

Dbf formatı, 1960'larda ortaya çıkan dbase III formatından alınmıştır. O zamandan beri yaygın olarak kullanılmaktadır ve foxpro ve xbase dahil diğer isimler altında bulunabilir.

Shapefile formatının kusurlarına, tuhaflıklarına ve sınırlamalarına rağmen, CBS alanında ve çevresinde inatla devam eder. Diğer her girişimi basit vektör depolama için çok fazla veya özel mülkiyeti şişirilmiş oldu. ESRI düşünce şekilleri bile yeni başlayanları ArcINFO'ya, eşiklere ve coğrafi veri tabanlarına doğru hareket ettirecek bir oyuncak olacaktı. İnternetin muhtemelen formatın kalkması ile ilgisi vardı.

Pyshp yazmayı çok öğrendim. Ayrıştırıcı yazmak bir format öğrenmenin harika bir yoludur.


Hmm. İyi cevap. 16-bit kelimelerin kullanımının nasıl yer kazandırdığını anlamıyorum. Amaçlarım için (javascript'te ArrayBufferViews oluşturmak), doğru olanı elde etmek için tek yaptığım şey beni iki ile çarpmaya zorlamak: Hiçbir fayda için fazladan döngü ekliyorum. Detaylandırır mısın
canisrufus

1
Evet - imzalanmış girişleri kullandıkları için bu değerlerin üst uçları 32,767 olurlar, böylece daha büyük sayıları 4 yerine 2 baytta depolayabilirler. Okuma ve yazma işlemleri için shapefiles ile çalışırken RAM. Çiftler üzerinde (diğer ikili formatlarda gördüğüm) yer kazanmak için bir planla geliyorsanız, her zaman çirkin ve karmaşıktır. Böylece sadece veri büyüklüğü değerleri için basit bir şema oluşturdular.
GeospatialPython.com

Ayrıca - ilk başta beni çok sıkan shx dosyalarında keşfettim. SHX dosyalarının 256x256 tamsayılı bir ızgaraya eşlenen özellikler için sınırlayıcı kutuları vardır. Bu teknik indekslemede yaygındır, ancak bu kadar küçük bir ızgara üzerinde değildir. Koordinatları inç yerine 1 baytlık karakter olarak kaydederler. Bu yüzden ızgara sadece 256x256. Şimdi bu 1990'larda bile hafızada cimri davranmak! Elbette bir endeks kullanarak parçaların zımni gruplandırılması gibi başka pek çok verimlilik var. Haklısın - bu teknikler programcıya daha fazla yük getirdi. Bu yüzden hafıza kullanımı bir öncelik olmalı.
GeospatialPython.com

1
Yah, yazdığını okudum. Lord'un bu konuda iyi iş çıkarıyorsunuz;) Son analizinizi merakla bekliyorum. 16-bit sorunuyla ilgili olarak, amacınızın geçerli olduğundan emin değilim. 1. SHP ve SHX dosyalarında, yanıltıcı olmadığım sürece, 16 bit alan yoktur. 2. 8 bitlik değerler yerine 16 bitlik değerleri göstermek, sadece işaretsiz bir int (2 ^ 16) kullanarak elde edebilecekleri tanımlanabilir uzunluğu (2 * 2 ^ 15) ikiye katlar. Sonuçta yer tasarrufu sağlamaz.
canisrufus

"Bellek kullanımı" derken RAM mi yoksa disk mi demek istediğinizi söylemek zor. 90'lı yılların başlarında, 2 GB'lık bir sürücü ve 16-32 MB RAM oldukça üst düzeydeydi: bazı dosya alanlarından (veya ağ bant genişliğinden tasarruf etmek) hala önemli olurdu. Sorumlu bir yazılım mühendisi, seçtikleri zaman alanlarındaki değişimlerin gelecekteki müşterileri için sonuçları ile dikkatlice düşünmek isteyecektir; Seçimler açıkça, yıkıcı derecede etkin olmadığı sürece, rüzgârda onlara şüphe avantajını veririm.
whuber

5

Bu benim işim.

Shapefile formatı büyük olasılıkla FORTRAN / PR1ME kaynaklarından gelen geçmişi olan ARC / INFO'dan gelişti. Tüm ARC / INFO formatları bu 100 baytlık başlığa ve Dosya Kodunun ve Dosya Uzunluğunun büyük endikasyonuna (örn. Coverages, TINs) sahipti.

ArcView 1 için Shapefiles yapıldığında, ESRI, Microsoft Windows pazarına girmeye odaklandı ve Shapefile formatının geri kalanı, büyük ölçüde küçük PC'lerin endian olmasına odaklandı.

Kuşkusuzluk arasındaki sürekli değişimin, muhtemelen, eski kökenleri desteklerken, platforma girmenin yararlarını tahmin etmenin gerekliliği olduğu düşünülüyordu.


Bu makul görünüyor. Bilgi için teşekkürler!
whuber

Endianness hakkındaki en sevdiğim varsayım bu. Şimdi tek ihtiyacımız olan, haklı olup olmadığınızı görmek için "The ESRI Tell All, Technical Edition" ı yayınlamak için Dangermond!
canisrufus

2
Shapefile formatı ARC / INFO formatlarından geliştiyse, v7'den oldukça önceydi. 1994'te ESRI'da başladığımda AV2 çoktan dışarı çıktı ve ARC / INFO 7 için geliştirme çalışmaları devam ediyordu.
mkennedy

İyi nokta, Melita. Bu cevabın temel noktası - bazı format seçimlerinin sonuçta Fortran kökenlerine sahip olabileceği - orijinal Arc ve Bilgi uygulamalarına kadar tümüyle doğru olacaktır.
whuber

Teşekkürler @mkennedy, v7 referansını kaldırdım. Orijinal ARC / INFO kullanım kılavuzlarının (v3 .. v6 dönemi) FORTRAN kodundan alındığına inandığım başlıkları hala hatırlıyorum.
Stephen Quan

4

Endian bölünmesinin, her biri Sun Workstation'da, diğerinde PC'lerde iki takım olması ve geliştirme sürecinin sonuna kadar toplanmamalarından kaynaklandığını her zaman varsaydım.

Gerçekten ne olduğunu bilmek isterdim.


3
Bence ESRI bundan biraz daha koordineli. Nitekim, eğer bir şey varsa, yazılımı tasarımında çok fazla komite katılımı varmış gibi görünme eğilimindedir .
whuber

0

Orada bir yerde dbf / foxpro'nun kökeni hakkında bir şeyler duydum.
Bu olsa benim yaptığım tuhaf bir rüya olabilirdi.


5
Burada söz konusu olan .shp ve .shx bölümleri, daha önce yaklaşık 20 yıldan beri olan .dbf biçiminden tamamen bağımsız olarak tasarlandı.
whuber

0

Shapefilo'ların 20 yıl önce tanıtıldığını anlamalısınız, o zamanlar sayısız tutarsız ve kötü tasarlanmış dosya formatı vardı. Ben bir shapefile ayrıştırıcı kendim yazdım ve DBF formatını ayrıştırma konusunda kendi formfiles (.SHP) 'e kıyasla daha fazla sorun yaşadığımı söylemek zorundayım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.