svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.app / org.gvsig.app.mainplugin / src / main / resources-plugin / scripting / scripts / validatelayer / validate_layer.py @ 47547
History | View | Annotate | Download (7.02 KB)
1 |
# encoding: utf-8
|
---|---|
2 |
|
3 |
from gvsig import * |
4 |
from org.gvsig.tools.swing.api.windowmanager import WindowManager |
5 |
import StringIO |
6 |
from gvsig.commonsdialog import * |
7 |
from javax.swing.event import HyperlinkListener |
8 |
from org.gvsig.fmap.geom import GeometryLocator |
9 |
from org.gvsig.fmap.geom import Geometry |
10 |
from org.gvsig.fmap.geom.primitive import NullGeometry |
11 |
from org.gvsig.tools import ToolsLocator |
12 |
|
13 |
class Cmdline(object): |
14 |
def __init__(self, line): |
15 |
self.parse(line)
|
16 |
|
17 |
def parse(self,line): |
18 |
cmds = line.split(";")
|
19 |
self.cmds = list() |
20 |
for cmd in cmds: |
21 |
cmd = cmd.strip() |
22 |
args = None
|
23 |
n = cmd.find(":")
|
24 |
if n> 0 : |
25 |
args = cmd[n+1:].strip()
|
26 |
cmd = cmd[:n].strip() |
27 |
self.cmds.append((cmd,args))
|
28 |
|
29 |
def execute(self): |
30 |
for cmd,args in self.cmds: |
31 |
method = getattr(self,cmd,None) |
32 |
try:
|
33 |
if method!=None: |
34 |
method(args) |
35 |
else:
|
36 |
self.call(cmd,args)
|
37 |
except Exception, ex: |
38 |
print "Oopss algo fallo ejecutando ", cmd, args |
39 |
print str(ex) |
40 |
|
41 |
def centerViewinPoint(view,center): |
42 |
env = view.getMap().getViewPort().getEnvelope(); |
43 |
movX = center.getX()-env.getCenter(0);
|
44 |
movY = center.getY()-env.getCenter(1);
|
45 |
minx = env.getMinimum(0) + movX;
|
46 |
miny = env.getMinimum(1) + movY;
|
47 |
maxX = env.getMaximum(0) + movX;
|
48 |
maxY = env.getMaximum(1) + movY;
|
49 |
env = GeometryLocator.getGeometryManager().createEnvelope( |
50 |
minx, miny, |
51 |
maxX, maxY, |
52 |
Geometry.SUBTYPES.GEOM2D); |
53 |
view.getMap().getViewPort().setEnvelope(env); |
54 |
view.getMap().invalidate() |
55 |
|
56 |
|
57 |
class MyHyperlinkListener(HyperlinkListener, Cmdline): |
58 |
def __init__(self,vista, capa, tabla_de_referencias): |
59 |
self.vista = vista
|
60 |
self.capa = capa
|
61 |
self.tabla_de_referencias = tabla_de_referencias
|
62 |
|
63 |
def hyperlinkUpdate(self, h): |
64 |
if str(h.getEventType()) == "ACTIVATED": |
65 |
# Solo procesamos los eventos "ACTIVATED" que son los clicks sobre los enlaces
|
66 |
# Recogemos la geometria que metimos en el enalce en WKT
|
67 |
cmdline = h.getDescription() |
68 |
#print cmdline
|
69 |
self.parse(cmdline)
|
70 |
self.execute()
|
71 |
|
72 |
def select(self,arg): |
73 |
ref = self.tabla_de_referencias.get(arg,None) |
74 |
self.capa.getSelection().select(ref)
|
75 |
|
76 |
def clearSelection(self,arg): |
77 |
self.capa.getSelection().deselectAll()
|
78 |
|
79 |
def center(self,arg): |
80 |
# Reconstruimos el punto a partir del WKT en arg
|
81 |
manager = GeometryLocator.getGeometryManager() |
82 |
point = manager.createFrom(arg) |
83 |
# Y una vez lo tenemos centramos la vista en ese punto.
|
84 |
centerViewinPoint(self.vista,point)
|
85 |
|
86 |
def fixgeometry(self,arg): |
87 |
ref = self.tabla_de_referencias.get(arg,None) |
88 |
feature = ref.getFeature().getEditable() |
89 |
geom = feature.getDefaultGeometry() |
90 |
if geom.isValid():
|
91 |
return
|
92 |
fixedgeom = geom.makeValid() |
93 |
if fixedgeom != None: |
94 |
if isinstance(fixedgeom,NullGeometry) : |
95 |
fixedgeom = None
|
96 |
feature.setDefaultGeometry(fixedgeom) |
97 |
store = self.capa().getDataStore()
|
98 |
if not store.isEditing() : |
99 |
store.edit() |
100 |
store.update(feature) |
101 |
|
102 |
|
103 |
def main(*args): |
104 |
validate(None)
|
105 |
|
106 |
def validate(taskStatus): |
107 |
layer = currentLayer() |
108 |
if layer == None: |
109 |
msgbox(u"Deberá seleccionar la capa que desea validar")
|
110 |
return
|
111 |
if taskStatus == None: |
112 |
taskStatusManager = ToolsLocator.getTaskStatusManager() |
113 |
taskStatus = taskStatusManager.createDefaultSimpleTaskStatus("validate")
|
114 |
taskStatus.setAutoremove(True)
|
115 |
|
116 |
output1 = StringIO.StringIO() |
117 |
output2 = StringIO.StringIO() |
118 |
output1.write("<ul>\n")
|
119 |
output2.write("<ul>\n")
|
120 |
contador=0
|
121 |
tabla_de_referencias = dict()
|
122 |
contador_problemas = 0
|
123 |
contador_nulos = 0
|
124 |
try:
|
125 |
# A�adimos la barra de progreso a la barra de estado de gvSIG
|
126 |
taskStatus.add() |
127 |
# Le indicamos cuantas iteraciones vamos a realizar
|
128 |
taskStatus.setRangeOfValues(0,layer.features().getCount());
|
129 |
for feature in layer.features(): |
130 |
# En cada iteracion informamos a la barra de progreso de por donde vamos
|
131 |
taskStatus.setCurValue(contador) |
132 |
geom = feature.geometry() |
133 |
if geom == None: |
134 |
contador_nulos += 1
|
135 |
tabla_de_referencias[str(contador)]= feature().getReference()
|
136 |
output2.write("<li>")
|
137 |
output2.write('<a href="select: %s">%5.5d</a> %s<br>%s' % (
|
138 |
contador, |
139 |
contador, |
140 |
feature.toString(), |
141 |
"Null geometry"
|
142 |
) |
143 |
) |
144 |
output2.write("</li>")
|
145 |
else:
|
146 |
vs = geom.getValidationStatus(); |
147 |
if not vs.isValid() : |
148 |
tabla_de_referencias[str(contador)]= feature().getReference()
|
149 |
contador_problemas += 1
|
150 |
if vs.getStatusCode() == 1 : # Corrupta |
151 |
try:
|
152 |
print contador, geom.getNumVertices(), geom.__class__
|
153 |
except Exception,ex: |
154 |
print contador
|
155 |
|
156 |
geom2 = geom.makeValid() |
157 |
if geom2 != None: |
158 |
canfix = '(<a href="fixgeometry: %s">Fix</a>)' % contador
|
159 |
else:
|
160 |
canfix = ""
|
161 |
if vs.getProblemLocation()!=None: |
162 |
wktgeom = vs.getProblemLocation().convertToWKT() |
163 |
else:
|
164 |
try:
|
165 |
# Atrapamos los errores no vaya a ser que la geometria este tan da�ada que
|
166 |
# nos falle el calculo de su centroide.
|
167 |
wktgeom = feature.geometry().centroid().convertToWKT() |
168 |
except:
|
169 |
wktgeom = None
|
170 |
output1.write("<li>")
|
171 |
if wktgeom == None: |
172 |
output1.write('<a href="select: %s">%5.5d</a> %s<br>%s %s' % (
|
173 |
contador, |
174 |
contador, |
175 |
feature.toString(), |
176 |
vs.getMessage(), |
177 |
canfix |
178 |
) |
179 |
) |
180 |
else:
|
181 |
output1.write('<a href="clearSelection; select: %s; center: %s">%5.5d</a> %s<br>%s %s' % (
|
182 |
contador, |
183 |
wktgeom, |
184 |
contador, |
185 |
feature.toString(), |
186 |
vs.getMessage(), |
187 |
canfix |
188 |
) |
189 |
) |
190 |
output1.write("</li>")
|
191 |
contador+=1
|
192 |
finally:
|
193 |
# Al terminar
|
194 |
# Le indicamos a la barra de progreso que ya hemos terminado
|
195 |
taskStatus.terminate() |
196 |
# Y la eliminamos de la barra de estado de gvSIG.
|
197 |
taskStatus.remove() |
198 |
|
199 |
output1.write("</ul>\n")
|
200 |
output2.write("</ul>\n")
|
201 |
|
202 |
if contador_problemas>0 or contador_nulos>0 : |
203 |
texto = "<p>Se ha detectado:<br><ul><li>%s geometrias con problemas</li><li>%s registros sin geometria.</li></ul></p>" % (
|
204 |
contador_problemas, |
205 |
contador_nulos |
206 |
) |
207 |
if contador_problemas > 0: |
208 |
texto += "Geometrias con problemas:<br>"
|
209 |
texto += output1.getvalue() |
210 |
if contador_nulos > 0: |
211 |
texto += "Registros sin geometrias:<br>"
|
212 |
texto += output2.getvalue() |
213 |
application = ApplicationLocator.getManager() |
214 |
application.showTextDialog( |
215 |
WindowManager.MODE.TOOL, # TOOL o WINDOW segun nos interese.
|
216 |
"Problems in layer "+layer.getName(),
|
217 |
texto, |
218 |
MyHyperlinkListener(currentView(), layer, tabla_de_referencias) |
219 |
) |
220 |
else:
|
221 |
msgbox("Layer "+layer.getName()+" is valid.") |
222 |
|
223 |
|