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