zoukankan      html  css  js  c++  java
  • GisUtil工具类:将WKT(wellKnownText)文本转换为ElasticSearch识别的空间对象字符串形式

    ElasticSearch中的Geo Shape Type:
     
    从熟知文本或熟知二进制数据中生成的 ST_Geometry:
     
    package com.nihaorz.utils;
    
    import com.vividsolutions.jts.geom.*;
    import com.vividsolutions.jts.io.ParseException;
    import com.vividsolutions.jts.io.WKTReader;
    import org.geotools.geometry.jts.JTSFactoryFinder;
    
    /**
     * Created by Administrator on 2016/4/1.
     */
    public class GisUtil {
    
        private final static WKTReader wktReader = new WKTReader(JTSFactoryFinder.getGeometryFactory());
    
        /**
         * 将WKT文本字符串转换为ES中的GeoShape字符串格式
         * @param wkt
         * @return
         * @throws ParseException
         */
        public static String getESGeoTextFromWkt(String wkt) throws ParseException {
            String result = null;
            Geometry geom = wktReader.read(wkt);
            String type = geom.getClass().getSimpleName().toLowerCase();
            Point point;
            MultiPoint multiPoint;
            LineString lineString;
            MultiLineString multiLineString;
            Polygon polygon;
            MultiPolygon multiPolygon;
            if(type.equals("point")){
                point = (Point) geom;
                result = getESPointText(point);
            }else if(type.equals("linestring")){
                lineString = (LineString) geom;
                result = getESLineStringText(lineString);
            }else if(type.equals("polygon")){
                polygon = (Polygon) geom;
                result = getESPolygonText(polygon);
            }else if(type.equals("multipoint")){
                multiPoint = (MultiPoint) geom;
                result = getESMultiPointText(multiPoint);
            }else if(type.equals("multilinestring")){
                multiLineString = (MultiLineString) geom;
                result = getESMultiLineStringText(multiLineString);
            }else if(type.equals("multipolygon")){
                multiPolygon = (MultiPolygon) geom;
                result = getESMultiPolygonText(multiPolygon);
            }
            return result;
        }
    
        /**
         * 通过MultiPolygon对象拼接中括号表示的字符串
         * @param multiPolygon
         * @return
         */
        private static String getESMultiPolygonText(MultiPolygon multiPolygon) throws ParseException {
            Polygon polygon;
            int num = multiPolygon.getNumGeometries();
            StringBuffer sb = new StringBuffer("[");
            for(int i = 0; i < num; i++){
                polygon = (Polygon) multiPolygon.getGeometryN(i);
                sb.append(getESPolygonText(polygon)+",");
            }
            sb.setCharAt(sb.length() - 1, ']');
            return sb.toString();
        }
    
        /**
         * 通过MultiLineString对象拼接中括号表示的字符串
         * @param multiLineString
         * @return
         */
        private static String getESMultiLineStringText(MultiLineString multiLineString) {
            LineString lineString;
            int num = multiLineString.getNumGeometries();
            StringBuffer sb = new StringBuffer("[");
            for(int i = 0; i < num; i++){
                lineString = (LineString) multiLineString.getGeometryN(i);
                sb.append(getESLineStringText(lineString)+",");
            }
            sb.setCharAt(sb.length() - 1, ']');
            return sb.toString();
        }
    
        /**
         * 通过MultiPoint对象拼接中括号表示的字符串
         * @param multiPoint
         * @return
         */
        private static String getESMultiPointText(MultiPoint multiPoint) {
            Point point;
            int num = multiPoint.getNumGeometries();
            StringBuffer sb = new StringBuffer("[");
            for(int i = 0; i < num; i++){
                point = (Point) multiPoint.getGeometryN(i);
                sb.append(getESPointText(point)+",");
            }
            sb.setCharAt(sb.length() - 1, ']');
            return sb.toString();
        }
    
        /**
         * 通过Polygon对象拼接中括号表示的字符串
         * @param polygon
         * @return
         * @throws ParseException
         */
        private static String getESPolygonText(Polygon polygon){
            String result;
            /**
             * 内部闭合环形的数量
             */
            int num = polygon.getNumInteriorRing();
            if(num > 0){
                StringBuffer sb = new StringBuffer("["+getESLineStringText(polygon.getExteriorRing())+",");
                for(int i = 0; i < num; i++){
                    sb.append(getESLineStringText(polygon.getInteriorRingN(i))+",");
                }
                sb.setCharAt(sb.length() - 1, ']');
                result = sb.toString();
            }else{
                result = "["+getESLineStringText(polygon.getExteriorRing())+"]";
            }
            return result;
        }
    
        /**
         * 通过LineString对象拼接中括号表示的字符串
         * @param lineString
         * @return
         */
        public static String getESLineStringText(LineString lineString){
            Coordinate[] corrds = lineString.getCoordinates();
            StringBuffer sb = new StringBuffer("[");
            for(Coordinate corrd : corrds) {
                sb.append(getCoordinateText(corrd)+",");
            }
            sb.setCharAt(sb.length() - 1, ']');
            return sb.toString();
        }
    
        /**
         * 通过Point对象拼接中括号表示的字符串
         * @param point
         * @return
         */
        public static String getESPointText(Point point){
            return getCoordinateText(point.getCoordinate());
        }
    
        /**
         * 通过Coordinate对象拼接中括号表示的字符串
         * @param coord
         * @return
         */
        public static String getCoordinateText(Coordinate coord) {
            return "["+coord.x+","+coord.y+"]";
        }
        
    }
    

      

     

    附:

    空心面的WKT文本格式:

    POLYGON  (( 114.69311270 32.15375671, 114.69311270 30.38273703, 117.16663685 30.38273703, 117.16663685 32.15375671, 114.69311270 32.15375671),( 115.46055456 31.36860465, 115.96824687 31.67558140, 116.33425760 31.37450805, 115.81475850 31.01440072, 115.46055456 31.36860465))

    ArcMap中的预览效果:

  • 相关阅读:
    Java:XML篇,使用SAX写入XML数据
    Solr4:Solr查询结果JSP分页显示(每次查询只返回指定记录数)
    Java:JDBC篇,Connection连接至几种常用数据库(Oracle,MySQL,Access,SQL Server)
    单点登陆原理
    sqlldr自定义函数调用
    osworkflow使用jdbc如何不用配置数据源。
    IHttpHandler使用session
    java代码生成器的的实现
    db2 通用分页存储过程
    复写page的Render方法
  • 原文地址:https://www.cnblogs.com/nihaorz/p/5344925.html
Copyright © 2011-2022 走看看