Những điều lạ lùng trong các đặc điểm kỹ thuật của Shapefile


32

Tôi đã viết một thư viện phân tích cú pháp shapefile và đã gặp một vài quyết định thiết kế trong đặc tả mà tôi không hiểu ngay lập tức. Tôi hy vọng có một nhà phát triển ESRI cũ đang hoảng sợ ở đây, người có thể cho tôi biết lý do tại sao những thứ này là như vậy.

  1. Tệp bản ghi chính (.shp) có độ bền hỗn hợp . Cụ thể, các phần của tiêu đề có thứ tự byte cuối lớn, nhưng các bản ghi đều là endian nhỏ. Tôi thường làm việc ở mức cao hơn byte và bit, nhưng mọi thứ tôi đã đọc từ trước đến nay đều đánh dấu điều này là bất thường. Tại sao tệp không được chỉ định là có độ bền đồng nhất?

  2. Trường "Độ dài tệp", cũng như các trường độ dài và vị trí khác, được ghi bằng các từ 16 bit, thay vì định vị 8 bit chuẩn hơn (theo quan điểm hạn chế của tôi). Làm thế nào mà quyết định này đạt được?

Tôi đã đăng một câu hỏi tương tự trên Stack Overflow, nhưng không nhận được phản hồi nào. Nếu điều này có vẻ quá lạc đề với người khác, tôi có thể hỗ trợ đóng nó.


4
Joel Lawhead tại GeospatialPython.com đã nghiên cứu giải quyết những bí ẩn về shapefile trong một thời gian.
Chad Cooper

Không liên quan chính xác, nhưng gọn gàng! Tôi hy vọng con số đó ra.
canisrufus

Câu trả lời:


28

Sự phát triển của shapefiles đồng thời với sự phát triển của ArcView, được thiết kế đặc biệt để độc lập với nền tảng. (Trên thực tế, điều đó hóa ra là sự sụp đổ của nó: bằng cách dựa vào giao diện được phát triển trong GUI độc lập nền tảng có tên là "Dữ liệu thần kinh", nó không thể tận dụng nhiều khả năng của Windows. đã được bán trên thị trường.) Mặc dù đặc điểm kỹ thuật của shapefile là lạ ngay từ đầu, nhưng nó có ý nghĩa như vậy trong khung thiết kế này: bởi vì shapefile được dành cho nhiều nền tảng, nên đặc điểm kỹ thuật của chúng không nên ủng hộ bất kỳ ai trong số chúng và do đó cũng đáng ghét như nhau để lập trình viên của tất cả các thuyết phục.

Câu hỏi thứ hai dường như được dựa trên một giả định không đúng. Chẳng hạn, trường "Độ dài tệp" xuất hiện ở byte bù 24 trong tiêu đề chính và là số nguyên bốn (32 bit) (đã ký), vì nó phải thể hiện độ dài lên tới 2 ^ 31- 1. Nó được đi trước bởi một "Mã tệp" bốn byte và năm trường bốn byte nữa được dành riêng cho sử dụng trong tương lai: khi bạn đặt trước không gian như vậy, tất nhiên bạn muốn làm cho các trường càng lớn càng tốt, vào thời điểm đó là 32 bit, để duy trì tính linh hoạt cao nhất có thể. Nó cũng giúp sắp xếp các trường số trong một tệp trên ranh giới từ:


2
:) Chính xác những gì tôi đang tìm kiếm. Khi tôi nói rằng trường "Độ dài tệp" là "được ghi bằng các từ 16 bit", điều tôi cố gắng nói là giá trị của số nguyên 32 bit ghi lại độ dài tệp bằng các từ 16 bit. (Từ thông số kỹ thuật: "Giá trị cho độ dài tệp là tổng chiều dài của tệp bằng các từ 16 bit"). Có vẻ như nó có thể biểu thị độ dài byte là 2 * 2 ^ 31-1, có vẻ là khoảng 4 GB. Điều này cũng đúng với các giá trị trong tệp .shx. Có vẻ như nó có thể hỗ trợ độ dài tệp lên tới 2 * 2 ^ 31-1 byte. Tôi đang thiếu gì?
canisrufus

Điểm tốt - Tôi đã bỏ lỡ điều đó. Trên thực tế, thiết kế có thể dễ dàng tạo độ dài và độ lệch của tệp (con trỏ trong tệp .shx) theo các từ có bốn ký tự, do đó tăng kích thước có thể của tệp .shp lên 4 * (2 ^ 31-1) (khoảng 8 tỷ byte). Tôi không có ý tưởng tại sao họ đã chọn từ hai byte, hay thậm chí tại sao họ luôn sử dụng chữ ký số nguyên nơi số nguyên unsigned đều thích hợp hơn và cung cấp cho gấp đôi lưu trữ.
whuber

1
Tôi tự hỏi liệu sự kỳ quặc 16 bit có liên quan đến các máy tính 16 bit được sử dụng tại thời điểm đó hay không, trong đó bản địa intlà 16 bit.
Mike T

