-
Notifications
You must be signed in to change notification settings - Fork 0
/
extractor.py
172 lines (117 loc) · 4.37 KB
/
extractor.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#enconding: utf-8
__author__ = 'Ariel Anthieni'
#Cargo librerias
from PIL import Image
from osgeo import gdal, osr
"""
Libreria de funciones para obtener datos de las imagenes raster
a partir de GDAL
"""
def GetExtent(gt,cols,rows):
""" Retorna la lista de corner para geotransform
@type gt: C{tuple/list}
@param gt: geotransform
@type cols: C{int}
@param cols: nro de columnas del dataset
@type rows: C{int}
@param rows: nro de filas del dataset
@rtype: C{[float,...,float]}
@return: coordenadas de los esquinas
"""
ext=[]
xarr=[0,cols]
yarr=[0,rows]
for px in xarr:
for py in yarr:
x=gt[0]+(px*gt[1])+(py*gt[2])
y=gt[3]+(px*gt[4])+(py*gt[5])
ext.append([x,y])
yarr.reverse()
return ext
def ReprojectCoords(coords,src_srs,tgt_srs):
""" Reprojecta una lista de cordenadas x,y
@type geom: C{tuple/list}
@param geom: Lista de [[x,y],...[x,y]] coordenadas
@type src_srs: C{osr.SpatialReference}
@param src_srs: OSR SpatialReference object
@type tgt_srs: C{osr.SpatialReference}
@param tgt_srs: OSR SpatialReference object
@rtype: C{tuple/list}
@return: Lista trasnformada [[x,y],...[x,y]] de coordenadas
"""
trans_coords=[]
transform = osr.CoordinateTransformation( src_srs, tgt_srs)
for x,y in coords:
x,y,z = transform.TransformPoint(x,y)
trans_coords.append([x,y])
return trans_coords
####DEVUELVE LOS DATOS DEL RASTER QUE SE PASA POR PARAMETRO###############
def dataraster(archivo):
"""
Analiza el archivo pasado por referencia para obtener los metadatos del mismo
:param archivo: ruta del archivo a analizar
:return: arreglo con metadatos
"""
#Generamos un diccionario para devolver los datos del Raster
resultado = {}
#Abrimos el archivo
datafile = gdal.Open(archivo)
#Datos de grid
cols = datafile.RasterXSize
rows = datafile.RasterYSize
bands = datafile.RasterCount
resultado["cols"] = str(cols)
resultado["rows"] = str(rows)
resultado["bands"] = str(bands)
#Obtener informacion Geografica
geoinformation = datafile.GetGeoTransform()
#Accedemos primero a la proyeccion en formato WKT
projInfo = datafile.GetProjection()
#Creamos el objeto espacial
spatialRef = osr.SpatialReference()
#Importamos el WKT al objeto espacial
spatialRef.ImportFromWkt(projInfo)
#Usamos ExportToProj4() metodo para devolver el estilo en string del objeto espacial
spatialRefProj = spatialRef.ExportToProj4()
srs = spatialRefProj
resultado["srs"] = str(srs)
#Generacion del extent
ext = GetExtent(geoinformation,cols,rows)
#generamos un objeto espacial
tgt_srs = spatialRef.CloneGeogCS()
geo_ext = ReprojectCoords(ext,spatialRef,tgt_srs)
#valores de la imagen
resultado["UL"] = str(geo_ext[0])
resultado["UR"] = str(geo_ext[3])
resultado["LR"] = str(geo_ext[2])
resultado["LL"] = str(geo_ext[1])
#valores del extent
resultado["CORNER_UL_LON_PRODUCT"] = str(geo_ext[0][0])
resultado["CORNER_UR_LON_PRODUCT"] = str(geo_ext[3][0])
resultado["CORNER_LR_LAT_PRODUCT"] = str(geo_ext[2][1])
resultado["CORNER_UL_LAT_PRODUCT"] = str(geo_ext[0][1])
return resultado
def generate_ql(source, destination, base_ancho = 180):
"""
Funcion que dimensiona un QL a partir de un jpg
:param source: ruta completa de donde se aloja el archivo jpg
:param destination: ruta completa de donde dejar el ql generado
:param base_ancho: ancho del ql generado en pixeles
:return: restona 0 si se realizo correctamente, 1 en caso contrario
"""
try:
#Reduzco la imagen para la miniatura
#Abrimos el archivo
img = Image.open(source)
#Calculamos el ancho conservando el aspecto
anchoPercent = (base_ancho / float(img.size[0]))
alto = int((float(img.size[1]) * float(anchoPercent)))
#Reduccion
img = img.resize((base_ancho,alto), Image.BILINEAR)
#guardamos imagen
img.save(destination)
print("Se genero la miniatura del archivo: " + source + "\n")
return 0
except:
print("ERROR [006]: No se ha podido generar el QL del archivo: " + source + "\n")
return 1