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_2_3_0 / utils.py @ 624

History | View | Annotate | Download (12.4 KB)

1

    
2
import os
3
import time
4

    
5
from java.util.prefs import Preferences
6
from java.awt import Color
7
from java.io import File
8
from java.lang import Throwable, RuntimeException
9

    
10
from project import currentView, currentProject
11

    
12
from org.gvsig.app import ApplicationLocator
13
from org.gvsig.fmap.dal.feature import FeatureType
14
from org.gvsig.fmap.mapcontext import MapContextLocator
15
from org.gvsig.andami import Utilities
16
from org.gvsig.fmap.crs import CRSFactory
17
from org.gvsig.app.project.documents.table import TableManager
18

    
19
def createFeatureType(schema = None):
20
  """Returns attributes definition. If Schema is recived then makes a copy and
21
  returns editable instance. Otherwise returns empty Schema.
22
  :param schema: Schema to make a copy
23
  :type schema: Schema
24
  """
25
  if isinstance(schema, FeatureType):
26
    try:
27
      s = schema.getCopy().getEditable()
28
      return s
29
    except:
30
      pass
31

    
32
  application = ApplicationLocator.getManager()
33
  datamanager =  application.getDataManager()
34
  return datamanager.createFeatureType()
35

    
36
createSchema = createFeatureType
37

    
38
def createLayer(schema, servertype, layertype=None, **parameters):
39
  """
40
  Returns new layer
41
  :param schema: layer data definition
42
  :type schema: Schema
43
  :param servertype:
44
  :type servertype: string
45
  :return: new layer
46
  :rtype: Layer
47
  :raise: RuntimeException
48
  """
49
  if layertype == None:
50
    layertype = servertype
51
    servertype = "FilesystemExplorer"
52

    
53
  if layertype == "Shape" :
54
    if schema.get("GEOMETRY",None) == None:
55
      raise RuntimeException("Shape need a field named GEOMETRY in the schema")
56

    
57
  if parameters["geometryType"] == None:
58
    raise RuntimeException("Invalid geometry type for new layer")
59

    
60
  try:
61
    application = ApplicationLocator.getManager()
62
    datamanager =  application.getDataManager()
63

    
64
    mapcontextmanager = application.getMapContextManager()
65

    
66
    server_parameters = datamanager.createServerExplorerParameters(servertype)
67
    copyToDynObject(parameters, server_parameters)
68

    
69
    server = datamanager.openServerExplorer(servertype, server_parameters)
70

    
71
    store_parameters = server.getAddParameters(layertype)
72
    copyToDynObject(parameters, store_parameters)
73
    store_parameters.setDefaultFeatureType(schema)
74

    
75
    server.add(layertype, store_parameters, True)
76

    
77
    store = datamanager.openStore(layertype, store_parameters)
78

    
79
    layer = mapcontextmanager.createLayer(store.getName(), store)
80

    
81
    return layer
82

    
83
  except Throwable, ex:
84
    raise RuntimeException("Can't create layer")#+ str(ex))
85

    
86
def loadShapeFile(shpFile, **parameters):
87
    """
88
    Add existing shape file to the view. Returns Layer shape file
89
    :param shpFile: absolute file path
90
    :type: shpFile: string
91
    :param CRS: projection code
92
    :type CRS: string
93
    :param gvViewName: name of the view where to be loaded
94
    :type gvViewName: string
95
    :param gvLayerName: name of the layer inside gvsig
96
    :type gvLayerName: string
97
    :return: the shape
98
    :type return: Layer
99
    """
100
    if parameters.get("CRS",None)==None:
101
        try:
102
            parameters["CRS"] = currentView().getProjectionCode()
103
        except:
104
            parameters["CRS"] = "EPSG:4326"
105
    parameters["shpFile"]=shpFile
106
    layer = loadLayer('Shape', **parameters)
107
    viewName = parameters.get("gvViewName",None)
108
    if viewName == None:
109
      view = currentView()
110
    else:
111
      project = currentProject()
112
      view = project.getView(viewName)
113
      if view == None:
114
               raise RuntimeException("Can't get view with name '"+viewName+"'") #+ str(ex))
115
    view.addLayer(layer)
116
    layer.setActive(False)
117
    return layer
118

    
119
def loadRasterFile(filename, **parameters):
120
    parameters["uri"]= File(filename).toURI()
121
    ext = os.path.splitext(filename)
122
    #if ext[1].lower() == ".jp2" or ext[1].lower()=="ecw":
123
    #  layer = loadLayer("Ermapper Store", **parameters)
124
    #else:
125
    #  layer = loadLayer('Gdal Store', **parameters)
126
    layer = loadLayer('Gdal Store', **parameters)
127
    viewName = parameters.get("gvViewName",None)
128
    if viewName == None:
129
        view = currentView()
130
    else:
131
        project = currentProject()
132
        view = project.getView(viewName)
133
        if view == None:
134
            raise RuntimeException("Can't get view with name '"+viewName+"', "+ str(ex))
135
    view.addLayer(layer)