Luôn luôn là một khả năng, @Mike. Tuy nhiên, ngay cả các PC 80286 (c. 1984) thực sự hỗ trợ int 32 bit - họ đã sử dụng các cặp thanh ghi để thực hiện số học với chúng.
whuber

5
Một đồng nghiệp của Esri nói rằng anh ta nhớ sự pha trộn của tính chất cuối cùng là có chủ ý. Một cái gì đó dọc theo dòng chữ 'chúng tôi sẽ khiến các nhà phát triển xử lý hoàn toàn vì các vấn đề đa nền tảng.' Nhưng, tất nhiên, đây là tất cả ngày tận thế.
mkennedy

10

Ai đó ngoài kia biết những câu trả lời này và nhiều hơn nữa nhưng họ không nói chuyện.

Nhóm mà tôi đã làm việc để giải mã các tệp sbn và sbx không có giấy tờ đã phát hiện ra nhiều điều kỳ lạ hơn, cả hai đều giống nhau nhưng thậm chí còn kỳ quái hơn cùng một lúc.

Hầu hết các cấu trúc shapefile là hợp lý và rất hiệu quả, điều đó cho thấy các nhà phát triển ESRI đã nghĩ đến mọi thứ. Giống như họ có một loạt các nhà phát triển thông minh với một kẻ mất trí.

Theo đề xuất của các bài viết khác, sự kỳ quặc có lẽ là kết quả của các yêu cầu về máy móc hoặc ngôn ngữ xa lạ với chúng ta bây giờ.

Tôi luôn nghi ngờ các từ 16 bit là một cách dễ dàng để tiết kiệm dung lượng. Bạn sẽ thấy rằng bạn phải giữ các giá trị từ 16 bit trong bộ nhớ khi xử lý tệp. Chiến lược tính toán các giá trị để tiết kiệm không gian là phổ biến ở các định dạng nhị phân ngay cả ngày nay. Nhưng đề nghị int int của Mike cũng có khả năng như vậy.

Việc lật ngược chỉ là kỳ lạ. Không ai có câu trả lời hay mà tôi từng thấy.

Định dạng dbf được trích xuất từ ​​định dạng dbase III có nguồn gốc từ những năm 1960. Nó đã được sử dụng rộng rãi kể từ đó và có thể được tìm thấy dưới các tên khác bao gồm foxpro và xbase.

Bất chấp những sai sót, định dạng và hạn chế của định dạng shapefile, nó vẫn tồn tại một cách ngoan cố trong và xung quanh lĩnh vực GIS. Mọi nỗ lực khác để thay thế nó đã quá phình to cho việc lưu trữ vector đơn giản hoặc quá độc quyền. Ngay cả ESRI cũng nghĩ rằng shapefiles sẽ là một món đồ chơi giúp người mới bắt đầu hướng tới ArcINFO, bảo hiểm và cơ sở dữ liệu địa lý. Internet có lẽ có nhiều việc phải làm với định dạng cất cánh.

Tôi đã học được rất nhiều viết pyshp. Viết một trình phân tích cú pháp là một cách tuyệt vời để tìm hiểu một định dạng.


Hừm. Câu trả lời tốt. Tôi không hiểu cách sử dụng các từ 16 bit tiết kiệm không gian. Đối với mục đích của tôi (xây dựng ArrayBufferViews trong javascript), tất cả những gì nó làm là buộc tôi phải nhân hai để có được sự bù đắp chính xác: Tôi đang đốt thêm chu kỳ không có lợi. Bạn có thể giải thích?
canisrufus

1
Có - vì họ đã sử dụng số int đã ký, họ là cấp trên của các giá trị đó sẽ là 32.767 để họ có thể lưu trữ số lớn hơn trong 2 byte thay vì 4. Các giá trị được gán cho các từ 16 bit như tôi đã nói là các giá trị bạn kết thúc RAM khi làm việc với shapefiles cho các hoạt động đọc và ghi. Đến với một kế hoạch để tiết kiệm không gian trên đôi (mà tôi đã thấy trong các định dạng nhị phân khác) luôn xấu xí và phức tạp. Vì vậy, họ chỉ bị mắc kẹt với một sơ đồ đơn giản cho các giá trị kích thước dữ liệu.
GeospatialPython.com

Ngoài ra - tôi đã phát hiện ra trong các tập tin shx làm tôi bối rối lúc đầu. Các tệp SHX có các hộp giới hạn cho các tính năng được ánh xạ tới lưới số nguyên 256x256. Kỹ thuật này là phổ biến trong việc lập chỉ mục nhưng không phải trên một lưới nhỏ. Họ lưu tọa độ dưới dạng ký tự 1 byte thay vì ints. Đó là lý do tại sao lưới chỉ 256x256. Bây giờ điều đó là hết sức keo kiệt với bộ nhớ ngay cả trong những năm 1990! Tất nhiên có nhiều hiệu quả khác như nhóm các bộ phận ngụ ý sử dụng một chỉ mục. Bạn nói đúng - những kỹ thuật này tạo thêm gánh nặng cho lập trình viên. Vì vậy, việc sử dụng bộ nhớ phải được ưu tiên.
GeospatialPython.com

