gpt4 book ai didi

java - 将 Saxon 与 GeoTools 结合使用

转载 作者:行者123 更新时间:2023-12-01 10:00:01 25 4
gpt4 key购买 nike

我正在尝试让一个项目使用 GeoTools 运行,并具有使用 Saxonica 的依赖项。到目前为止,还没有运气

项目pom.xml依赖项:

<dependencies>
<dependency>
<groupId>org.auscope.portal</groupId>
<artifactId>portal-core</artifactId>
<version>${portal.core.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-main</artifactId>
<version>14.2</version>
</dependency>
</dependencies>

portal-core pom.xml 相关依赖项:

<dependency>
<groupId>net.sf.saxon</groupId>
<artifactId>saxon-xom</artifactId>
<version>8.7</version>
</dependency>
<dependency>
<groupId>net.sf.saxon</groupId>
<artifactId>saxon-xpath</artifactId>
<version>8.7</version>
<optional>false</optional>
</dependency>
<dependency>
<groupId>net.sf.saxon</groupId>
<artifactId>saxon-dom</artifactId>
<version>8.7</version>
<optional>false</optional>
</dependency>

SLDController.java代码:

StyleFactory styleFactory = CommonFactoryFinder.getStyleFactory(null);

StyledLayerDescriptor sld = styleFactory.createStyledLayerDescriptor();
sld.setName("example");
sld.setAbstract("Example Style Layer Descriptor");
UserLayer layer = styleFactory.createUserLayer();
layer.setName("layer");

FeatureTypeConstraint constraint = styleFactory.createFeatureTypeConstraint("Feature", Filter.INCLUDE, null);

layer.layerFeatureConstraints().add(constraint);

Style style = styleFactory.createStyle();

style.getDescription().setTitle("Style");
style.getDescription().setAbstract("Definition of Style");

layer.userStyles().add(style);
sld.layers().add(layer);

SLDTransformer styleTransform = new SLDTransformer();
String xml = styleTransform.transform(sld);

堆栈跟踪:

net.sf.saxon.trans.XPathException: The SAX2 parser org.geotools.xml.transform.TransformerBase$XMLReaderSupport does not support setting the 'namespaces' feature to true
net.sf.saxon.event.Sender.configureParser(Sender.java:562)
net.sf.saxon.event.Sender.sendSAXSource(Sender.java:313)
net.sf.saxon.event.Sender.send(Sender.java:152)
net.sf.saxon.IdentityTransformer.transform(IdentityTransformer.java:39)
org.geotools.xml.transform.TransformerBase$Task.run(TransformerBase.java:300)
org.geotools.xml.transform.TransformerBase.transform(TransformerBase.java:133)
org.geotools.xml.transform.TransformerBase.transform(TransformerBase.java:121)
org.geotools.xml.transform.TransformerBase.transform(TransformerBase.java:162)
org.auscope.portal.server.web.controllers.SLDController.getOilAndGasStyle(SLDController.java:53)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:601)
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:177)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:446)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:434)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.springframework.web.filter.ShallowEtagHeaderFilter.doFilterInternal(ShallowEtagHeaderFilter.java:82)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

我猜这个问题可以使用 Maven 解决,但我有点迷失了。如何确保我的项目为 GeoTools 使用正确的 XSLT 处理器,同时不破坏门户核心依赖项的配置?

最佳答案

嗯,堆栈跟踪中的消息准确地告诉您出了什么问题:

SAX2 解析器 org.geotools.xml.transform.TransformerBase$XMLReaderSupport 不支持将“命名空间”功能设置为 true

Saxon 默认情况下使用 JAXP 工厂机制获取 SAX2 解析器,并且它找到的解析器属于 geotools 项目。

SAX2 规范规定:“所有 XMLReader 都需要支持将 http://xml.org/sax/features/namespaces 设置为 true”,但似乎此特定 XMLReader 不允许此设置,结果是 Saxon 无法使用此解析器。

可能有各种解决方法,但设计一种方法需要一些地理工具知识,而我当然不具备这些知识。例如,我不知道手头的任务是否真的需要这个解析器,或者是否需要一个不同的解析器。

堆栈跟踪还显示 geotools 正在尝试进行身份转换,并且正在使用 Saxon 来实现此目的。它可能会通过使用 JAXP 工厂机制来加载类路径上的任何变压器。这是一个糟糕的策略:如果您要使用 JAXP 机制来加载身份转换器,那么您应该首先测试您的代码以检查它是否适用于最常见的代码。通过设置相关的 JAXP 系统属性,可以说服地理工具使用不同的身份转换器。

关于java - 将 Saxon 与 GeoTools 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36880701/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com