136
    layer.setActive(False)
137
    return layer
138

    
139
def loadLayer(layerType, **parameters):
140
    try:
141
        application = ApplicationLocator.getManager()
142
        datamanager =  application.getDataManager()
143
        mapcontextmanager = application.getMapContextManager()
144
        store_parameters = datamanager.createStoreParameters(layerType)
145
        copyToDynObject(parameters, store_parameters)
146
        store = datamanager.openStore(layerType, store_parameters)
147
        layerName = parameters.get("gvLayerName", store.getName())
148
        layer = mapcontextmanager.createLayer(layerName, store)
149
    except Throwable, ex:
150
        raise RuntimeException("Can't load layer, "+ str(ex))
151

    
152
    return layer
153

    
154
def createShape(definition, filename=None, geometryType=None, CRS=None, prefixname=None):
155
  """
156
  Return new shape layer
157
  :param definition: layer data definition
158
  :type definition: Schema
159
  :param filename: absolute path for shape files.
160
  :type filename: string
161
  :param geometryType: geometry type for shape
162
  :type geometryType: string
163
  :return: new shape layer
164
  :rtype: Layer
165
  """
166
  if CRS==None:
167
    try:
168
        CRS = currentView().getProjectionCode()
169
    except:
170
        CRS = "EPSG:4326"
171
  if filename == None:
172
      if prefixname==None:
173
            filename = getTempFile("tmpshp", ".shp")
174
      elif isinstance(prefixname,str):
175
            filename = getTempFile(prefixname, ".shp")
176
  geomattr = definition.getDefaultGeometryAttribute()
177
  if geomattr == None:
178
    raise RuntimeException("Can't create a shp without geometry attribute")
179
  if geometryType == None :
180
    geometryType = geomattr.getGeomType().getType()
181
  else:
182
    if geometryType != geomattr.getGeomType().getType():
183
      raise RuntimeException("Can't create a shp, geoemtry mismatch.")
184

    
185
  return createLayer(
186
    definition,
187
    "FilesystemExplorer",
188
    "Shape",
189
    shpFile=filename,
190
    CRS=CRS,
191
    geometryType = geometryType
192
  )
193

    
194
def createTable(schema, servertype, tableType=None, **parameters):
195
  """Creates a new Table document"""
196
  if tableType == None:
197
    tableType = servertype
198
    servertype = "FilesystemExplorer"
199

    
200
  try:
201
    application = ApplicationLocator.getManager()
202
    datamanager =  application.getDataManager()
203

    
204
    server_parameters = datamanager.createServerExplorerParameters(servertype)
205
    copyToDynObject(parameters, server_parameters)
206

    
207
    server = datamanager.openServerExplorer(servertype, server_parameters)
208

    
209
    store_parameters = server.getAddParameters(tableType)
210
    copyToDynObject(parameters, store_parameters)
211
    store_parameters.setDefaultFeatureType(schema())
212

    
213
    server.add(tableType, store_parameters, True)
214

    
215
    store = datamanager.openStore(tableType, store_parameters)
216

    
217
    return store
218

    
219
  except Throwable, ex:
220
    raise RuntimeException("Can't create table, "+ str(ex))
221

    
222
def createDBF(definition, DbfFile, CRS="CRS:84"):
223
  """
224
  Creates a new dbf document
225
  :param definition: layer data definition
226
  :type definition: Schema
227
  :param DbfFile: absolute path for shape files.
228
  :type DbfFile: string
229
  :return: new dbf
230
  :rtype: Table
231
  """
232
  return createTable(
233
    definition,
234
    "FilesystemExplorer",
235
    "DBF",
236
    DbfFile=DbfFile,
237
    CRS=CRS,
238
  )
239

    
240
def loadTable(format, **parameters):
241

    
242
    try:
243
        application = ApplicationLocator.getManager()
244
        datamanager =  application.getDataManager()
245

    
246
        # Loding the data store
247
        store_parameters = datamanager.createStoreParameters(format)
248
        copyToDynObject(parameters, store_parameters)
249
        store = datamanager.openStore(format, store_parameters)
250

    
251
        # Creating a Table document and initialize with the data store
252
        project = currentProject()
253
        table = project().createDocument(TableManager.TYPENAME)
254
        table.setStore(store)
255
        table.setName(store.getName())
256

    
257
        # Add the Table document to the project
258
        project().addDocument(table)
259

    
260
    except Throwable, ex:
261
        raise RuntimeException("Can't load table, "+ str(ex))
262

    
263
    return table
264

    
265
def loadDBF(dbffile):
266
      table = loadTable(format="DBF",DbfFile=dbffile)
267
      return table
