文档章节

解析shp文件生成geojson格式数据

枯藤KT
 枯藤KT
发布于 2015/12/04 18:05
字数 553
阅读 726
收藏 3
点赞 0
评论 0
package cn.ssk.geotools; 
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import org.geotools.data.FileDataStoreFinder;
import org.geotools.data.shapefile.ShapefileDataStore;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.geotools.data.simple.SimpleFeatureIterator;
import org.geotools.data.simple.SimpleFeatureSource;
import org.geotools.factory.GeoTools;
import org.opengis.feature.simple.SimpleFeature;
import cn.ssk.mysql.AreaInfo;
import cn.ssk.mysql.MysqlUtils;
import sun.nio.cs.ext.GBK;

public class GeotoolDemo {
 private static HashMap<String, AreaInfo> codeMap=MysqlUtils.getCodeMap();
 private static HashMap<String,FileWriter> jsonFiles=new HashMap<>();
 public static void main(String[] args)throws Exception {
  URL url=GeoTools.class.getClassLoader().getResource("xian.shp");
  File file=new File(url.toURI());
  handleProcess(file); 
 }
 public static void handleProcess(File shpfile)throws Exception{
  ShapefileDataStore fdstore=(ShapefileDataStore)FileDataStoreFinder.getDataStore(shpfile);
  fdstore.setCharset(new GBK());
  SimpleFeatureSource source=fdstore.getFeatureSource();
  SimpleFeatureCollection sfc=source.getFeatures();
  try(SimpleFeatureIterator iterator=sfc.features()){
   AreaInfo info;
   while(iterator.hasNext()){
    SimpleFeature feature=iterator.next();
    String cityName=feature.getAttribute("NAME").toString();
    String polygon=feature.getAttribute("the_geom").toString();
    info=codeMap.get(cityName);
    if(info!=null){
     Integer mgr=info.getMgr();
     String coordinates=parseCoordinate(polygon);
     if(jsonFiles.containsKey(mgr.toString())){
      FileWriter fw=jsonFiles.get(mgr.toString());
      fw.append(",");
      appendToFile(fw,coordinates,cityName);
     }else{
      FileWriter fw=new FileWriter(mgr.toString()+".json",true);
      fw.append("{\"type\":\"FeatureCollection\",\"features\":[");
      fw.flush();
      jsonFiles.put(mgr.toString(), fw);
      appendToFile(fw, coordinates,cityName);
     }
    }
   }
   
   for(String filename :jsonFiles.keySet()){
    FileWriter writer=jsonFiles.get(filename);
    writer.append("]}");
    writer.flush();
    writer.close();
   }
  }
 }
 public static void appendToFile(FileWriter writer,String coordinate,String cityName) throws IOException{
  writer.append("{\"type\":\"Feature\",\"properties\":{\"name\":\"");
  writer.append(cityName);
  writer.append("\"},");
  writer.append("\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":");
  writer.append(coordinate);
  writer.append("}}");
  writer.flush();
 }
 private static String geojsonWrapper(String polygon){
  StringBuilder sber=new StringBuilder(polygon.length()+30);
  String tmp[]=polygon.split(",");
  sber.append("[[[");
  for(int i=0;i<tmp.length;i++){
   sber.append("[");
   sber.append(tmp[i].trim().replace(" ", ","));
   sber.append("]");
   if(i != tmp.length-1)
    sber.append(",");
  }
  sber.append("]]]");
  return sber.toString();
 }
 public static String parseCoordinate(String polygon){
  int beginIndex=polygon.indexOf("(((")+3;
  int endIndex=polygon.lastIndexOf(")))");
  String s=polygon.substring(beginIndex,endIndex).replace('(', ' ').replace(')', ' ');
  return geojsonWrapper(s);
 }
}  

  根据县的名称,查询县所属的市,该关系存入一个数据库表中,也可存入文件中。
package cn.ssk.mysql;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
public class MysqlUtils {
 private static final String driver="com.mysql.jdbc.Driver";
 private static final String url="jdbc:mysql://localhost:3306/geotools";
 private static final String username="root";
 private static final String password="123456";
 private static Connection conn=null;
 private static PreparedStatement stmt=null;
 private static ResultSet rs=null;
 private static HashMap<String, AreaInfo> codeMap=new HashMap<>();
 static{
  try {
   Class.forName(driver);
   conn=DriverManager.getConnection(url, username, password);
   init();
  } catch (Exception e) {
   throw new RuntimeException(e);
  }
 }
 public static void close(ResultSet rs,PreparedStatement stmt,Connection conn){
  try {
   if(rs!=null){rs.close();}
   if(stmt!=null){stmt.close();}
   if(conn!=null){conn.close();}
  } catch (Exception e) {
   throw new RuntimeException(e);
  }
 }
 private static void init(){
  AreaInfo info; //数据库表对应bean
  try {
   stmt=conn.prepareStatement("select code,cityName,mgr from areacode where code like ?");
   stmt.setString(1, "15____");//根据省份编号仅获取该省县市的编码对应关系
   rs=stmt.executeQuery();
   while(rs.next()){
    info=new AreaInfo();
    info.setCode(rs.getInt("code"));
    info.setCityName(rs.getString("cityName"));
    info.setMgr(rs.getInt("mgr"));
    codeMap.put(rs.getString("cityName"), info);
   }
  } catch (SQLException e) {
   throw new RuntimeException(e);
  }finally {
   close(rs,stmt,conn);
  }
 }
 public static HashMap<String, AreaInfo> getCodeMap() {
  return codeMap;
 }
}

数据库行政区划代码关系表(数据来自国家统计局最新数据):

code:县或市的行政区划代码,mgr 县所属的市的代码

© 著作权归作者所有

共有 人打赏支持
枯藤KT

枯藤KT

粉丝 4
博文 71
码字总数 60123
作品 0
昌平
程序员
gis cad 叠加

在web页面上实现 1. dxf转化geojson,最好是topojson 集成到web中。后台转换 2. 选择西安80/北京54/国家2000 后 可以输入7参数(或者需要的参数)后,将geojson叠加到google地图...

张先生 ⋅ 05/16 ⋅ 0

地理信息可视化工具 - Ketoper.gl

Uber 开源其内部可视化工具包 ketoper.gl,这是一个基于 deck.gl 构建的 React 组件,高性能,用于大规模地理定位数据集的可视化探索。它对 GPU 功能的支持允许应用程序立即渲染数百万个数据...

匿名 ⋅ 05/31 ⋅ 0

Uber 开源地理可视化工具 Ketoper.gl,加速数据处理

Uber 开源其内部可视化工具包 ketoper.gl,这是一个基于 deck.gl 构建的 React 组件,高性能,用于大规模地理定位数据集的可视化探索。它对 GPU 功能的支持允许应用程序立即渲染数百万个数据...

达尔文 ⋅ 06/01 ⋅ 0

OpenLayers3.0 geojson数据源获取

当前主要使用从shp转geojson的工具,献上地址:http://mapshaper.org/,自己感觉这个工具很强大,可以很方便的将shp转成geojson,导出的文件是经纬度的! 另外因为客户给的数据是*.tab(mapin...

yanglk2010 ⋅ 2016/10/29 ⋅ 0

echarts自定义SVG地图后怎么通过真实经纬度进行标注

@Kener-林峰 你好,想跟你请教个问题:echarts自定义SVG地图后怎么通过真实经纬度进行标注?此SVG地图是通过shp文件生成的,如果采用GeoJson格式地图倒是可以通过真实经纬度标注,但是那样似...

王.者.归.来 ⋅ 2015/12/19 ⋅ 1

蚂蚁金服 AntV G2 3.1 发布:在路上

2017年的11月22日,G2 正式开源,发布了3.0版本。3.0 是 G2 的一个重大版本升级,从这个版本开始,我们确认了打造“数据驱动的高交互图形语法”的愿景;从底层夯实了架构基础,完善开发、测试...

leungwensen ⋅ 05/25 ⋅ 0

自己做地图

支持WEB、Android、IOS的地图解决方案 工具链 GIS工具集 OpenGeo Suite 包含PostGIS, GeoServer, GeoWebCache, OpenLayers, 和 QGIS 地图准备 QGIS 导入、导出、编辑.shp,postgis,geotiff,ge...

postdep ⋅ 2016/04/22 ⋅ 0

GIScript2016-Docker 数据导入源码

GIScript2016-数据导入教程 GIScript2016是支持Python3的地理空间数据处理和分析工具包,支持Jupyter和Spark。 GIScript2016支持Spark,可以运行在单机以及大规模集群之上。这里基于Docker的...

openthings ⋅ 2016/10/13 ⋅ 0

surfer10与Arcgis10.3 完美生成等值线和等值面方法

surfer10 与Arcgis10.3生成等值线和等值面的步骤如下: 1.准备surfer用的Book1.dat文件,格式如下: "x" "y" "z" 116.471992 40.809975 232 116.335556 40.700542 1235 116.541626 40.71333......

sinat_34719507 ⋅ 2017/03/06 ⋅ 0

简析将shp导入Oracle并利用geoserver将导入的数据发布

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/。 1.环境准备 1.1 软件准备 首先要安装有支持空间数据的Oracle,其次有安装版或免安装版的...

李晓晖 ⋅ 2015/01/02 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 35分钟前 ⋅ 0

到底会改名吗?微软GVFS 改名之争

微软去年透露了 Git Virtual File System(GVFS)项目,GVFS 是 Git 版本控制系统的一个开源插件,允许 Git 处理 TB 规模的代码库,比如 270 GB 的 Windows 代码库。该项目公布之初就引发了争...

linux-tao ⋅ 45分钟前 ⋅ 0

笔试题之Java基础部分【简】【二】

1.静态变量和实例变量的区别 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变...

anlve ⋅ 今天 ⋅ 0

Lombok简单介绍及使用

官网 通过简单注解来精简代码达到消除冗长代码的目的 优点 提高编程效率 使代码更简洁 消除冗长代码 避免修改字段名字时忘记修改方法名 4.idea中安装lombnok pom.xml引入 <dependency> <grou...

to_ln ⋅ 今天 ⋅ 0

【转】JS浮点数运算Bug的解决办法

37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数) 我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998 怎么会这样,两个只有一位小数的数字相乘,怎...

