GDAL的java环境配置以及将shp转换为json

本文详细介绍了如何在Java环境下利用GDAL库将shp格式的数据转换为Geojson格式,并通过Arcgis for js API在web上进行展示。包括GDAL库的安装、配置及关键代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述:

前两天,有位同仁再问我一个问题,问题大概是介个样子的:打包shp数据位zip格式并上传,上传完成后再在web上展示出来。这个需求,以前在Arcgis Online上见过,所以还是比较熟悉的,所以我就给他说:先将zip解压,再读取shp数据并将之转换为Geojson返回前台,并在web上展示出来。很庆幸的是,者为同仁很快就实现了shp到Geojson的转换,就问我Arcgis for js 中怎么展示Geojson,我截了个Arcgis for js的API给他他就实现了上述的功能。同时,我想他请教了如何实现的转换,他告诉我说是GDAL实现的,并给了我关键代码,因为代码是C#的,所以,经过周末的折腾,在JAVA上实现了,在此分享给大家。


实现:

想要在java上用GDAL比较费劲,中间的尝试过程在此略过,直接说结果。

首先是jdk,下载的GDAL的位数一定要与JDK的位数相符,我的JDK的位数是32位的,所以下载了32位的GDAL,为方便大家使用,并将此上传到了百度网盘,下载地址为:链接:http://pan.baidu.com/s/1mhrywn2 密码:lsch。将GDAL下载完成后,将所有的dll文件复制到jdk的安装路径“C:\Program Files (x86)\Java\jdk1.7.0_17\jre\bin”下即可。

接着,将JDAL.jar文件添加到你的Java lib引用中去。

最后,代码实现。实现的关键代码如下:

package com.lzugis.gdal;

import org.gdal.ogr.*;
import org.gdal.ogr.Driver;
import org.gdal.gdal.*;

public class GdalShpTest {
	public static void main(String[] args) {
		// 注册所有的驱动
        ogr.RegisterAll();
        // 为了支持中文路径,请添加下面这句代码
        gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES");
        // 为了使属性表字段支持中文,请添加下面这句
        gdal.SetConfigOption("SHAPE_ENCODING","");
        
        String strVectorFile = "D:\\data\\china\\capital.shp";
        //打开数据
        DataSource ds = ogr.Open(strVectorFile,0);
        if (ds == null)
        {
            System.out.println("打开文件失败!" );
            return;
        }
        System.out.println("打开文件成功!" );
        Driver dv = ogr.GetDriverByName("GeoJSON");
        if (dv == null)
        {
            System.out.println("打开驱动失败!" );
            return;
        }
        System.out.println("打开驱动成功!" );
        dv.CopyDataSource(ds, "D:\\data\\china\\capital.geojson");
        System.out.println("转换成功!" );
	}
}
打印的信息如下:





