Más

Error de ordenamiento en teselas de GeoWebCache debido a una excepción de topología

Error de ordenamiento en teselas de GeoWebCache debido a una excepción de topología


Estoy ejecutando GeoServer 2.8 WAR en una máquina Ubuntu en Tomcat 7. Tengo GeoWebCache integrado directamente y almacena en caché y sirve algunos mosaicos. Sin embargo, en algunas áreas obtengo errores cuando intento ver la ubicación o inicializar el caché. La parte relevante del registro es la siguiente (lo que sugiere un error de topología):

2015-08-01 17: 40: 47,976 ERROR [geoserver.ows] - org.geoserver.platform.ServiceException: El proceso de representación falló en org.geoserver.wms.map.RenderedImageMapOutputFormat.produceMap (RenderedImageMapOutputFormat.java:569) en org. geoserver.wms.map.RenderedImageMapOutputFormat.produceMap (RenderedImageMapOutputFormat.java:260) en org.geoserver.wms.map.RenderedImageMapOutputFormat.produceMap (RenderedImageMapOutputFormat.java:132) en Get.geoserverjavams. 504) en org.geoserver.wms.GetMap.run (GetMap.java:248) en org.geoserver.wms.GetMap.run (GetMap.java:119) en org.geoserver.wms.DefaultWebMapService.getMap (DefaultWebMapService.java : 320) en sun.reflect.GeneratedMethodAccessor282.invoke (Fuente desconocida) en sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) en java.lang.reflect.Method.invoke (Method.java:606) en org. springframework.aop.support.AopUtils.invokeJoinpointUsingReflection (AopUtils.java:319) en org.springframework.aop.framewor k.ReflectiveMethodInvocation.invokeJoinpoint (ReflectiveMethodInvocation.java:183) en org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:150) en org.geoserver.kmcepl.WebInterml. .springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:172) en org.geoserver.gwc.wms.CacheSeedingWebMapService.invoke (CacheSeedingWebMapService.java:62) en org.geosbvoeding.gwedingc.Weap. .java: 36) en org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:172) en org.geoserver.gwc.wms.CachingWebMapService.invoke (CachingWebMapService.java:80) en org.geoserver:80 wms.CachingWebMapService.invoke (CachingWebMapService.java:55) en org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:172) en org.geoserver.ows.util.RequestObje ctLogger.invoke (RequestObjectLogger.java:55) en org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:172) en org.springframework.aop.framework.JdkDynamicAopProxy.Djaop .sun.proxy. $ Proxy58.getMap (Fuente desconocida) en sun.reflect.GeneratedMethodAccessor235.invoke (Fuente desconocida) en sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) en java.lang.reflect.Methods (Method.java:606) en org.geoserver.ows.Dispatcher.execute (Dispatcher.java:841) en org.geoserver.ows.Dispatcher.handleRequestInternal (Dispatcher.java:275) en org.springframework.web.servlet. mvc.AbstractController.handleRequest (AbstractController.java:153) en org.geoserver.gwc.GWC.dispatchOwsRequest (GWC.java:1209) en org.geoserver.gwc.layer.GeoServerTileLayer.dispatchGetMap (GeoServer25.javaLayer:6 .geoserver.gwc.layer.GeoServerTileLayer.getMetatilingReponse (GeoServerTileLayer.java:569) en org.geoserver. gwc.layer.GeoServerTileLayer.seedTile (GeoServerTileLayer.java:764) en org.geowebcache.seed.SeedTask.doActionInternal (SeedTask.java:136) en org.geowebcache.seed.GWCTask. .geowebcache.seed.MTSeeder.call (MTSeeder.java:36) en org.geowebcache.seed.MTSeeder.call (MTSeeder.java:25) en java.util.concurrent.FutureTask.run (FutureTask.java:262) en java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1145) en java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:615) en java.lang.Thread.run (Thread.java:7 Causado por: com.vividsolutions.jts.geom.TopologyException: se encontró una intersección sin nudos entre LINESTRING (-446792.34 6930399.07, -440903.77 6936464.74) y LINESTRING (-437011.5849751517 6937523.641382978, -44194460.8190) 691741382978, -44194410.8190) en com.vividsolutions.jts.noding.FastNodingValidator.checkValid (FastNodingValidator.java:130) en com.vividsolutions.jts.geomgraph.EdgeNodingVali dator.checkValid (EdgeNodingValidator.java:94) en com.vividsolutions.jts.geomgraph.EdgeNodingValidator.checkValid (EdgeNodingValidator.java:59) en com.vividsolutions.jts.operation.overlay.OverlayOp.computeOverjava. en com.vividsolutions.jts.operation.overlay.OverlayOp.getResultGeometry (OverlayOp.java:127) en com.vividsolutions.jts.operation.overlay.OverlayOp.overlayOp (OverlayOp.java:66) en com.vividsolutions.jts.operation .overlay.snap.SnapIfNeededOverlayOp.getResultGeometry (SnapIfNeededOverlayOp.java:96) en com.vividsolutions.jts.operation.overlay.snap.SnapIfNeededOverlayOp.overlayOp (SnapIfNeededOverlay58Op.javats.javats. (Geometry.java:1423) en org.geotools.filter.function.StaticGeometry.difference (StaticGeometry.java:313) en org.geotools.filter.function.FilterFunction_difference.evaluate (FilterFunction_difference.java:66) en org.geotools. filter.expression.ExpressionAbstract.evaluate (ExpressionAbstract.java:65) en org.geotools. renderer.lite.StreamingRenderer.findGeometry (StreamingRenderer.java:2797) en org.geotools.renderer.lite.StreamingRenderer.access $ 100 (StreamingRenderer.java:178) en org.geotools.renderer.lite.StreamingRenderer $ RenderableFeature.getShaperer .java: 3100) en org.geotools.renderer.lite.StreamingRenderer.processSymbolizers (StreamingRenderer.java:2679) en org.geotools.renderer.lite.StreamingRenderer.process (StreamingRenderer.java:2585) en org.geotools.renderer. lite.StreamingRenderer.drawPlain (StreamingRenderer.java:2409) en org.geotools.renderer.lite.StreamingRenderer.processStylers (StreamingRenderer.java:2113) en org.geotools.renderer.lite.StreamingRenderer.paint (StreamingRenderer.java:8 en org.geoserver.wms.map.RenderedImageMapOutputFormat.produceMap (RenderedImageMapOutputFormat.java:539)

Sin embargo, cuando investigo mis datos en PostGIS, ST_isValid y ST_IsValidReason, no devuelvo errores en toda la base de datos. Entonces, en lo que respecta a PostGIS, todos mis datos son válidos. Además, la intersección sin nudos siempre parece estar en la misma línea, lo que sugiere una intersección o un toque personal. Cuando identifico la línea individual usando trabajo de detective a partir de las coordenadas (estoy usando un grupo de capas y, lamentablemente, los registros no me dicen qué conjunto de datos ni dan una identificación de qué característica GWC cree que tiene el error). Vuelvo a verificar la función específica en PostGIS y nuevamente, no hay error.

¿Alguien puede sugerir por qué GWC está molesto si PostGIS no puede ver el error? ¿Es este un error conocido o algo más? Las sugerencias de soluciones para solucionarlo serían bienvenidas, ya que ST_MakeValid no tiene sentido si PosGIS cree que todos los datos ya son válidos.


La razón por la que no pude encontrar ningún error en los datos en PostGIS parece ser porque no hay ninguno. Entonces por qué hizo ¿GWC no puede inicializar la caché e informar un error de topología? La respuesta es porque estaba usando un estilo que involucraba un búfer interno de algunos polígonos para obtener un efecto de "aparición gradual" graduado con una transición de color en el trazo. Dado que actualmente no puede compensar el trazo de la línea, debe usar filtros ECQL en la geometría. Esto funciona muy bien y produce un gran estilo cuando se acerca, pero cuando se aleja, puede resultar en polígonos que se intersecan. Estos polígonos de búfer solo existen en lo que respecta al renderizador, por lo que, por supuesto, no los encontrará en sus datos originales y no podrá encontrar ningún error. Es bastante obvio, ahora que lo he descubierto, que esta sería la razón. pero tal vez valga la pena publicar esta respuesta en caso de que alguien más tenga una situación 'desconcertante' similar.

La solución definitiva fue (lamentablemente) deshacerme de mi estilo bonito e ir con algo mucho menos atractivo. Simulté el efecto creando un símbolo png de 1 píxel de ancho, donde la mitad superior de la imagen era transparente (de modo que el efecto de aparición gradual comienza en la línea). Esto también funciona, pero no es tan bueno.


Ver el vídeo: Orden Topológico