gvsig-scripting / org.gvsig.scripting / trunk / org.gvsig.scripting / org.gvsig.scripting.app / org.gvsig.scripting.app.mainplugin / src / main / resources-plugin / scripting / scripts / examples / vectorial_data / 04_add_geometry_info.py @ 462
History | View | Annotate | Download (3.07 KB)
1 |
from gvsig import currentLayer |
---|---|
2 |
from geom import POINT, LINE, POLYGON |
3 |
from commonsdialog import msgbox |
4 |
|
5 |
def main(): |
6 |
"""
|
7 |
Modify layer data definition and adds new fields to store features geometry
|
8 |
information.
|
9 |
If is points layer type adds 'X' 'Y' and 'Z' coordinates
|
10 |
If is lines layer type adds perimeter value
|
11 |
IF is polygons layer adds Area and perimeter values
|
12 |
"""
|
13 |
#
|
14 |
#Invoke gvsig.currentLayer function to get active layer
|
15 |
#If not view or active layer in view raise RuntimeException
|
16 |
layer = gvsig.currentLayer() |
17 |
|
18 |
# Gets layer type. If layer type is not supported shows a message, else
|
19 |
# adds geometry information to features
|
20 |
layertype = layer.getTypeVectorLayer() |
21 |
if layertype.isSubTypeOf(POINT):
|
22 |
addInfoToPoint(layer) |
23 |
elif layertype.isSubTypeOf(LINE):
|
24 |
addInfoToLine(layer) |
25 |
elif layertype.isSubTypeOf(POLYGON):
|
26 |
addInfoToPolygon(layer) |
27 |
else:
|
28 |
text = """This layer is not supported.
|
29 |
Layer type must be:
|
30 |
- Points
|
31 |
- Line
|
32 |
- Polygon
|
33 |
Finish script."""
|
34 |
title = "Warning",
|
35 |
messageType = commonsdialog.FORBIDEN |
36 |
commonsdialog.msgbox(text , |
37 |
title, |
38 |
messageType |
39 |
) |
40 |
|
41 |
def addToPoint(layer): |
42 |
layer.edit() |
43 |
schema = layer.getSchema() |
44 |
xName=generateUniqColumnName(schema,"X")
|
45 |
schema.append(xName, "Double", size=15, precision = 3) |
46 |
yName=generateUniqColumnName(schema,"Y")
|
47 |
schema.append(yName, "Double", size=15, precision = 3) |
48 |
zName=generateUniqColumnName(schema,"Z")
|
49 |
schema.append(zName, "Double", size=15, precision = 3) |
50 |
layer.updateSchema(schema) |
51 |
|
52 |
for feature in layer.features(): |
53 |
feature.edit() |
54 |
point = feature.geometry() |
55 |
feature.set(xName,point.getX()) |
56 |
feature.set(yName,point.getY()) |
57 |
if point.getDimension()>2: |
58 |
feature.set(zName,point.getCoordinateAt(2))
|
59 |
layer.update(feature) |
60 |
|
61 |
layer.commit() |
62 |
|
63 |
|
64 |
def addInfoToPolygon(layer): |
65 |
layer.edit() |
66 |
schema = layer.getSchema() |
67 |
areaName=generateUniqColumnName(schema,"Area")
|
68 |
schema.append(areaName, "Double", size=15, precision = 3) |
69 |
perimeterName=generateUniqColumnName(schema,"Perimeter")
|
70 |
schema.append(perimeterName, "Double", size=15, precision = 3) |
71 |
|
72 |
layer.updateSchema(schema) |
73 |
|
74 |
for feature in layer.features(): |
75 |
feature.edit() |
76 |
polygon = feature.geometry() |
77 |
feature.set(areaName,polygon.area()) |
78 |
feature.set(perimeterName,polygon.perimeter()) |
79 |
|
80 |
layer.update(feature) |
81 |
|
82 |
def addInfoToLine(layer): |
83 |
layer.edit() |
84 |
schema = layer.getSchema() |
85 |
perimeterName=generateUniqColumnName(schema,"Perimeter")
|
86 |
schema.append(perimeterName, "Double", size=15, precision = 3) |
87 |
|
88 |
layer.updateSchema(schema) |
89 |
|
90 |
for feature in layer.features(): |
91 |
feature.edit() |
92 |
line = feature.geometry() |
93 |
feature.set(perimeterName,line.perimeter()) |
94 |
|
95 |
layer.update(feature) |
96 |
|
97 |
layer.commit() |
98 |
|
99 |
def generateUniqColumnName(schema, name): |
100 |
cont = 1
|
101 |
name2 = name |
102 |
while True: |
103 |
attr = schema.get(name2) |
104 |
if attr == None: |
105 |
return name2
|
106 |
cont += 1
|
107 |
name2 = "%s%s" % (name , cont)
|