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
|