gvsig-scripting / org.gvsig.scripting / trunk / org.gvsig.scripting / org.gvsig.scripting.app / org.gvsig.scripting.app.mainplugin / src / main / resources-plugin / scripting / lib / gvsig / utils.py @ 734
History | View | Annotate | Download (14 KB)
1 |
|
---|---|
2 |
import os |
3 |
import time |
4 |
import sys |
5 |
import StringIO |
6 |
import random |
7 |
|
8 |
from java.util.prefs import Preferences |
9 |
from java.awt import Color |
10 |
from java.io import File |
11 |
from java.lang import Throwable, RuntimeException |
12 |
|
13 |
from project import currentView, currentProject |
14 |
|
15 |
from org.gvsig.app import ApplicationLocator |
16 |
from org.gvsig.fmap.dal.feature import FeatureType |
17 |
from org.gvsig.fmap.mapcontext import MapContextLocator |
18 |
from org.gvsig.andami import Utilities |
19 |
from org.gvsig.fmap.crs import CRSFactory |
20 |
from org.gvsig.app.project.documents.table import TableManager |
21 |
from org.gvsig.fmap.geom import Geometry |
22 |
from org.gvsig.app.project.documents.view import DefaultViewDocument |
23 |
from org.gvsig.scripting.app.extension import ScriptingExtension |
24 |
|
25 |
LOGGER_INFO=ScriptingExtension.INFO |
26 |
LOGGER_WARN=ScriptingExtension.WARN |
27 |
LOGGER_ERROR=ScriptingExtension.ERROR |
28 |
|
29 |
|
30 |
def logger(msg, mode=LOGGER_INFO, ex=None): |
31 |
if ex == None: |
32 |
ScriptingExtension.log(mode,msg,None)
|
33 |
else:
|
34 |
tb = sys.exc_info()[2]
|
35 |
f = StringIO.StringIO() |
36 |
f.write("%s\n" % msg)
|
37 |
f.write("Traceback (most recent call last):\n")
|
38 |
while tb!=None: |
39 |
code = tb.tb_frame.f_code |
40 |
f.write(" File %r, line %d, %s\n" % (code.co_filename,tb.tb_frame.f_lineno,code.co_name))
|
41 |
tb = tb.tb_next |
42 |
f.write("%s\n" % str(ex)) |
43 |
f.getvalue() |
44 |
ScriptingExtension.log(mode,f.getvalue(),None)
|
45 |
|
46 |
|
47 |
def createFeatureType(schema = None): |
48 |
"""Returns attributes definition. If Schema is recived then makes a copy and
|
49 |
returns editable instance. Otherwise returns empty Schema.
|
50 |
:param schema: Schema to make a copy
|
51 |
:type schema: Schema
|
52 |
"""
|
53 |
if isinstance(schema, FeatureType): |
54 |
try:
|
55 |
s = schema.getCopy().getEditable() |
56 |
return s
|
57 |
except:
|
58 |
pass
|
59 |
|
60 |
application = ApplicationLocator.getManager() |
61 |
datamanager = application.getDataManager() |
62 |
return datamanager.createFeatureType()
|
63 |
|
64 |
createSchema = createFeatureType |
65 |
|
66 |
def createLayer(schema, servertype, layertype=None, **parameters): |
67 |
"""
|
68 |
Returns new layer
|
69 |
:param schema: layer data definition
|
70 |
:type schema: Schema
|
71 |
:param servertype:
|
72 |
:type servertype: string
|
73 |
:return: new layer
|
74 |
:rtype: Layer
|
75 |
:raise: RuntimeException
|
76 |
"""
|
77 |
if layertype == None: |
78 |
layertype = servertype |
79 |
servertype = "FilesystemExplorer"
|
80 |
|
81 |
if layertype == "Shape" : |
82 |
if schema.get("GEOMETRY",None) == None: |
83 |
raise RuntimeException("Shape need a field named GEOMETRY in the schema") |
84 |
|
85 |
if parameters["geometryType"] == None: |
86 |
raise RuntimeException("Invalid geometry type for new layer") |
87 |
|
88 |
try:
|
89 |
application = ApplicationLocator.getManager() |
90 |
datamanager = application.getDataManager() |
91 |
|
92 |
mapcontextmanager = application.getMapContextManager() |
93 |
|
94 |
server_parameters = datamanager.createServerExplorerParameters(servertype) |
95 |
copyToDynObject(parameters, server_parameters) |
96 |
|
97 |
server = datamanager.openServerExplorer(servertype, server_parameters) |
98 |
|
99 |
store_parameters = server.getAddParameters(layertype) |
100 |
copyToDynObject(parameters, store_parameters) |
101 |
store_parameters.setDefaultFeatureType(schema) |
102 |
|
103 |
server.add(layertype, store_parameters, True)
|
104 |
|
105 |
store = datamanager.openStore(layertype, store_parameters) |
106 |
|
107 |
layer = mapcontextmanager.createLayer(store.getName(), store) |
108 |
|
109 |
return layer
|
110 |
|
111 |
except Throwable, ex:
|
112 |
logger("Can't create layer of type %s, params=(%s), schema=%s " % (layertype,parameters,schema) , LOGGER_WARN, ex)
|
113 |
raise RuntimeException("Can't create layer") |
114 |
|
115 |
def loadShapeFile(shpFile, **parameters): |
116 |
"""
|
117 |
Add existing shape file to the view. Returns Layer shape file
|
118 |
:param shpFile: absolute file path
|
119 |
:type: shpFile: string
|
120 |
:param CRS: projection code
|
121 |
:type CRS: string
|
122 |
:param gvViewName: name of the view where to be loaded
|
123 |
:type gvViewName: string
|
124 |
:param gvLayerName: name of the layer inside gvsig
|
125 |
:type gvLayerName: string
|
126 |
:return: the shape
|
127 |
:type return: Layer
|
128 |
"""
|
129 |
if parameters.get("CRS",None)==None: |
130 |
try:
|
131 |
parameters["CRS"] = currentView().getProjectionCode()
|
132 |
except:
|
133 |
parameters["CRS"] = "EPSG:4326" |
134 |
parameters["shpFile"]=shpFile
|
135 |
layer = loadLayer('Shape', **parameters)
|
136 |
viewName = parameters.get("gvViewName",None) |
137 |
if viewName == None: |
138 |
view = currentView() |
139 |
elif isinstance(viewName, DefaultViewDocument): |
140 |
view = viewName |
141 |
else:
|
142 |
project = currentProject() |
143 |
view = project.getView(viewName) |
144 |
if view == None: |
145 |
raise RuntimeException("Can't get a view with name: "+str(viewName)) |
146 |
view.addLayer(layer) |
147 |
layer.setActive(False)
|
148 |
return layer
|
149 |
|
150 |
def loadRasterFile(filename, **parameters): |
151 |
parameters["uri"]= File(filename).toURI()
|
152 |
ext = os.path.splitext(filename) |
153 |
#if ext[1].lower() == ".jp2" or ext[1].lower()=="ecw":
|
154 |
# layer = loadLayer("Ermapper Store", **parameters)
|
155 |
#else:
|
156 |
# layer = loadLayer('Gdal Store', **parameters)
|
157 |
layer = loadLayer('Gdal Store', **parameters)
|
158 |
viewName = parameters.get("gvViewName",None) |
159 |
print "parameters:", parameters |
160 |
print viewName
|
161 |
if viewName == None: |
162 |
view = currentView() |
163 |
elif isinstance(viewName, DefaultViewDocument): |
164 |
view = viewName |
165 |
else:
|
166 |
project = currentProject() |
167 |
view = project.getView(viewName) |
168 |
if view == None: |
169 |
raise RuntimeException("Can't get a view with name: "+str(viewName)) |
170 |
view.addLayer(layer) |
171 |
layer.setActive(False)
|
172 |
return layer
|
173 |
|
174 |
def loadLayer(layerType, **parameters): |
175 |
try:
|
176 |
application = ApplicationLocator.getManager() |
177 |
datamanager = application.getDataManager() |
178 |
mapcontextmanager = application.getMapContextManager() |
179 |
store_parameters = datamanager.createStoreParameters(layerType) |
180 |
copyToDynObject(parameters, store_parameters) |
181 |
store = datamanager.openStore(layerType, store_parameters) |
182 |
layerName = parameters.get("gvLayerName", store.getName())
|
183 |
layer = mapcontextmanager.createLayer(layerName, store) |
184 |
except Throwable, ex:
|
185 |
logger("Can't load layer of type %s, params=(%s)" % (layerType,parameters) , LOGGER_WARN, ex)
|
186 |
raise RuntimeException("Can't load layer, "+ str(ex)) |
187 |
|
188 |
return layer
|
189 |
|
190 |
def createShape(definition, filename=None, geometryType=None, CRS=None, prefixname="tmpshp"): |
191 |
"""
|
192 |
Return new shape layer
|
193 |
:param definition: layer data definition
|
194 |
:type definition: Schema
|
195 |
:param filename: absolute path for shape files.
|
196 |
:type filename: string
|
197 |
:param geometryType: geometry type for shape
|
198 |
:type geometryType: string
|
199 |
:return: new shape layer
|
200 |
:rtype: Layer
|
201 |
"""
|
202 |
if CRS==None: |
203 |
try:
|
204 |
CRS = currentView().getProjectionCode() |
205 |
except:
|
206 |
CRS = "EPSG:4326"
|
207 |
if filename == None: |
208 |
filename = getTempFile(prefixname, ".shp")
|
209 |
geomattr = definition.getDefaultGeometryAttribute() |
210 |
if geomattr == None: |
211 |
raise RuntimeException("Can't create a shp without geometry attribute") |
212 |
if geometryType == None : |
213 |
geometryType = geomattr.getGeomType().getType() |
214 |
else:
|
215 |
if geometryType != geomattr.getGeomType().getType():
|
216 |
raise RuntimeException("Can't create a shp, geoemtry mismatch.") |
217 |
|
218 |
return createLayer(
|
219 |
definition, |
220 |
"FilesystemExplorer",
|
221 |
"Shape",
|
222 |
shpFile=filename, |
223 |
CRS=CRS, |
224 |
geometryType = geometryType |
225 |
) |
226 |
|
227 |
def createTable(schema, servertype, tableType=None, **parameters): |
228 |
"""Creates a new Table document"""
|
229 |
if tableType == None: |
230 |
tableType = servertype |
231 |
servertype = "FilesystemExplorer"
|
232 |
|
233 |
try:
|
234 |
application = ApplicationLocator.getManager() |
235 |
datamanager = application.getDataManager() |
236 |
|
237 |
server_parameters = datamanager.createServerExplorerParameters(servertype) |
238 |
copyToDynObject(parameters, server_parameters) |
239 |
|
240 |
server = datamanager.openServerExplorer(servertype, server_parameters) |
241 |
|
242 |
store_parameters = server.getAddParameters(tableType) |
243 |
copyToDynObject(parameters, store_parameters) |
244 |
store_parameters.setDefaultFeatureType(schema()) |
245 |
|
246 |
server.add(tableType, store_parameters, True)
|
247 |
|
248 |
store = datamanager.openStore(tableType, store_parameters) |
249 |
|
250 |
return store
|
251 |
|
252 |
except Throwable, ex:
|
253 |
logger("Can't create table of type %s, params=(%s), schema=%s." % (tableType,parameters,repr(schema)) , LOGGER_WARN, ex) |
254 |
raise RuntimeException("Can't create table, "+ str(ex)) |
255 |
|
256 |
def createDBF(definition, DbfFile=None, prefixname="tmpdbf", CRS="CRS:84"): |
257 |
"""
|
258 |
Creates a new dbf document
|
259 |
:param definition: layer data definition
|
260 |
:type definition: Schema
|
261 |
:param DbfFile: absolute path for shape files.
|
262 |
:type DbfFile: string
|
263 |
:return: new dbf
|
264 |
:rtype: Table
|
265 |
"""
|
266 |
if DbfFile == None: |
267 |
DbfFile = getTempFile(prefixname, ".dbf")
|
268 |
|
269 |
return createTable(
|
270 |
definition, |
271 |
"FilesystemExplorer",
|
272 |
"DBF",
|
273 |
DbfFile=DbfFile, |
274 |
CRS=CRS, |
275 |
) |
276 |
|
277 |
def loadTable(format, **parameters): |
278 |
|
279 |
try:
|
280 |
application = ApplicationLocator.getManager() |
281 |
datamanager = application.getDataManager() |
282 |
|
283 |
# Loding the data store
|
284 |
store_parameters = datamanager.createStoreParameters(format) |
285 |
copyToDynObject(parameters, store_parameters) |
286 |
store = datamanager.openStore(format, store_parameters) |
287 |
|
288 |
# Creating a Table document and initialize with the data store
|
289 |
project = currentProject() |
290 |
table = project().createDocument(TableManager.TYPENAME) |
291 |
table.setStore(store) |
292 |
table.setName(store.getName()) |
293 |
|
294 |
# Add the Table document to the project
|
295 |
project().addDocument(table) |
296 |
|
297 |
except Throwable, ex:
|
298 |
logger("Can't load table of type %s, params=(%s)" % (format,parameters) , LOGGER_WARN, ex)
|
299 |
raise RuntimeException("Can't load table, "+ str(ex)) |
300 |
|
301 |
return table
|
302 |
|
303 |
def loadDBF(dbffile): |
304 |
table = loadTable(format="DBF",DbfFile=dbffile)
|
305 |
return table
|
306 |
|
307 |
#=====================#
|
308 |
# Simbology Functions #
|
309 |
#=====================#
|
310 |
COLORS = { |
311 |
'black': Color.black,
|
312 |
'blue': Color.blue,
|
313 |
'cyan': Color.cyan,
|
314 |
'darkGray': Color.darkGray,
|
315 |
'gray': Color.gray,
|
316 |
'green': Color.green,
|
317 |
'lightGray': Color.lightGray,
|
318 |
'magenta': Color.magenta,
|
319 |
'orange': Color.orange,
|
320 |
'pink': Color.pink,
|
321 |
'red': Color.red,
|
322 |
'white': Color.white,
|
323 |
'yellow': Color.yellow,
|
324 |
} |
325 |
|
326 |
def simplePointSymbol(color=None): |
327 |
"""
|
328 |
Returns simple point symbol using parameter color. If no color
|
329 |
use a ramdom color
|
330 |
:param color: String color name or Java awt Color
|
331 |
:return: gvSIG point symbol
|
332 |
"""
|
333 |
if isinstance(color, str) and COLORS.has_key(color.lower()): |
334 |
color = COLORS.get(color) |
335 |
|
336 |
if not isinstance(color, Color): |
337 |
color = getDefaultColor() |
338 |
|
339 |
return MapContextLocator.getSymbolManager().createSymbol(
|
340 |
Geometry.TYPES.POINT, color) |
341 |
|
342 |
def simpleLineSymbol(color=None): |
343 |
"""
|
344 |
Returns simple line symbol using parameter color. If no color use a
|
345 |
ramdom color
|
346 |
:param color: String color name or Java awt Color
|
347 |
:return: gvSIG line symbol
|
348 |
|
349 |
"""
|
350 |
if isinstance(color, str) and COLORS.has_key(color.lower()): |
351 |
color = COLORS.get(color) |
352 |
|
353 |
if not isinstance(color, Color): |
354 |
color = getDefaultColor() |
355 |
|
356 |
return MapContextLocator.getSymbolManager().createSymbol(
|
357 |
Geometry.TYPES.CURVE, color) |
358 |
|
359 |
def simplePolygonSymbol(color = None): |
360 |
"""
|
361 |
Returns simple polygon symbol using parameter color. If no color
|
362 |
use a ramdom color.
|
363 |
:param color: String color name or Java awt Color
|
364 |
:return: gvSIG polygon symbol
|
365 |
"""
|
366 |
if isinstance(color, str) and COLORS.has_key(color.lower()): |
367 |
color = COLORS.get(color) |
368 |
|
369 |
if not isinstance(color, Color): |
370 |
color = getDefaultColor() |
371 |
|
372 |
return MapContextLocator.getSymbolManager().createSymbol(
|
373 |
Geometry.TYPES.SURFACE, color) |
374 |
|
375 |
|
376 |
#=========================================#
|
377 |
# gvSIG Application Preferences Functions #
|
378 |
#=========================================#
|
379 |
|
380 |
def getDataFolder(): |
381 |
"""
|
382 |
Returns gvSIG data folder. This folder is defined in application
|
383 |
preferences. If is not defined returns None.
|
384 |
"""
|
385 |
return Preferences.userRoot().node("gvsig.foldering").get('DataFolder', None) |
386 |
|
387 |
def getProjectsFolder(): |
388 |
"""
|
389 |
Returns gvSIG projects folder. This folder is defined in application
|
390 |
preferences. If is not defined returns None.
|
391 |
"""
|
392 |
return Preferences.userRoot().node("gvsig.foldering").get( |
393 |
'ProjectsFolder', None) |
394 |
|
395 |
def getColorFromRGB(r, g, b, a=None): |
396 |
"""
|
397 |
Returns an sRGB color with the specified red, green, blue, and alpha
|
398 |
(optional) values in the range (0 - 255).
|
399 |
"""
|
400 |
if a:
|
401 |
color = Color(r, g, b, a) |
402 |
else:
|
403 |
color = Color(r, g, b) |
404 |
|
405 |
return color
|
406 |
|
407 |
def getDefaultColor(): |
408 |
"""Returns gvsig default symbol fill color or ramdom color"""
|
409 |
if MapContextLocator.getMapContextManager().isDefaultSymbolFillColorAleatory():
|
410 |
color = Color(random.randint(0, 255), |
411 |
random.randint(0, 255), |
412 |
random.randint(0, 255) |
413 |
) |
414 |
else:
|
415 |
sp = MapContextLocator.getSymbolManager().getSymbolPreferences() |
416 |
color = sp.getDefaultSymbolFillColor() |
417 |
|
418 |
return color
|
419 |
|
420 |
#================#
|
421 |
# OTHER #
|
422 |
#================#
|
423 |
|
424 |
def getCRS(crs): |
425 |
"""Returns Projection from string code (i.e. CRS:84) if exist or None if
|
426 |
not.
|
427 |
"""
|
428 |
try:
|
429 |
return CRSFactory.getCRS(crs)
|
430 |
except:
|
431 |
return None |
432 |
|
433 |
def copyToDynObject(values, target): |
434 |
keys = values.keys() |
435 |
definition = target.getDynClass(); |
436 |
fields = definition.getDynFields(); |
437 |
for field in fields: |
438 |
name = field.getName() |
439 |
for k in keys: |
440 |
if k.lower() == name.lower():
|
441 |
value = values[name] |
442 |
target.setDynValue(name, value) |
443 |
break
|
444 |
# ====================================
|
445 |
#
|
446 |
|
447 |
"""
|
448 |
def cloneShape(layer, target=None, expresion = None, sortby="", asc=True):
|
449 |
if target==None:
|
450 |
# una capa temporal en el temp de andami
|
451 |
#...
|
452 |
else:
|
453 |
targetfile = File(target)
|
454 |
if targetfile.isAbsolute():
|
455 |
#La guardamos ahi mismo
|
456 |
else:
|
457 |
# Al temp de andami con ese nombre.
|
458 |
|
459 |
# Crear la nueva capa
|
460 |
|
461 |
return newLayer
|
462 |
"""
|
463 |
|
464 |
def getTempFile(name, ext, tempdir=None): |
465 |
if tempdir==None: |
466 |
tempdir = Utilities.TEMPDIRECTORYPATH |
467 |
if not os.path.isdir(tempdir): |
468 |
os.makedirs(tempdir) |
469 |
t = time.time() |
470 |
f = os.path.join( |
471 |
tempdir, |
472 |
"%s-%x%x%s" % (name,t,(t-int(t)) * 10000,ext) |
473 |
) |
474 |
return f
|