文档章节

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

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

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

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

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

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

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

王.者.归.来
2015/12/19
1K
1
GeoJSON格式规范说明

GeoJSON是基于JavaScript 对象表示法的地理空间信息数据交换格式。 目录 1. 简介 1.1.举例 1.2.定义 2.GeoJSON对象 2.1 几何对象 2.1.1 位置 2.1.2 点 2.1.3 多点 2.1.4 线 2.1.5 多线 2.1....

Skqing
2013/07/22
73K
9
Echarts地图Geojson加载与Mark动画冲突

@Kener-林峰 你好,想跟你请教个问题:您好!我在使用百度ECharts时,用自己的Geojson地图数据,发现当json文件较大时,其中多边形数量较多,首次加载页面时所使用的Mark动画不会动起来,只有...

cwjwhu
2015/07/03
278
1

没有更多内容

加载失败,请刷新页面

加载更多

deepin中配置robot framework环境

本文永久更新地址:https://my.oschina.net/bysu/blog/2989005 【若要到岸,请摇船:开源中国 不最醉不龟归】 1.在终端中输入pip,回车,如果提示没有该命令,则先安转pip sudo apt-get inst...

不最醉不龟归
18分钟前
2
0
OSChina 周日乱弹 —— 钱不还,我就当你人不在了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享Bigleaf的单曲《小鹿》 《小鹿》- Bigleaf 手机党少年们想听歌,请使劲儿戳(这里) 周日在家做什么? 做手工呀, @poorfis...

小小编辑
今天
85
3
EOS docker开发环境

使用eos docker镜像是部署本地EOS开发环境的最轻松愉快的方法。使用官方提供的eos docker镜像,你可以快速建立一个eos开发环境,可以迅速启动开发节点和钱包服务器、创建账户、编写智能合约....

汇智网教程
今天
20
0
《唐史原来超有趣》的读后感优秀范文3700字

《唐史原来超有趣》的读后感优秀范文3700字: 作者:花若离。我今天分享的内容《唐史原来超有趣》这本书的读后感,我将这本书看了一遍之后就束之高阁了,不过里面的内容一直在在脑海中回放,...

原创小博客
今天
29
0
IC-CAD Methodology知识图谱

CAD (Computer Aided Design),计算机辅助设计,指利用计算机及其图形设备帮助设计人员进行设计工作,这个定义同样可以用来近似描述IC公司CAD工程师这个岗位的工作。 早期IC公司的CAD岗位最初...

李艳青1987
今天
35
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部