Mais

O mosaico GeoWebCache falhou devido à exceção de topologia

O mosaico GeoWebCache falhou devido à exceção de topologia


Estou executando o GeoServer 2.8 WAR em uma máquina Ubuntu em Tomcat 7. Tenho o GeoWebCache integrado diretamente e ele armazena em cache e atende alguns blocos. No entanto, em algumas áreas, recebo erros quando tento visualizar o local ou propagar o cache. A parte relevante do log é a seguinte (o que sugere um erro de topologia):

2015-08-01 17: 40: 47.976 ERROR [geoserver.ows] - org.geoserver.platform.ServiceException: Falha no processo de renderização em org.geoserver.wms.map.RenderedImageMapOutputFormat.produceMap (RenderedImageMapOutputFormat.java:569) em org. geoserver.wms.map.RenderedImageMapOutputFormat.produceMap (RenderedImageMapOutputFormat.java:260) em org.geoserver.wms.map.RenderedImageMapOutputFormat.produceMap (RenderedImageMapOutputFormat.java.Map 504) em org.geoserver.wms.GetMap.run (GetMap.java:248) em org.geoserver.wms.GetMap.run (GetMap.java:119) em org.geoserver.wms.DefaultWebMapService.getMap (DefaultWebMapService.java : 320) em sun.reflect.GeneratedMethodAccessor282.invoke (Fonte desconhecida) em sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) em java.lang.reflect.Method.invoke (Method.java:606) em org. springframework.aop.support.AopUtils.invokeJoinpointUsingReflection (AopUtils.java:319) em org.springframework.aop.framewor k.ReflectiveMethodInvocation.invokeJoinpoint (ReflectiveMethodInvocation.java:183) em org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:150:32 em org.geoserver.kml.WebMapService.j344InvserviceInventory.kml.WebMapService) .springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:172) em org.geoserver.gwc.wms.CacheSeedingWebMapService.invoke (CacheSeedingWebMapService.java:62) em org.geoserverServiceService.java:62) em org.geoserver.gwc.wms.CacheSeedingWebMapService.invoke (CacheSeedingWebMapService.java:62. .java: 36) em org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:172) em org.geoserver.gwc.wms.CachingWebMapService.invoke (CachingWebMapService.java:80) em org.geoserver.gwerver. wms.CachingWebMapService.invoke (CachingWebMapService.java:55) em org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:172) em org.geoserver.ows.util.RequestObje ctLogger.invoke (RequestObjectLogger.java:55) em org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:172) em org.springframework.aop.framework.JdkDynamicAopProxy.invynvoke2 .sun.proxy. $ Proxy58.getMap (fonte desconhecida) em sun.reflect.GeneratedMethodAccessor235.invoke (fonte desconhecida) em sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) em java.loke.reflect.invoke (Method.java:606) em org.geoserver.ows.Dispatcher.execute (Dispatcher.java:841) em org.geoserver.ows.Dispatcher.handleRequestInternal (Dispatcher.java:275) em org.springframework.web.servlet. mvc.AbstractController.handleRequest (AbstractController.java:153) em org.geoserver.gwc.GWC.dispatchOwsRequest (GWC.java:1209) em org.geoserver.gwc.layer.GeoServerTileLayer.dispatchGetMap (GeoServidor) .geoserver.gwc.layer.GeoServerTileLayer.getMetatilingReponse (GeoServerTileLayer.java:569) em org.geoserver. gwc.layer.GeoServerTileLayer.seedTile (GeoServerTileLayer.java:764) em org.geowebcache.seed.SeedTask.doActionInternal (SeedTask.java:136) em org.geowebcache.seed.GWCTask.doAction (GWCT) .geowebcache.seed.MTSeeder.call (MTSeeder.java:36) em org.geowebcache.seed.MTSeeder.call (MTSeeder.java:25) em java.util.concurrent.FutureTask.run (FutureTask.java:262) em java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1145) em java.util.concurrent.ThreadPoolExecutor $.run (ThreadPoolExecutor.java:615) em java.lang.Thread.run (Thread.java:745) causada por: com.vividsolutions.jts.geom.TopologyException: encontrado intersecção não NodeD entre LINESTRING (-446792,34 6930399,07, -440903,77 6936464,74) e LINESTRING (-437.011,5849751517 6.937.523,641382978, -447860,88 6934195,51) [(-441.090,5017453493, 6.936.272,392257541, NaN)] em com.vividsolutions.jts.noding.FastNodingValidator.checkValid (FastNodingValidator.java:130) em com.vividsolutions.jts.geomgraph.EdgeNodingVali dator.checkValid (EdgeNodingValidator.java:94) em com.vividsolutions.jts.geomgraph.EdgeNodingValidator.checkValid (EdgeNodingValidator.java:59) em com.vividsolutions.jts.operation.overlay.OverlayOp.computeOverlay (OverlayOp.java:70 em com.vividsolutions.jts.operation.overlay.OverlayOp.getResultGeometry (OverlayOp.java:127) em com.vividsolutions.jts.operation.overlay.OverlayOp.overlayOp (OverlayOp.java:66) em com.vividsolutions.jts.operation .overlay.snap.SnapIfNeededOverlayOp.getResultGeometry (SnapIfNeededOverlayOp.java:96) em com.vividsolutions.jts.operation.overlay.snap.SnapIfNeededOverlayOp.overlayOp (SnapIfNeededOverlayOp.java:96) em com.vividsolutions.jts.operation.overlay.snap.SnapIfNeededOverlayOp.overlayOp (SnapIfNeededOverlayOputions.javavometryol:58 (Geometry.java:1423) em org.geotools.filter.function.StaticGeometry.difference (StaticGeometry.java:313) em org.geotools.filter.function.FilterFunction_difference.evaluate (FilterFunction_difference.java:66) em org.geotools. filter.expression.ExpressionAbstract.evaluate (ExpressionAbstract.java:65) em org.geotools. renderer.lite.StreamingRenderer.findGeometry (StreamingRenderer.java:2797) em org.geotools.renderer.lite.StreamingRenderer.access $ 100 (StreamingRenderer.java:178) em org.geotools.renderer.lite.StreamingRenderer $ RenderableFeature.get .java: 3100) em org.geotools.renderer.lite.StreamingRenderer.processSymbolizers (StreamingRenderer.java:2679) em org.geotools.renderer.lite.StreamingRenderer.process (StreamingRenderer.java:2585) em org.geotools.renderer. lite.StreamingRenderer.drawPlain (StreamingRenderer.java:2409) em org.geotools.renderer.lite.StreamingRenderer.processStylers (StreamingRenderer.java:2113) em org.geotools.renderer.lite.StreamingRenderer.paint (StreamingRenderer.java) em org.geoserver.wms.map.RenderedImageMapOutputFormat.produceMap (RenderedImageMapOutputFormat.java:539)

No entanto, ao investigar meus dados em PostGIS, ST_isValid e ST_IsValidReason, não retornei erros em todo o banco de dados. Portanto, no que diz respeito ao PostGIS, todos os meus dados são válidos. Além disso, a interseção não-acenada sempre parece estar na mesma linha, sugerindo uma autointerseção ou um auto toque. Quando identifico a linha individual usando trabalho de detetive a partir das coordenadas (estou usando um grupo de camadas e, infelizmente, os logs não me dizem qual conjunto de dados ou fornecem uma identificação de qual recurso o GWC acha que tem o erro). Eu verifico novamente o recurso específico no PostGIS e novamente, nenhum erro.

Alguém pode sugerir por que o GWC está chateado se PostGIS não consegue ver o erro. Este é um bug conhecido ou outra coisa? Sugestões de soluções para corrigi-lo seriam bem-vindas, pois ST_MakeValid é inútil se PosGIS achar que todos os dados já são válidos.


A razão pela qual não consegui encontrar nenhum erro nos dados do PostGIS parece ser porque não há nenhum. Então por que fez O GWC falha ao propagar o cache e relatar um erro de topologia? A resposta é porque eu estava usando um estilo que envolvia um buffer interno de alguns polígonos para obter um efeito de 'esmaecimento' graduado com uma transição de cor no traço. Como atualmente você não pode deslocar o traço da linha, você deve usar filtros ECQL na geometria. Isso funciona muito bem e produz um ótimo estilo quando ampliado, mas quando reduzido pode resultar em polígonos que se auto-cruzam. Esses polígonos de buffer existem apenas no que diz respeito ao renderizador, então, é claro, você não os encontrará em seus dados originais e não poderá encontrar nenhum erro. É bastante óbvio, agora que descobri, que esse seria o motivo. mas talvez valha a pena postar esta resposta caso alguém mais tenha uma situação 'desconcertante' semelhante.

A solução final foi (infelizmente) descartar meu lindo estilo e escolher algo muito menos atraente. Eu semi-falsifiquei o efeito criando um símbolo png de 1 pixel de largura, onde a metade superior da imagem era transparente (para que o efeito de fade-in comece na linha). Isso também funciona, mas não é tão bom.


Assista o vídeo: 7 Niesamowitych Narzędzi Do Układania Płytek