1
Yah, tôi đọc bài viết của bạn lên. Bạn đang làm tốt công việc của lãnh chúa về điều đó;) Tôi háo hức chờ đợi phân tích cuối cùng của bạn. Về vấn đề 16 bit, tôi không chắc quan điểm của bạn có đúng không. 1. Trong các tệp SHP và SHX, không có trường 16 bit, trừ khi tôi vô cùng nhầm lẫn. 2. Biểu thị các giá trị 16 bit thay vì các giá trị 8 bit chỉ nhân đôi độ dài có thể mô tả (2 * 2 ^ 15), mà chúng có thể đạt được chỉ bằng cách sử dụng một số nguyên không dấu (2 ^ 16). Cuối cùng, nó không tiết kiệm bất kỳ không gian.
canisrufus

Khi bạn đề cập đến "sử dụng bộ nhớ", thật khó để biết bạn có nghĩa là RAM hay đĩa. Vào đầu những năm 90, ổ đĩa 2 GB và RAM 16-32 MB là khá cao cấp: tiết kiệm một số không gian tệp (hoặc băng thông mạng) vẫn sẽ rất quan trọng. Một kỹ sư phần mềm có trách nhiệm sẽ muốn suy nghĩ cẩn thận thông qua các hàm ý cho khách hàng tương lai của họ về sự đánh đổi không gian thời gian trong lựa chọn của họ; nhìn nhận lại tôi sẽ cho họ lợi ích của sự nghi ngờ trừ khi sự lựa chọn rõ ràng là không hiệu quả.
whuber

5

Đây là quan điểm của tôi về nó.

Định dạng shapefile rất có thể được phát triển từ ARC / INFO có lịch sử bắt nguồn từ nguồn gốc FORTRAN / PR1ME của nó. Tất cả các định dạng ARC / INFO đều có tiêu đề 100 byte này và phần cuối lớn của Mã tệp và Độ dài tệp (ví dụ: Bìa, TIN).

Khi Shapefiles được tạo cho ArcView 1, ESRI đã tập trung vào việc xâm nhập vào thị trường Microsoft Windows và phần còn lại của định dạng Shapefile tập trung nhiều vào việc trở thành một phần cuối của PC.

Sự chuyển đổi liên tục giữa các endianess, có lẽ là cần phải hỗ trợ nguồn gốc di sản trong khi dự đoán lợi ích khi xâm nhập vào nền tảng.


Điều này nghe có vẻ hợp lý. Cảm ơn sự sáng suốt của bạn!
whuber

Đây là phỏng đoán yêu thích của tôi về sự kết thúc. Bây giờ tất cả những gì chúng ta cần là Dangermond để xuất bản "ESRI Tell All, Technical Edition" để xem bạn có đúng không!
canisrufus

2
Nếu định dạng shapefile phát triển từ các định dạng ARC / INFO, thì nó sớm hơn đáng kể so với v7. Vào năm 1994 khi tôi bắt đầu tại ESRI, AV2 đã ra mắt và công việc phát triển cho ARC / INFO 7 đang được tiến hành.
mkennedy

Điểm tốt, Melita. Mấu chốt của câu trả lời này - rằng một số lựa chọn định dạng cuối cùng có thể có nguồn gốc Fortran - vẫn hoàn toàn đúng với các ứng dụng Arc và Info ban đầu.
whuber

Cảm ơn @mkennedy, tôi đã xóa tham chiếu đến v7. Tôi vẫn còn nhớ những ngày mà hướng dẫn sử dụng ARC / INFO ban đầu (v3 .. v6) có các tiêu đề mà tôi tin rằng được lấy từ mã FORTRAN.
Stephen Quan

4

Tôi luôn cho rằng sự phân chia về cuối là do có hai đội một trên Sun Workstations và nhóm kia trên PC và họ không gặp nhau cho đến khi gần kết thúc quá trình phát triển.

Tôi muốn biết những gì thực sự đã xảy ra.


3
Tôi nghĩ ESRI đã phối hợp nhiều hơn thế. Thật vậy, nếu có bất cứ điều gì, phần mềm của họ có xu hướng trông giống như có quá nhiều sự tham gia của ủy ban trong thiết kế của nó.
whuber

0

Tôi nghĩ ở đâu đó trở lại tôi đã nghe một cái gì đó về nguồn gốc dbf / foxpro.
Đó có thể chỉ là một giấc mơ kỳ lạ mà tôi có.


5
Các phần .shp và .shx, được đề cập ở đây, được thiết kế hoàn toàn độc lập với định dạng .dbf, đã tồn tại gần 20 năm trước.
whuber

0

Bạn phải hiểu shapefiles đã được giới thiệu khoảng 20 năm trước, tại thời điểm đó có vô số định dạng tệp không nhất quán và được thiết kế kém, vì vậy shapefile cũng không ngoại lệ. Tôi đã tự viết một trình phân tích cú pháp shapefile và tôi phải nói rằng tôi đã gặp nhiều vấn đề hơn với việc phân tích định dạng DBF so với các shapefiles (.SHP).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.