文档章节

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

枯藤KT
 枯藤KT
发布于 2015/12/04 18:05
字数 553
阅读 737
收藏 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
博文 97
码字总数 60123
作品 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
Echarts-地图扩展-标准geoJson格式扩展地图-例子

本人菜鸟一枚,最近搞echarts地图。看到官方给的“标准geoJson格式扩展地图-全国主要城市”的例子,瞬间就蒙逼了。(http://echarts.baidu.com/echarts2/doc/example/map20.html ,2016年8月...

夜辰
2015/07/17
0
13
JupyterLab安装地图插件

JupyterLab安装地图插件 (本文所述软件还在发展之中,欢迎加入开源项目,提供建议、测试和开发。) 在Jupyter中进行数据分析时,往往需要将数据叠加到地图上。简单的地图需求可以利用matpl...

openthings
07/18
0
0
GeoJSON JS判断某一点是否在某一区域范围之内

GeoJSON JS判断某一点是否在某一区域范围之内 算法: function isInPolygon(checkPoint, polygonPoints) { } 测试: 1.先选取一个范围:http://geojson.io/#map=15/31.1422/121.6617 2. 选取...

heyangyi
07/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

jetbrains系产品IDEA:mac上面提示快捷键设置

原因 由于Mac上面的Ctrl+空格变成输入法切换的快捷键,在使用IDEA的过程中,代码提示很不方便,需要使用option+/这种传统eclipse上面的代码提示快捷键作为主要快捷键。 怎么修改? 移除【opt...

亚林瓜子
31分钟前
0
0
Exclipse 输出结果时换行

System.out.println(f1 + "\n" + d1 + "\n" + d2);

笑丶笑
31分钟前
1
0
怎样治疗标签不能触发onblur事件

I realize this was over a year ago, but it showed up for me in Google while trying to solve this same issue. It seems Chrome does not consider some elements, like body and ancho......

Weijuer
34分钟前
0
0
vue常见库安装

移动设备上的浏览器默认会在用户点击屏幕大约延迟300毫秒后才会触发点击事件,这是为了检查用户是否在做双击。为了能够立即响应用户的点击事件,才有了FastClick。 安装fastclick npm insta...

林夏夕
36分钟前
0
0
kafka 教程(三) kafka Java API 编程

下午写

MrPei
37分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部