Statistics
| Revision:

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