Details
Description
I have a PostGIS view that constructs lines from a series of points using the ST_makeline function. If the series of points happens to be a single point, GeoServer throws errors when the featuretype is requsted.
-------------- Example View that constructs a Linestring from a series of point geometries ---------
CREATE OR REPLACE VIEW v_vehicle_lines AS
SELECT obs.vehicleid, obs.obs_date, count(obs.vehicleid) AS obs_count, min(obs.datestamp) AS min_time, max(obs.datestamp) AS max_time, (max(obs.datestamp) - min(obs.datestamp))::time without time zone AS elapsed_time, st_makeline(obs.geom) AS route_geom
FROM ( SELECT v_truck_obs.vehicleid, v_truck_obs.datestamp, date_trunc('day'::text, v_truck_obs.datestamp) AS obs_date, v_truck_obs.geom
FROM v_truck_obs
ORDER BY v_truck_obs.datestamp) obs
GROUP BY obs.vehicleid, obs.obs_date
ORDER BY obs.vehicleid, obs.obs_date;
----- ERRORS thrown ----------
02 Jun 15:17:07 WARN [org.geoserver.ows] -
java.io.IOException
at org.vfny.geoserver.wms.responses.map.kml.KMZMapProducer.writeTo(KMZMapProducer.java:133)
at org.vfny.geoserver.wms.responses.GetMapResponse.writeTo(GetMapResponse.java:561)
at org.geoserver.ows.adapters.ResponseAdapter.write(ResponseAdapter.java:60)
at org.geoserver.ows.Dispatcher.response(Dispatcher.java:608)
at org.geoserver.ows.Dispatcher.handleRequestInternal(Dispatcher.java:192)
at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:139)
at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:44)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:684)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:625)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:392)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:347)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:459)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1054)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:264)
at org.acegisecurity.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:107)
at org.acegisecurity.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:72)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
at org.acegisecurity.ui.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:110)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
at org.acegisecurity.ui.basicauth.BasicProcessingFilter.doFilter(BasicProcessingFilter.java:178)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:229)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
at org.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:148)
at org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:98)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1045)
at org.vfny.geoserver.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1045)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:358)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:231)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:629)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:453)
at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:149)
at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:123)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:141)
at org.mortbay.jetty.Server.handle(Server.java:303)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:452)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:721)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:509)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:209)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:349)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:320)
at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:475)
Caused by: javax.xml.transform.TransformerException: Translator error
at org.geotools.xml.transform.TransformerBase.transform(TransformerBase.java:132)
at org.geotools.xml.transform.TransformerBase.transform(TransformerBase.java:107)
at org.vfny.geoserver.wms.responses.map.kml.KMZMapProducer.writeTo(KMZMapProducer.java:130)
... 46 more
Caused by: java.util.NoSuchElementException: Could not obtain the next feature:org.geotools.data.DataSourceException: An exception occurred while parsing WKB data
at org.geotools.data.store.FeatureReaderIterator.next(FeatureReaderIterator.java:67)
at org.geotools.feature.collection.DelegateFeatureIterator.next(DelegateFeatureIterator.java:54)
at org.geotools.data.crs.ForceCoordinateSystemIterator.next(ForceCoordinateSystemIterator.java:120)
at org.geotools.feature.collection.DelegateFeatureIterator.next(DelegateFeatureIterator.java:54)
at org.vfny.geoserver.wms.responses.map.kml.KMLVectorTransformer$KMLTranslator.encode(KMLVectorTransformer.java:266)
at org.vfny.geoserver.wms.responses.map.kml.KMLVectorTransformer$KMLTranslator.encode(KMLVectorTransformer.java:241)
at org.vfny.geoserver.wms.responses.map.kml.KMLTransformer$KMLTranslator.encodeVectorLayer(KMLTransformer.java:190)
at org.vfny.geoserver.wms.responses.map.kml.KMLTransformer$KMLTranslator.encode(KMLTransformer.java:126)
at org.geotools.xml.transform.TransformerBase$XMLReaderSupport.parse(TransformerBase.java:702)
at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:484)
at org.geotools.xml.transform.TransformerBase$Task.run(TransformerBase.java:295)
at org.geotools.xml.transform.TransformerBase.transform(TransformerBase.java:128)
... 48 more
Caused by: org.geotools.data.DataSourceException: An exception occurred while parsing WKB data
at org.geotools.data.postgis.attributeio.PgWKBAttributeIO.WKB2Geometry(PgWKBAttributeIO.java:113)
at org.geotools.data.postgis.attributeio.PgWKBAttributeIO.read(PgWKBAttributeIO.java:184)
at org.geotools.data.jdbc.QueryData.read(QueryData.java:212)
at org.geotools.data.jdbc.JDBCFeatureReader.readFeature(JDBCFeatureReader.java:107)
at org.geotools.data.jdbc.JDBCFeatureReader.next(JDBCFeatureReader.java:88)
at org.geotools.data.store.FeatureReaderIterator.next(FeatureReaderIterator.java:64)
... 59 more
Caused by: java.lang.IllegalArgumentException: point array must contain 0 or >1 elements
at com.vividsolutions.jts.geom.LineString.init(LineString.java:83)
at com.vividsolutions.jts.geom.LineString.<init>(LineString.java:74)
at com.vividsolutions.jts.geom.GeometryFactory.createLineString(GeometryFactory.java:470)
at com.vividsolutions.jts.io.WKBReader.readLineString(WKBReader.java:210)
at com.vividsolutions.jts.io.WKBReader.readGeometry(WKBReader.java:171)
at com.vividsolutions.jts.io.WKBReader.read(WKBReader.java:137)
at com.vividsolutions.jts.io.WKBReader.read(WKBReader.java:118)
at org.geotools.data.postgis.attributeio.PgWKBAttributeIO.WKB2Geometry(PgWKBAttributeIO.java:111)
... 64 more
-------------Work around-------------------
The errors can be avoided by creating a view that only returns Linestring geometries where the number of points is greater than 1, and basing then create the GeoServer featuretype using this view.
CREATE OR REPLACE VIEW geoserver.v_vehicle_trip AS
SELECT vehicleid, roi_id, vehicle_trip_no, num_obs, datestamp_start,
datestamp_end, geom
FROM v_vehicle_trip
WHERE ST_NumPoints("geom")>1;
Activity
| Field | Original Value | New Value |
|---|---|---|
| Status | Open [ 1 ] | Resolved [ 5 ] |
| Fix Version/s | 2.2.4 [ 19031 ] | |
| Resolution | Fixed [ 1 ] |
| Fix Version/s | 2.3-beta1 [ 18651 ] | |
| Fix Version/s | 2.2.4 [ 19031 ] |
| Status | Resolved [ 5 ] | Closed [ 6 ] |
My first reaction would be that the linestring is not actually valid compared to the simple feature model, so it's the data being broken, not the software... As you can see the error is thrown by JTS, so we'd have to convince Martin Davis to change its code and wait for a new JTS release... which may take another 6 months.
If the simple feature specification backs the idea that the linestring is valid nevertheless, it may be worth it, otherwise, it's probably not? What do you think?