2012-01-13 7 views
5

मैं जीडीएएल पुस्तकालय का उपयोग कर रहा हूं। वर्तमान में, मैं ऊपरी बाएं बिंदु और ऊपरी दाएं बिंदु में ले सकता हूं और मूल से बाहर एक छवि चिपका सकता हूं। मैं अब क्या करना चाहता हूं, दो डब्लूकेटी पॉइंट्स में ले जाता है और एक्स, वाई समन्वय को एक ही चीज़ करने के लिए परिवर्तित करता है। मैं बस सोच रहा था कि क्या ऐसा करना संभव था अगर मुझे जियोट्रांसफॉर्म पता था और यह किस समन्वय प्रणाली का उपयोग कर रहा था (डब्लूजीएस 84)?यदि आपके पास एक जियोटीफ है, तो क्या यह एक एक्स/वाई को एक लेट/लॉन प्वाइंट को बदलने के लिए संभव होगा, जो GeoTransform का उपयोग कर रहा है?

+0

अधिक जानकारी होनी चाहिए:

नोट यह भी उतना ही आसान है बदलने उलटा स्थापित करने के लिए मैं वर्तमान में GeoTransform का उपयोग कर एक एक्स, वाई को लेट/लॉन में बदल सकता है। – avtoader

उत्तर

0

मैंने कुछ नमूना अक्षांश/अक्षांश की गणना करने के लिए छवि के लिए एफ़िन ट्रांसफॉर्म का उपयोग किया। मेरी एकमात्र समस्या यह थी कि यदि छवि उत्तर का सामना कर रही है, तो geoTransform [2] और geTransform [4] को लेट/लॉन की गणना करते समय शून्य आउट करने की आवश्यकता है।

x = (int)Math.Abs(Math.Round((Latitude - geotransform[0])/geotransform[1]));
y = (int)Math.Abs(Math.Round((Longitude - geotransform[3])/geotransform[5]));

आप इसे जानवर बल करना चाहता था, तो आप निम्न कर सकता है (मैं इस किया था और यह काम किया, लेकिन यह सिर्फ स्यूडोकोड है):

//Get the Pixel for the length and width, this portion is for the full image
pixelXSize = AbsoluteValue((latitudeAt(Zero)-(latitudeAt(Length)-1))/imageLength);
pixelYSize = AbsoluteValue((longitudeAt(Zero)-(LongitudeAt(Width)-1))/imageWidth);

//Calculate the x,y conversion for the points you want to calculate
x = AbsoluteValue((latitudeToConvert-latitudeAt(Zero))/pixelXSize);
y = AbsoluteValue((longitudeToConvert-longitudteAt(Zero))/pixelYSize);

इस उत्तर एक के बाद बंद हो सकता है या दो पिक्सेल। यदि आप एक geotransform का उपयोग कर रहे हैं, तो फिर उत्तर फ़ेसिंग चर वापस लौटाए गए उत्तर को गड़बड़ कर सकते हैं। अब तक, मैंने केवल उत्तर की छवियों के लिए इसका परीक्षण किया है।

+1

मुझे लगता है कि यहां मेरा प्रश्न गैर-उत्तर वाली छवियों को संभालने का तरीका होगा। – avtoader

4

मैं इससे पहले भी इसमें भाग गया, और यहां समन्वय परिवर्तन करने का एक अच्छा पर्याप्त तरीका है। GDAL documentation से

नोट:

समन्वय प्रणाली GDALDataset :: GetProjectionRef() का वर्णन करता है भू-संदर्भित affine भू-संदर्भ से गर्भित निर्देशांक GDALDataset :: GetGeoTransform() द्वारा दिया बदलने से लौट आए।

हम इसका उपयोग करने के लिए OGRCoordinateTransformation के साथ इसका उपयोग कर सकते हैं।

मूल रूप से कोड कुछ इस तरह दिखेगा:

// Load up some dataset. 
dataset = (GDALDataset *) GDALOpen(mapfile, GA_ReadOnly); 

// Define Geographic coordinate system - set it to WGS84. 
OGRSpatialReference *poSRS_Geog = new OGRSpatialReference(); 
poSRS_Geog->importFromEPSG(4326); // WGS84 

// Define Projected coordinate system - set to the GeoTransform. 
const char *sProj = dataset->GetProjectionRef(); 
OGRSpatialReference *poSRS_Proj = new OGRSpatialReference(sProj); 

// Set up the coordinate transform (geographic-to-projected). 
OGRCoordinateTransformation *poCT_Geog2Proj; 
poCT_Geog2Proj = OGRCreateCoordinateTransformation(poSRS_Geog, poSRS_Proj); 

// Now everything is set up and we set transforming coordinates! 
// Pass Lon/Lat coordinates to the Transform function: 
double x = lon; 
double y = lat; 
poCT_Geog2Proj->Transform(1, &x, &y); 

// Now x and y variables will contain the X/Y pixel coordinates. 

है कि कैसे आप देशांतर/अक्षांश और पिक्सेल निर्देशांकों के बीच में बदल सकते हैं। ध्यान दें कि आप Transform() के साथ सरणी का उपयोग कर सकते हैं, और एकाधिक निर्देशांक एक साथ परिवर्तित कर सकते हैं। पहला तर्क रूपांतरण के लिए समन्वय जोड़े की संख्या है, और दूसरे और तीसरे तर्क एक्स और वाई के पॉइंटर्स हैं। मैं बस एक जोड़ी को बदलता हूं।

// Set up the coordinate transform (projected-to-geographic). 
OGRCoordinateTransformation *poCT_Proj2Geog; 
poCT_Proj2Geog = OGRCreateCoordinateTransformation(poSRS_Proj, poSRS_Geog); 
0

मैं इस विधि का उपयोग: लंबे समय तक

void transformCoordinatesEPSG(OGRGeometry &geometry,int from, int to) { 
    OGRSpatialReference srcSpatialReference; 
    OGRErr error = srcSpatialReference.importFromEPSG(from); 

    #ifdef __OGRTRANSFORMDEBUG 
     qDebug() << "Import EPSG " << from << "return " << error; 
    #endif 

    OGRSpatialReference dstSpatialReference; 
    error = error | dstSpatialReference.importFromEPSG(to); 

    #ifdef __OGRTRANSFORMDEBUG 
    qDebug() << "Import EPSG " << to << "return " << error; 
    #endif 

    OGRCoordinateTransformation* coordTrans = OGRCreateCoordinateTransformation(&srcSpatialReference, &dstSpatialReference); 
    geometry.transform(coordTrans); 
} 

अक्षांश/के लिए 4326.

संबंधित मुद्दे

 संबंधित मुद्दे