अजीब सरणी को रेखापुंज में बदलने के बाद समन्वय करता है

Jan 03 2021

मेरे पास NumPy सरणी है और इसकी बाउंडिंग बॉक्स निर्देशांक है। मैंने इस उत्तर के आधार पर इसे रेखापुंज का उपयोग करके इसे रेखापुंज में बदलने की कोशिश की है , और इसने इसे रेखापुंज के रूप में सहेजा है, लेकिन जब मैं रेखापुंज का उपयोग करता हूं। निर्देशांक बहुत गलत हैं।

यह वह स्क्रिप्ट है जिसका मैंने उपयोग किया है:

bbox_coords_wgs84=[-101.7359960059834, 20.21904081937658, -100.5717967351885, 20.8312118894487]

#variables for the projection:
minx=bbox_coords_wgs84[0]
maxy=bbox_coords_wgs84[3]
pixel_size= 10

#according to the post on GIS SO:

import rasterio
from rasterio.transform import from_origin

transform=from_origin(minx,maxy,pixel_size,pixel_size)
crs_img='EPSG:4326'


with rasterio.open('test1.tif', 
                    'w',
                    driver='GTiff',
                    height=ndvi.shape[0],
                    width=ndvi.shape[1],
                    count=1,
                    dtype=ndvi.dtype,
                    crs=crs_img,
                    nodata=None, # change if data has nodata value
                    transform=transform) as dst:
        dst.write(ndvi, 1)
 
#display the results:

from matplotlib import pyplot
from rasterio.plot import show

src = rasterio.open('test1.tif')
show(src)

जैसा कि आप देख सकते हैं, संख्या बिल्कुल सही निर्देशांक नहीं हैं।

मेरा अंतिम लक्ष्य: WGS84 में सही ढंग से NumPy सरणी को पुन: उत्पन्न करने में सक्षम होना।

* इस पोस्ट करने के लिए भी संबंधित है इस पोस्ट

जवाब

2 gene Jan 03 2021 at 21:44

आप रिपोर्ट नहीं करते हैं कि यह आपके द्वारा उपयोग किए जाने वाले affine ट्रांसफ़ॉर्म के साथ एक NumPy सरणी का Reproject का एक सूट हैrasterio.transform.from_bounds

से rasterio.transform मॉड्यूल

rasterio.transform.from_bounds (पश्चिम, दक्षिण, पूर्व, उत्तर, चौड़ाई, ऊँचाई)
सीमा, चौड़ाई और ऊँचाई को देखते हुए एक रूपांतरण परिवर्तित करें।
एक जियोफेरेस्टेड रेखापुंज के लिए एक असरदार परिवर्तन लौटाएं, इसकी सीमाएं पश्चिम, दक्षिण, पूर्व, उत्तर और पिक्सल की संख्या में इसकी चौड़ाई और ऊंचाई को देखते हैं।

तथा

rasterio.transform.from_origin (पश्चिम, उत्तर, xsize, ysize)
ऊपरी बाएँ और पिक्सेल आकार में दिए गए एक Affine रूपांतरण लौटाएं।
इसके ऊपरी बाएं कोने के पश्चिम, उत्तर और पिक्सेल आकार xsize, ysize के निर्देशांक दिए गए एक भू-संदर्भित रेखापुंज के लिए एक Affine रूपांतरण लौटें।

यह एक ही चीज नहीं है और परिणाम अलग हैं

rasterio.transform.from_bounds( -101.7359960059834,20.21904081937658,-100.5717967351885,20.8312118894487,1103,2039)
Affine(0.0010554843796871222, 0.0, -101.7359960059834,
   0.0, -0.0003002310299519955, 20.8312118894487)

rasterio.transform.from_origin(-101.7359960059834,20.8312118894487,10,10)
Affine(10.0, 0.0, -101.7359960059834,
   0.0, -10.0, 20.8312118894487)

नया

बाउंड से रस्टर के चार कोने (चौड़ाई = 1103, ऊंचाई = 2039)

fig,ax = plt.subplots()
ax.plot(0,0,'ro')
ax.plot(1103,0,'bo')
ax.plot(0,2039,'go')
ax.plot(1103,2039,'co')
plt.show()

रूपान्तरण

 trans = rasterio.transform.from_bounds(-101.7359960059834,20.21904081937658-100.5717967351885,20.8312118894487,1103,2039)

 
trans*(0,0)
(-101.7359960059834, 20.8312118894487)
trans*(1103,0) 
(-100.5717967351885, 20.8312118894487)
trans*(0,2039) 
(-101.7359960059834, 20.21904081937658)
trans*(1103,2039)
(-100.5717967351885, 20.21904081937658)

fig,ax = plt.subplots()
ax.plot(*(trans*(0,0)),'ro')
ax.plot(*(trans*(1103,0)),'bo')
ax.plot(*(trans*(0,2039)),'go')
ax.plot(*(trans*(1103,2039)),'co')
plt.show()