WGS 1984 वेब मर्केटर (EPSG: 3857) को GDAL के साथ पायथन में


17

मैं GDAL का उपयोग करके अजगर में चूहों को खारिज कर रहा हूं। मुझे डब्ल्यूजीएस 1984 वेब मर्केटर (सहायक क्षेत्र) के लिए भौगोलिक डब्ल्यूजीएस 84 निर्देशांक से कई झगड़ों को प्रोजेक्ट करने की आवश्यकता है, ताकि ओपनवैलपर्स और हो सकता है कि Google मैप्स के साथ बाद में ओपनएल्लर में उनका उपयोग किया जा सके। मैं यहां से पायथन 2.7.5 और जीडीएएल 1.10.1 का उपयोग कर रहा हूं , और यहां से सलाह का उपयोग करके निर्देशांक बदल रहा हूं (मेरा कोड नीचे है)। संक्षेप में, मैंने osgeo.osr को आयात किया और ImportFromEPSG (कोड) और CoordinateTransformation (से, के लिए) का उपयोग किया

मैं सबसे पहले कोशिश की EPSG (32,629) जो UTM क्षेत्र 29 है और मिल गया यह अनुमान रेखापुंज (कम या ज्यादा ठीक), इसलिए कोड सही प्रतीत हो रहा है: utm तो फिर मैं इस्तेमाल किया EPSG (3857) क्योंकि मैंने पढ़ा है यह और इस सवाल और मिली यह सही हाल का वैध कोड है । लेकिन रेखापुंज बिल्कुल स्थानिक संदर्भ के साथ नहीं बनाया गया है। यह WGS 84 डेटा फ्रेम में बहुत दूर है (लेकिन अगर मैं वेब मर्केटर को डेटा फ़्रेम स्विच करता हूं तो यह ठीक होगा)। 3857

साथ EPSG (900913 का समर्थन करता) उत्पादन भूसंदर्भित, लेकिन उत्तर में 3 रेखापुंज कोशिकाओं के बारे में स्थानांतरित कर दिया है: 900913 का समर्थन करता

जब मैं का उपयोग कर रेखापुंज में पुनः प्रक्षेपित ArcGIS (WGS_1984_Web_Mercator_Auxiliary_Sphere में निर्यात) परिणाम लगभग ठीक है: ArcGIS

और जब मैं पुराने कोड 102113 (41001,54004) का उपयोग करता हूं तो परिणाम एकदम सही है: 54004

सभी कोड का उपयोग करके मेरे परीक्षणों का सारांश :

3857: far away up (missing georeference)
3785: far away up (like 3857)
3587: far away right
900913: slightly jumped up
102100: python error
102113: perfect
41001: perfect
54004: perfect
ArcGIS (web merc. aux.): good

तो मेरे सवाल हैं:

  • सही EPSG कोड मुझे गलत परिणाम क्यों देता है?
  • और क्यों पुराने कोड ठीक काम करते हैं, क्या वे पदावनत नहीं होते हैं?
  • शायद मेरा GDAL संस्करण अच्छा नहीं है या मेरे अजगर कोड में त्रुटियां हैं?

कोड:

    yres = round(lons[1]-lons[0], 4)  # pixel size, degrees
    xres = round(lats[1]-lats[0], 4)
    ysize = len(lats)-1  # number of pixels
    xsize = len(lons)-1
    ulx = round(lons[0], 4)
    uly = round(lats[-1], 4)  # last
    driver = gdal.GetDriverByName(fileformat)
    ds = driver.Create(filename, xsize, ysize, 2, gdal.GDT_Float32)  # 2 bands
    #--- Geographic ---
    srs = osr.SpatialReference()
    srs.ImportFromEPSG(4326)  # Geographic lat/lon WGS 84
    ds.SetProjection(srs.ExportToWkt())
    gt = [ulx, xres, 0, uly, 0, -yres]  # the affine transformation coeffs (ulx, pixel, angle(skew), uly, angle, -pixel)
    ds.SetGeoTransform(gt)  # coords of top left corner of top left pixel (w-file - center of the pixel!)
    outband = ds.GetRasterBand(1)
    outband.WriteArray(data)
    outband2 = ds.GetRasterBand(2)
    outband2.WriteArray(data3)
    #--- REPROJECTION ---
    utm29 = osr.SpatialReference()
