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中的预览效果: