文档章节

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

枯藤KT
 枯藤KT
发布于 2015/12/04 18:05
字数 553
阅读 761
收藏 3
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
博文 99
码字总数 60947
作品 0
昌平
程序员
geotrellis使用(四十二)将 Shp 文件转为 GeoJson

前言 一个多月没有写博客了,今天尝试着动笔写点。 原因很多,最重要的原因是我转行了。是的,我离开了开发岗位,走向了开发的天敌-产品经理。虽然名义上是产品经理,但是干的事情也很杂,除...

shoufengwei
08/22
0
0
echarts搞定各种地图(想怎么画就怎么画)

echarts提供了全国各省市及区县的js和json文件,但是并没有细化到区域内各街道范围,有时候项目中又有这种需求,领导给予重任,我们又不能轻易拒绝,只能是硬着头皮上了。 今天我们以北京市西...

Mr_ZhangQian
09/20
0
0
用python写提取分割OSM格式地图某些Tag数据的脚本

需求可分成2个部分: 1 已下载OSM(OpenStreeMap)数据(.osm后缀的XML格式),需要从中提取某个指定Tag的数据(如“树林”、“公路”等等),然后导出为GeoJSON格式的文件(能在Global Mapp...

吴刚
08/16
0
0
gis cad 叠加

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

张先生
05/16
0
0
批量将本地gis数据导入postgis数据库

以前在处理gis数据的时候,都是直接导入本地shp素材、本地geojson素材,本地topojson素材,自从接触postgis数据之后,深感使用规范的存储系统来统一管理gis数据的好处,特别是数据量大了之后...

技术小能手
08/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

idea 通过jpa自动生成实体类

引入jpa包 打开persistence窗口 右键选择连接数据库 如果数据库没配置,则可以在下图选项中配置 选择好数据库和实体类的生成地址

斩神魂
28分钟前
1
0
tcpdump 命令

TCPDUMP简介 tcpdump 是一个很常用的网络包分析工具,可以用来显示通过网络传输到本系统的 TCP/IP 以及其他网络的数据包。tcpdump 使用 libpcap 库来抓取网络报,这个库在几乎在所有的 Linu...

寰宇01
35分钟前
2
0
软件的Alpha、Beta、RC、GA版本的区别

Alpha:是内部测试版,一般不向外部发布,会有很多Bug.一般只有测试人员使用。 Beta:也是测试版,这个阶段的版本会一直加入新的功能。在Alpha版之后推出。 RC:(Release Candidate) 顾名思义...

乔老哥
37分钟前
2
0
慢雾安全海贼王:从DApp亡灵军团,细说区块链安全

本文转载自微信公号“万向区块链”,为慢雾安全负责人海贼王在万向区块链实验室举办的2018上海区块链国际周-技术开放日上的演讲速记整理。 这张图总结了智能合约攻防的各个方面,分为两大部分...

万向区块链
42分钟前
13
0
Matlab编程之——卷积神经网络CNN代码解析

卷积神经网络CNN代码解析 deepLearnToolbox-master是一个深度学习matlab包,里面含有很多机器学习算法,如卷积神经网络CNN,深度信念网络DBN,自动编码AutoE ncoder(堆栈SAE,卷积CAE)的作...

酒逢知己千杯少
43分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部