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