#    utm29.ImportFromEPSG(32629)  # utm 29
    utm29.ImportFromEPSG(900913)  # web mercator 3857
    wgs84 = osr.SpatialReference()
    wgs84.ImportFromEPSG(4326)
    tx = osr.CoordinateTransformation(wgs84,utm29)
    # Get the Geotransform vector
    # Work out the boundaries of the new dataset in the target projection
    (ulx29, uly29, ulz29) = tx.TransformPoint(ulx, uly)  # corner coords in utm meters
    (lrx29, lry29, lrz29) = tx.TransformPoint(ulx + xres*xsize, uly - yres*ysize )
    filenameutm = filename[0:-4] + '_web.tif'
    dest = driver.Create(filenameutm, xsize, ysize, 2, gdal.GDT_Float32)
    xres29 = round((lrx29 - ulx29)/xsize, 2) # pixel size, utm meters
    yres29 = abs(round((lry29 - uly29)/ysize, 2))
    new_gt = [ulx29, xres29, 0, uly29, 0, -yres29]
    dest.SetGeoTransform(new_gt)
    dest.SetProjection(utm29.ExportToWkt())
    gdal.ReprojectImage(ds, dest, wgs84.ExportToWkt(), utm29.ExportToWkt(), gdal.GRA_Bilinear)
    dest.GetRasterBand(1).SetNoDataValue(0.0)
    dest.GetRasterBand(2).SetNoDataValue(0.0)
    dest = None  # Flush the dataset to the disk
    ds = None  # only after the reprojected!
    print 'Image Created'

यह कहने में मदद कर सकता है कि मैं क्या कहने जा रहा हूं, मैं EPSG: 3042 से Google मर्केटर एक में फिर से प्रोजेक्ट कर रहा हूं, मैंने 3857 सिद्धांत में सोचा था, लेकिन जब मैं कोशिश करता हूं: gdal_translate -a_srs EPSG: 3857 input.tif output.tif, आउटपुट बहुत दूर है (GDAL 1.11.2), सौभाग्य से जब उन्हें आर्कगिस 10.2 और WGS_1984_Web_Mercator_Auxiliary_Sphere (WKID: 3857 Authority: EPSG) का उपयोग करके ताना बाना सही जगह पर है। इसलिए, मेरा मानना ​​है कि GGAL के नवीनतम संस्करणों में EPSG: 3857 को ठीक से नहीं संभाला गया है।
वेब-जीआईएस उद्यमी

3
अस्वीकृति के बाद, रेखापुंज को अब एक आयत नहीं होना चाहिए। तो कोने निर्देशांक को फिर से खारिज करना गलत समाधान हो सकता है। क्या आपने कमांड लाइन पर गदलवारप की कोशिश की है? BTW आप gisinternals से नवीनतम GDAL संस्करण प्राप्त कर सकते हैं।
आंद्रे जे

जवाबों:


5

मैं फ़ाइलों के साथ पुनर्प्रकाशित करूंगा gdalwarp

मैंने EPSG: 3763 में फ़ाइलों के लिए वही किया है जो मैं EPSG: 3857 में बदलना चाहता हूं। मैंने क्यूजीआईएस और जियोसेवर का उपयोग करते हुए परिणामों की तुलना की और उत्पन्न चित्र ठीक थे। चूंकि छवियों के लिए एक छोटा रोटेशन लगाया जाता है, इसलिए आपको सीमा पर कुछ काली रेखाएं मिल सकती हैं (लेकिन बाद में इन पंक्तियों को पारदर्शी बनाया जा सकता है)।

चूंकि आपके पास कई tifछवियां हैं, आप इस तरह से एक स्क्रिप्ट का उपयोग कर सकते हैं जो किसी भी मौजूदा फ़ाइल को नहीं बदलता है, और उत्पन्न फ़ाइलों को 3857 नामक फ़ोल्डर में रखता है:

#!/bin/bash
mkdir 3857
for file in $(ls *.tif); do
    gdalwarp -s_srs EPSG:3763 -t_srs EPSG:3857 $file 3857/$file;
    listgeo -tfw 3857/$file;
done

यदि आप भी .twfफाइल जेनरेट करना चाहते हैं , तो मैंने जोड़ा है listgeo

यह स्क्रिप्ट लिनक्स के लिए है, लेकिन आप विंडोज के लिए कुछ ऐसा ही लिख सकते हैं।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.