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 @ 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