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 / 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)