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. Code! MVC 5 App with Facebook, Twitter, LinkedIn and Google OAuth2 Sign-on (C#)

    http://www.asp.net/mvc/overview/security/create-an-aspnet-mvc-5-app-with-facebook-and-google-oauth2- ...

  2. Java之反射机制

    一:基本概念:在Java运行时,对于任意一个类,能否知道这个类对应的属性和方法?对于一个对象,能否知道可以调用它的哪些方法?YES! 这种动态获取类的信息以及动态调用对象的方法的功能来自于Java语言 ...

  3. java 28 - 6 JDK7的新特性

    JDK7的新特性: 二进制字面量 数字字面量可以出现下划线 switch 语句可以用字符串 泛型简化 异常的多个catch合并 try-with-resources 语句 二进制字面量 JDK7开始, ...

  4. C#的匿名方法

    匿名方法是在初始化委托时内联声明的方法. 例如下面这两个例子: 不使用匿名方法的委托: using System; using System.Collections.Generic; using Sy ...

  5. 模拟placeholder支持ie8以下处理了密码框只读的问题

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. jquery的ready方法(DOM是否加载完)详解与使用

    jquery的ready方法(准备DOM触发)还是比较复杂的,我们先看流程图:

  7. java多线程系类:JUC原子类:02之AtomicLog原子类

    概要 AtomicInteger, AtomicLong和AtomicBoolean这3个基本类型的原子类的原理和用法相似.本章以AtomicLong对基本类型的原子类进行介绍.内容包括:Atomic ...

  8. Caffe学习系列(2):数据层及参数

    要运行caffe,需要先创建一个模型(model),如比较常用的Lenet,Alex等, 而一个模型由多个屋(layer)构成,每一屋又由许多参数组成.所有的参数都定义在caffe.proto这个文件 ...

  9. leetcode - 位运算题目汇总(上)

    最近在看位运算的知识,十分感叹于位运算的博大精深,正好leetcode有 Bit Manipulation 的专题,正好拿来练练手. Subsets 给出一个由不同的数字组成的数组,枚举它的子数组(子 ...

  10. 重建中国.NET生态系统

    Neuzilla官方微信公众号:搜 架构师联盟 或 neuzilla 我是.NET铁杆粉丝,所以如果你要在评论里跟我撕逼.NET怎么怎么烂,Java.C++.PHP.JavaScript怎么怎么好,我 ...