NickSoki ⋅ 今天 ⋅ 0

table eg

user_id user_name full_name 1 zhangsan 张三 2 lisi 李四 `` ™ [========] 2018-06-18 09:42:06 星期一½ gdsgagagagdsgasgagadsgdasgagsa...

qwfys ⋅ 今天 ⋅ 0

一个有趣的Java问题

先来看看源码: public class TestDemo { public static void main(String[] args) { Integer a = 10; Integer b = 20; swap(a, b); System.out......

linxyz ⋅ 今天 ⋅ 0

十五周二次课

十五周二次课 17.1mysql主从介绍 17.2准备工作 17.3配置主 17.4配置从 17.5测试主从同步 17.1mysql主从介绍 MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主...

河图再现 ⋅ 今天 ⋅ 0

docker安装snmp rrdtool环境

以Ubuntu16:04作为基础版本 docker pull ubuntu:16.04 启动一个容器 docker run -d -i -t --name flow_mete ubuntu:16.04 bash 进入容器 docker exec -it flow_mete bash cd ~ 安装基本软件 ......

messud4312 ⋅ 今天 ⋅ 0

OSChina 周一乱弹 —— 快别开心了,你还没有女友呢。

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享吴彤的单曲《好春光》 《好春光》- 吴彤 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :小萝莉街上乱跑,误把我认错成...

小小编辑 ⋅ 今天 ⋅ 9

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部