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