<think>我们正在解决CentOS7上GeoServer发布图层后出现的中文乱码问题。根据引用[1]和[2]的上下文,我们得知环境是CentOS7.3和GeoServer2.20.1。同时引用[2]提到在GeoServer控制台中,字符串末尾的空格会导致安全错误,因为空格被解析成分号(;),这提示我们需要注意GeoServer配置中的字符串处理。中文乱码问题通常是由于字符编码不一致导致的。在GeoServer中发布图层时,如果数据源(如Shapefile)的中文字符编码与GeoServer的字符编码设置不一致,或者系统缺少中文字符支持,就会导致乱码。根据之前的回答,我们已经知道在CentOS7上需要安装中文语言包和设置正确的Locale。但是,GeoServer本身运行在Java环境中,因此还需要确保Java环境支持中文,以及GeoServer的字符编码设置正确。解决步骤:1.**确保系统支持中文Locale**(如前所述):-安装中文语言包:`sudoyuminstall-yglibc-langpack-zh`-生成并启用zh_CN.UTF-8:`sudolocaledef-c-fUTF-8-izh_CNzh_CN.UTF-8`-设置系统Locale:`sudolocalectlset-localeLANG=zh_CN.UTF-8`并重启2.**检查Java环境默认编码**:GeoServer运行在Java环境中,默认编码可能不是UTF-8。我们可以通过以下步骤检查和设置:-查看GeoServer启动脚本(如`startup.sh`)中是否设置了JAVA_OPTS环境变量,如果没有,可以添加:```bashexportJAVA_OPTS="-Dfile.encoding=UTF-8-Dsun.jnu.encoding=UTF-8"```这可以设置Java虚拟机使用UTF-8编码。3.**在GeoServer中设置字符编码**:-在GeoServer的Web管理界面中,进入“全局设置”(GlobalSettings),确保“字符集”(CharacterSet)设置为UTF-8。-对于已发布的数据存储,检查其连接参数中是否指定了正确的编码。例如,对于PostGIS数据库,可以在连接参数中添加:```characterEncoding=UTF-8```-对于Shapefile数据源,确保在发布图层时,在“数据”选项卡下的“字符集”设置为UTF-8(或者根据Shapefile的实际编码选择,通常为GBK或UTF-8)。4.**检查数据源本身的编码**:-如果是Shapefile,可以使用`ogrinfo`命令检查其编码(需要安装GDAL):```bashogrinfo-al-soyour_shapefile.shp```在输出的元数据中,注意`LC_CTYPE`项,它可能指示了文件的编码。-如果Shapefile的编码不是UTF-8,可以使用`ogr2ogr`转换编码:```bashogr2ogr-f"ESRIShapefile"-lcoENCODING=UTF-8output.shpinput.shp```5.**确保GeoServer的日志和输出使用UTF-8**:-编辑GeoServer的日志配置文件(`logging.xml`,位于GeoServer数据目录的`logs`子目录中),确保编码设置为UTF-8。例如:```xml<Filename="geoserver.log"append="true"><PatternLayoutpattern="%d{ddMMMyyyyHH:mm:ss}%-5p%X{requestid}[%c]-%m%n"charset="UTF-8"/></File>```6.**重启GeoServer服务**:在完成上述设置后,重启GeoServer以使配置生效。7.**验证**:-重新发布图层,查看中文是否正常显示。-在GeoServer的图层预览中,使用OpenLayers预览,查看属性表中的中文是否正常。注意:如果数据来自数据库(如PostGIS),请确保数据库的编码也是UTF-8,并且在连接GeoServer时指定了正确的编码。如果问题仍然存在,请检查客户端(浏览器)的编码设置,确保浏览器使用UTF-8编码。根据引用[2]的提示,在GeoServer配置中,字符串的书写要避免多余的空格,否则可能导致解析错误。因此,在配置任何字符串参数时,确保没有多余的空格。最后,如果上述步骤无法解决,可能需要检查GeoServer的字体设置,确保它支持中文字体。GeoServer默认使用Java的字体,如果Java环境缺少中文字体,可以安装中文字体包并配置Java使用。安装中文字体:```bashsudoyuminstall-ycjkuni-ukai-fontscjkuni-uming-fonts```然后,将字体链接到Java的字体目录(假设Java安装在`/usr/lib/jvm/java-1.8.0-openjdk`):```bashmkdir-p/usr/lib/jvm/java-1.8.0-openjdk/jre/lib/fonts/fallbackln-s/usr/share/fonts/cjkuni-ukai/ukai.ttc/usr/lib/jvm/java-1.8.0-openjdk/jre/lib/fonts/fallback/ln-s/usr/share/fonts/cjkuni-uming/uming.ttc/usr/lib/jvm/java-1.8.0-openjdk/jre/lib/fonts/fallback/```重启GeoServer。以上步骤应该能够解决GeoServer发布图层时的中文乱码问题。§§相关问题§§1.如何检查Shapefile文件的字符编码?2.在GeoServer中如何设置全局字符编码?3.如何为Java应用程序(如GeoServer)设置默认字符编码?4.在CentOS7中如何安装和配置中文字体?5.GeoServer连接PostGIS数据库时如何指定字符编码?</think>### CentOS 7 GeoServer 发布图层中文乱码解决方法 #### 1. **检查系统中文环境支持** ```bash # 安装中文语言包 sudo yum install -y glibc-langpack-zh # 生成中文locale sudo localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8 # 验证locale是否生效 locale -a | grep zh_CN.UTF-8 ``` #### 2. **设置GeoServer字符编码** 在GeoServer管理界面操作: 1. 访问 `http://<服务器IP>:8080/geoserver/web` 2. 进入 **数据 > 数据存储 > 编辑目标数据存储** 3. 在 **连接参数** 中添加: ```properties characterEncoding = UTF-8 ``` [^2] #### 3. **修改GeoServer启动参数** 编辑启动脚本: ```bash sudo vim /path/to/geoserver/bin/startup.sh ``` 在 `JAVA_OPTS` 中添加: ```bash -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 ``` 示例: ```bash JAVA_OPTS="-Xms128m -Xmx512m -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8" ``` #### 4. **配置数据源编码** - **Shapefile数据**:确保文件编码为UTF-8,使用QGIS转换: ```bash ogr2ogr -f "ESRI Shapefile" -lco ENCODING=UTF-8 output.shp input.shp ``` - **PostGIS数据库**:连接参数添加: ```properties characterEncoding=UTF-8 ``` #### 5. **强制GeoServer使用UTF-8** 创建 `JAVA_TOOL_OPTIONS` 环境变量: ```bash echo 'export JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF-8"' >> /etc/profile source /etc/profile ``` #### 6. **验证与测试** 1. 重启GeoServer服务: ```bash sudo systemctl restart tomcat # 或您使用的容器服务 ``` 2. 预览图层时选择UTF-8编码: ```url http://<geoserver>/ows?service=WFS&version=1.0.0&request=GetFeature&outputFormat=application/json&charset=UTF-8 ``` #### 关键注意事项: 1. **空格处理**:配置参数值时避免开头/结尾空格,防止解析错误[^2] 2. **统一编码**:确保所有环节使用统一编码(数据源、GeoServer、客户端) 3. **字体支持**:安装中文字体包 ```bash sudo yum install -y wqy-zenhei-fonts ``` > 完成上述步骤后,中文乱码问题应解决。若仍存在问题,检查客户端浏览器编码设置(需UTF-8)。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛老师讲GIS

感谢老板支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值