۲۲ مهر ۱۴۰۴، ۱۰:۲۱
آیا اگر فقط فایل shp داشته باشم میتوانم کادر محاطی (bounding box) را به دست آورم؟
آیا فایل .shp بدون dbf، .shx، .prj یا موارد دیگر برای به دست آوردن کادر محاطی کافی است؟
من تلاش میکنم به کاربر اجازه دهم شکلفایلهای خود را در یک صفحه وب بارگذاری کند. میخواهم طول و عرض جغرافیایی را از شکلفایل نقطهای و کادر محاطی (طول، عرض، طول، عرض) را از شکلفایل چندضلعی به دست بیاورم (هر دو شکلفایل حاوی یک شکل/عرضه (feature) واحد خواهند بود). دوست دارم فکر کنم فایل .shp برای به دست آوردن شکل کافی است، اما وقتی از fiona استفاده میکنم، خطا میدهد. آیا بستهای وجود دارد که بتواند کمک کند؟
کد به این شکل است:
import fiona
from shapely.geometry import shape
shp_file = 'a_polygon_shapefile.shp'
c = fiona.open(shp_file)
# first record
first_shape = c.next()
box_topY = shape(first_shape['geometry']).bounds[3]
box_bottomY = shape(first_shape['geometry']).bounds[1]
box_rightX = shape(first_shape['geometry']).bounds[2]
box_leftX = shape(first_shape['geometry']).bounds[0]
خطایی که میگیرم این است:
Unable to open a_polygon_shapefile.shx or a_polygon_shapefile.SHX.Try --config SHAPE_RESTORE_SHX true to restore or create it
پاسخها (2)
۲۲ مهر ۱۴۰۴، ۱۱:۲۱
از نظر فنی، طبق کاغذ سفید (white paper) شکلفایل، صفحه 4، میتوانید کادر محاطی را فقط از فایل اصلی .shp به دست آورید. مقادیر کادر محاطی در بایتهای زیر در هدر فایل .shp قرار دارند.
۲۲ مهر ۱۴۰۴، ۱۲:۲۱
...
بایت 36 کادر محاطی Xmin Double Little
بایت 44 کادر محاطی Ymin Double Little
بایت 52 کادر محاطی Xmax Double Little
بایت 60 کادر محاطی Ymax Double Little
بایت 68* کادر محاطی Zmin Double Little
بایت 76* کادر محاطی Zmax Double Little
بایت 84* کادر محاطی Mmin Double Little
بایت 92* کادر محاطی Mmax Double Little
از سوی دیگر، همانطور که در نظرات اشاره شد، مگر اینکه دانش بیرونی درباره سیستم مختصات داشته باشید، که باید در فایل .prj موجود باشد، نمیتوانید از مقادیر کادر محاطی استفاده کنید.
اگر بدانید چگونه یک فایل باینری را بخوانید، مثلاً با برنامهنویسی C یا زبان دیگری، به راحتی میتوانید خود کادر محاطی را با استفاده از آفستهای بالا استخراج کنید.