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

GisUtil工具类:将WKT(wellKnownText)文本转换为ElasticSearch识别的空间对象字符串形式的更多相关文章

  1. Netty源码分析第8章(高性能工具类FastThreadLocal和Recycler)---->第4节: recycler中获取对象

    Netty源码分析第八章: 高性能工具类FastThreadLocal和Recycler 第四节: recycler中获取对象 这一小节剖析如何从对象回收站中获取对象: 我们回顾上一小节demo的ma ...

  2. Netty源码分析第8章(高性能工具类FastThreadLocal和Recycler)---->第5节: 同线程回收对象

    Netty源码分析第八章: 高性能工具类FastThreadLocal和Recycler 第五节: 同线程回收对象 上一小节剖析了从recycler中获取一个对象, 这一小节分析在创建和回收是同线程的 ...

  3. Netty源码分析第8章(高性能工具类FastThreadLocal和Recycler)---->第6节: 异线程回收对象

    Netty源码分析第八章: 高性能工具类FastThreadLocal和Recycler 第六节: 异线程回收对象 异线程回收对象, 就是创建对象和回收对象不在同一条线程的情况下, 对象回收的逻辑 我 ...

  4. 泛型(二)封装工具类CommonUtils-把一个Map转换成指定类型的javabean对象

    1.commons-beanutils的使用 commons-beanutils-1.9.3.jar 依赖 commons-logging-1.2.jar 代码1: String className ...

  5. 2015第30周三Spring常用工具类

    文件资源操作 文件资源的操作是应用程序中常见的功能,如当上传一个文件后将其保存在特定目录下,从指定地址加载一个配置文件等等.我们一般使用 JDK 的 I/O 处理类完成这些操作,但对于一般的应用程序来 ...

  6. spring中常用工具类介绍

    http://www.cnblogs.com/langtianya/p/3875103.html 文件资源操作     Spring 定义了一个 org.springframework.core.io ...

  7. fastdfs-client-java工具类封装

    FastDFS是通过StorageClient来执行上传操作的 通过看源码我们知道,FastDFS有两个StorageClient工具类.

  8. Android工具类整合

    Android-JSONUtil工具类 常用的Json工具类,包含Json转换成实体.实体转json字符串.list集合转换成json.数组转换成json public class JSONUtil ...

  9. Java 数字数组随机数工具类 NumberUtils、ArrayUtils、RandomUtils用法

    commons-lang3-3-3.8.1 //----------------------------------------------------------------------- /** ...

随机推荐

  1. 06章 Struts2数据校验

    一.三种实现方式 ① 用validate()方法实现数据校验 继承ActionSupport类,该类实现了Validateable接口,该接口中定义了一个validate()方法,在自定义的Actio ...

  2. AC日记——验证字串 openjudge 1.7 18

    18:验证子串 总时间限制:  1000ms 内存限制:   65536kB 描述 输入两个字符串,验证其中一个串是否为另一个串的子串. 输入 输入两个字符串, 每个字符串占一行,长度不超过200且不 ...

  3. XMLHTTP中setRequestHeader方法和参数

    注意:在FF里面需要将open方法放在setRequestHeader之前 一.为何要用到setRequestHeader 通 常在HTTP协议里,客户端像服务器取得某个网页的时候,必须发送一个HTT ...

  4. Java线上应用故障排查之二:高内存占用

    搞Java开发的,经常会碰到下面两种异常: 1.java.lang.OutOfMemoryError: PermGen space 2.java.lang.OutOfMemoryError: Java ...

  5. java 26 - 8 网络编程之 TCP协议的练习

    TCP练习: 1.客户端键盘录入,服务器输出文本文件 客户端代码: public class ClientDemo { public static void main(String[] args) t ...

  6. Entityframework core 动态添加模型实体

    重新DBContext中OnModelCreating protected override void OnModelCreating(ModelBuilder modelBuilder)  { // ...

  7. HealthKit框架

    HealthKit框架相关资料 链接: HealthKit框架参考 HealthKit开发快速入门教程之HealthKit数据的操作 HealthKit开发快速入门教程之HealthKit框架体系创建 ...

  8. VMWare发布ESXi 6.0

    发布声明 https://www.vmware.com/support/vsphere6/doc/vsphere-esxi-vcenter-server-60-release-notes.html 获 ...

  9. 夯实基础之php学习-1基础篇

    1,单引号和双引号的区别 单引号表示字符串,双引号能解析字符串中的变量,所以,如果没有变量,尽量用单引号,加快解析速度 当字符串需要单引号或者双引号的时候,可以用转义字符代替 2,类型转换 通过(bo ...

  10. js,onblur后下一个控件获取焦点判断、html当前活跃控件、jquery版本查看、jquery查看浏览器版本、setTimeout&setInterval

    需求: input控件在失去焦点后直接做验证,验证通不过的话,显示相应错误.但是如果失去焦点后点击的下个控件是比较特殊的控件(比如,退出系统),那么不执行验证操作,直接退出系统(防止在系统退出前,还显 ...