268

    
269
#=====================#
270
# Simbology Functions #
271
#=====================#
272
COLORS = {
273
    'black': Color.black,
274
    'blue': Color.blue,
275
    'cyan': Color.cyan,
276
    'darkGray': Color.darkGray,
277
    'gray': Color.gray,
278
    'green': Color.green,
279
    'lightGray': Color.lightGray,
280
    'magenta': Color.magenta,
281
    'orange': Color.orange,
282
    'pink': Color.pink,
283
    'red': Color.red,
284
    'white': Color.white,
285
    'yellow': Color.yellow,
286
}
287

    
288
def simplePointSymbol(color=None):
289
  """
290
  Returns simple point symbol using parameter color. If no color
291
  use a ramdom color
292
  :param color: String color name or Java awt Color
293
  :return: gvSIG point symbol
294
  """
295
  if isinstance(color, str) and COLORS.has_key(color.lower()):
296
    color = COLORS.get(color)
297

    
298
  if not isinstance(color, Color):
299
      color = getDefaultColor()
300

    
301
  return MapContextLocator.getSymbolManager().createSymbol(
302
        Geometry.TYPES.POINT, color)
303

    
304
def simpleLineSymbol(color=None):
305
  """
306
  Returns simple line symbol using parameter color. If no color use a
307
  ramdom color
308
  :param color: String color name or Java awt Color
309
  :return: gvSIG line symbol
310

311
  """
312
  if isinstance(color, str) and COLORS.has_key(color.lower()):
313
    color = COLORS.get(color)
314

    
315
  if not isinstance(color, Color):
316
      color = getDefaultColor()
317

    
318
  return MapContextLocator.getSymbolManager().createSymbol(
319
        Geometry.TYPES.CURVE, color)
320

    
321
def simplePolygonSymbol(color = None):
322
  """
323
  Returns simple polygon symbol using parameter color. If no color
324
  use a ramdom color.
325
  :param color: String color name or Java awt Color
326
  :return: gvSIG polygon symbol
327
  """
328
  if isinstance(color, str) and COLORS.has_key(color.lower()):
329
    color = COLORS.get(color)
330

    
331
  if not isinstance(color, Color):
332
      color = getDefaultColor()
333

    
334
  return MapContextLocator.getSymbolManager().createSymbol(
335
        Geometry.TYPES.SURFACE, color)
336

    
337

    
338
#=========================================#
339
# gvSIG Application Preferences Functions #
340
#=========================================#
341

    
342
def getDataFolder():
343
  """
344
  Returns gvSIG data folder. This folder is defined in application
345
  preferences. If is not defined returns None.
346
  """
347
  return Preferences.userRoot().node("gvsig.foldering").get('DataFolder', None)
348

    
349
def getProjectsFolder():
350
  """
351
  Returns gvSIG projects folder. This folder is defined in application
352
  preferences. If is not defined returns None.
353
  """
354
  return Preferences.userRoot().node("gvsig.foldering").get(
355
        'ProjectsFolder', None)
356

    
357
def getColorFromRGB(r, g, b, a=None):
358
  """
359
  Returns an sRGB color with the specified red, green, blue, and alpha
360
  (optional) values in the range (0 - 255).
361
  """
362
  if a:
363
    color = Color(r, g, b, a)
364
  else:
365
    color = Color(r, g, b)
366

    
367
  return color
368

    
369
def getDefaultColor(c = None):
370
  """Returns gvsig default symbol fill color or ramdom color"""
371
  if MapContextLocator.getSymbolManager().isDefaultSymbolFillColorAleatory():
372
    color = Color(random.randint(0-255),
373
                random.randint(0-255),
374
                random.randint(0-255)
375
            )
376
  else:
377
    sp = MapContextLocator.getSymbolManager().getSymbolPreferences()
378
    color = sp.getDefaultSymbolFillColor()
379

    
380
  return color
381

    
382
#================#
383
# OTHER          #
384
#================#
385

    
386
def getCRS(crs):
387
  """Returns Projection from string code (i.e. CRS:84) if exist or None if
388
  not.
389
  """
390
  try:
391
    return CRSFactory.getCRS(crs)
392
  except:
393
    return None
394

    
395
def copyToDynObject(values, target):
396
  definition = target.getDynClass();
397
  fields = definition.getDynFields();
398
  for field in fields:
399
    name = field.getName()
400
    keys = values.keys()
401
    for k in keys:
402
      if k.lower() == name.lower():
403
        target.setDynValue(name, values[name])
404
        break
405
# ====================================
406
#
407

    
408
"""
409
def cloneShape(layer, target=None, expresion = None, sortby="", asc=True):
410
  if target==None:
411
    #  una capa temporal en el temp de andami
412
    #...
413
  else:
414
    targetfile = File(target)
415
    if targetfile.isAbsolute():
416
      #La guardamos ahi mismo
417
    else:
418
     # Al temp de andami con ese nombre.
419

420
  # Crear la nueva capa
421

422
  return newLayer
423
"""
424

    
425
def getTempFile(name, ext):
426
    tempdir = Utilities.TEMPDIRECTORYPATH
427
    if not os.path.isdir(tempdir):
428
      os.makedirs(tempdir)
429
    t = time.time()
430
    f = os.path.join(
431
      tempdir,
432
      "%s-%x%x%s" % (name,t,(t-int(t)) * 10000,ext)
433
    )
434
    return f