专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

Geoserver发布oracle spatial遇到的图层预览报错问题

ins518 2024-10-17 13:13:23 技术文章 10 ℃ 0 评论

因为一直开发的内容都是基于内网的系统,所以常用的数据库是ORACLE。图形数据也是使用的Oracle Spatial。以前的开发也是很粗暴,直接使用SQL查询,将查询后的数据封装为WKT格式,前台使用Openlayers展示。展示效果如下。

但是在不断的迭代过程中,频繁的修改代码,代码量也越来越大。业务逻辑与图形展示频繁的穿插,后期维护越来越难,且需要前端去绘制每一个图元性能很差。

目前想的是将图形数据全部交给Geoserver来管理。

在使用geoserver发布oracle spatial过程中,出现了一些问题,这里记录一下。

背景

在数据库中原来的数据格式有两种,第一种是历史迁移过来的数据,这种数据 GTYPE=1或者GTPE=2;一种是后期新建生成的数据,这种数据GTYPE=2001或者GTYPE=2002;主要问题就出现在数据上。


1、下载geoserver,因为我主要是验证,所以我直接下载的Platform Independent Binary这种可以直接运行的包。

  • http://geoserver.org/release/stable/(下载页面)

同时需要下载oracle的扩展。我下载的geoserver版本是2.20.1

  • 然后将下载后的oracle扩展包 gt-jdbc-oracle-26.1.jar 、ojdbc8-19.10.0.0.jar 放入到 geoserver-2.20.1\webapps\geoserver\WEB-INF\lib 下。
  • 在geoserver-2.20.1\bin 下,启动startup.bat。

2、配置oracle数据源。

  • 本地访问 http://127.0.0.1:8080/geoserver/web/ ,登录 admin/geoserver。
  • 新建数据存储,填上相应的数据库信息。
  • 新建图层。选择对应的数据存储,选择对应的数据表,点击发布。图层详情页面计算一下边框,直接保存即可。
  • 在图层预览功能页面。找到生成的图层,点寂Openlayers,查看效果。


但是展示效果报错


java.lang.ArithmeticException: / by zero
        at org.geotools.data.oracle.sdo.SDO.coordinates(SDO.java:1712)
        at org.geotools.data.oracle.sdo.SDO.create(SDO.java:1880)

其实报错的原因就是因为数据库中旧数据的GTYPE=1或者GTYPE=2这种情况导致的。

  • 所以我们需要修改源码SDO.java文件。让它判断是旧数据的情况下,将GTYPE+2000。
// SDO.class create(GeometryFactory,int,int, double[],int[],double[]) 增加下面
  if(XGTYPE < 1000) {
     GTYPE = 2000 + XGTYPE;
  }
  • 将编译好的class放入到jar包中。
jar uvf gt-jdbc-oracle-26.1.jar org/geotools/data/oracle/sdo/SDO.class
  • 重新将jar包放入geoserver-2.20.1\webapps\geoserver\WEB-INF\lib下

再次预览图层

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表