Browse Source

add:增加gis支持。

zhangweixin 4 years ago
parent
commit
c6304e33b4

+ 1 - 1
persagy-kotlin-base/src/main/kotlin/com/persagy/base/exceptions/SApplicationRuntimeException.kt

@@ -29,7 +29,7 @@ package com.persagy.base.exceptions
 /**
  * 应用运行时异常
  *
- * @author 庞利祥 <sybotan@126.com>
+ * @author 张维新 <zhangweixin@sagacloud.cn>
  */
 open class SApplicationRuntimeException(
         /** 应用异常消息 */

+ 1 - 1
persagy-kotlin-base/src/main/kotlin/com/persagy/base/exceptions/SBusinessException.kt

@@ -31,7 +31,7 @@ import com.persagy.base.exceptions.SApplicationRuntimeException
 /**
  * 业务异常
  *
- * @author 庞利祥 <sybotan@126.com>
+ * @author 张维新 <zhangweixin@sagacloud.cn>
  */
 open class SBusinessException(
         /** 业务异常消息 */

+ 1 - 1
persagy-kotlin-base/src/main/kotlin/com/persagy/base/exceptions/SFieldNotFoundException.kt

@@ -31,7 +31,7 @@ import com.persagy.base.exceptions.SBusinessException
 /**
  * 字段未找到异常
  *
- * @author 庞利祥 <sybotan@126.com>
+ * @author 张维新 <zhangweixin@sagacloud.cn>
  */
 open class SFieldNotFoundException(
         /** 字段异常 */

+ 1 - 1
persagy-kotlin-base/src/main/kotlin/com/persagy/base/opts/SFormat.kt

@@ -29,7 +29,7 @@ package com.persagy.base.opts
 /**
  * 格式定义
  *
- * @author 庞利祥 <sybotan@126.com>
+ * @author 张维新 <zhangweixin@sagacloud.cn>
  */
 object SFormat {
     /** datetime 类型数据格式定义 */

+ 1 - 1
persagy-kotlin-database/src/main/kotlin/com/persagy/database/functions/SLength.kt

@@ -32,7 +32,7 @@ import com.persagy.database.enums.SDatabaseType
 /**
  * SQL 取长度函数
  *
- * @author 庞利祥 <sybotan@126.com>
+ * @author  张维新 <zhangweixin@sagacloud.cn>
  */
 class SLength(name: String) : SAbstractFunction(name, arrayListOf()) {
     /**

+ 8 - 8
persagy-kotlin-gis/src/main/javacc/SGisWktParser.jj

@@ -57,27 +57,27 @@ SAbstractGisGeometry passerGeometry():
 }
 {
     (
-          <POINT>
+          <POINT> "Z"?
         {
             geometry = passerPointArgs();
         }
-        | <MULTIPOINT>
+        | <MULTIPOINT> "Z"?
         {
             geometry = passerMultiPointArgs();
         }
-        | <LINESTRING>
+        | <LINESTRING> "Z"?
         {
             geometry = passerLineStringArgs();
         }
-        | <MULTILINESTRING>
+        | <MULTILINESTRING> "Z"?
         {
             geometry = passerMultiLineStringArgs();
         }
-        | <POLYGON>
+        | <POLYGON> "Z"?
         {
             geometry = passerPolygonArgs();
         }
-        | <MULTIPOLYGON>
+        | <MULTIPOLYGON> "Z"?
         {
             geometry = passerMultiPolygonArgs();
         }
@@ -316,10 +316,10 @@ SGisPosition passerPosition():
             return new SGisPosition(valList.get(0), valList.get(1), valList.get(2));
         }
         if (valList.size() >= 2) {
-            return new SGisPosition(valList.get(0), valList.get(1), null);
+            return new SGisPosition(valList.get(0), valList.get(1), 0.0);
         }
         if (valList.size() >= 1) {
-            return new SGisPosition(valList.get(0), 0.0, null);
+            return new SGisPosition(valList.get(0), 0.0, 0.0);
         }
         return new SGisPosition();
     }

+ 3 - 0
persagy-kotlin-gis/src/main/kotlin/com/persagy/gis/entity/SGisLineString.kt

@@ -26,8 +26,10 @@
 
 package com.persagy.gis.entity
 
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize
 import com.fasterxml.jackson.databind.annotation.JsonSerialize
 import com.persagy.gis.enums.SGisGeometryType
+import com.persagy.gis.json.SGisPositionArrayDeserializer
 import com.persagy.gis.json.SGisPositionArraySerializer
 import com.persagy.gis.utils.SGisPositionUtil
 
@@ -39,6 +41,7 @@ import com.persagy.gis.utils.SGisPositionUtil
 class SGisLineString : SAbstractGisGeometry(SGisGeometryType.LineString) {
     /** 线段坐标 */
     @JsonSerialize(using = SGisPositionArraySerializer::class)
+    @JsonDeserialize(using = SGisPositionArrayDeserializer::class)
     var coordinates = ArrayList<SGisPosition>()
 
     /**

+ 63 - 5
persagy-kotlin-gis/src/main/kotlin/com/persagy/gis/entity/SGisPosition.kt

@@ -31,11 +31,69 @@ package com.persagy.gis.entity
  *
  * @author  庞利祥 <sybotan@126.com>
  */
-class SGisPosition(
+class SGisPosition(ax: Double = 0.0, ay: Double = 0.0, az: Double = 0.0)
+        : ArrayList<Double>() {
         /** x 坐标 */
-        var x: Double = 0.0,
+        var x: Double
+                get() {
+                        // 如果列表中有 1 个元素,则返回该元素
+                        return if (size >= 1) {
+                                this[0]
+                        } else {    // 否则返回 0
+                                0.0
+                        }
+                }
+                set(value) {
+                        // 如果列表中元素不足 3 个元素,则补够 3 个元素
+                        if (size < 3) {
+                                this.addAll(Array(3 - size){0.0})
+                        }
+
+                        this[0] = value
+                }
+
         /** y 坐标 */
-        var y: Double = 0.0,
+        var y: Double
+                get() {
+                        // 如果列表中有 2 个元素,则返回该元素,否则返回 0
+                        return if (size >= 2) {
+                                this[1]
+                        } else {
+                                0.0
+                        }
+                }
+                set(value) {
+                        // 如果列表中元素不足 3 个元素,则补够 3 个元素
+                        if (size < 3) {
+                                this.addAll(Array(3 - size){0.0})
+                        }
+
+                        this[1] = value
+                }
+
         /** z 坐标 */
-        var z: Double? = null
-)
+        var z: Double
+                get() {
+                        // 如果列表中有 3 个元素,则返回该元素,否则返回 0
+                        return if (size >= 3) {
+                                this[2]
+                        } else {
+                                0.0
+                        }
+                }
+                set(value) {
+                        // 如果列表中元素不足 3 个元素,则补够 3 个元素
+                        if (size < 3) {
+                                this.addAll(Array(3 - size){0.0})
+                        }
+
+                        this[2] = value
+                }
+
+        // 初始化
+        init {
+                add(ax)
+                add(ay)
+                add(az)
+        }
+}

+ 39 - 0
persagy-kotlin-gis/src/main/kotlin/com/persagy/gis/json/SGisPositionArray2Deserializer.kt

@@ -0,0 +1,39 @@
+package com.persagy.gis.json
+
+import com.fasterxml.jackson.core.JsonParser
+import com.fasterxml.jackson.core.JsonToken
+import com.fasterxml.jackson.databind.DeserializationContext
+import com.fasterxml.jackson.databind.JsonDeserializer
+import com.persagy.gis.entity.SGisPosition
+
+/**
+ * 自定义 SGisPosition 2 维数组对象反序列化器
+ *
+ * @author  张维新 <zhangweixin@sagacloud.cn>
+ */
+class SGisPositionArray2Deserializer : JsonDeserializer<ArrayList<ArrayList<SGisPosition>>>() {
+    /** SGisPosition 对象数组序列化器 */
+    private val deserializer = SGisPositionArrayDeserializer()
+
+    /**
+     *
+     *
+     * @return Deserialized value
+     */
+    override fun deserialize(parser: JsonParser, ctxt: DeserializationContext): ArrayList<ArrayList<SGisPosition>> {
+        // 存储读取的元素值
+        val valueList = ArrayList<ArrayList<SGisPosition>>()
+
+        var token = parser.nextToken()
+
+        // 依次读取数值型对象
+        do {
+            val pos = deserializer.deserialize(parser, ctxt)
+            valueList.add(pos)
+            token = parser.nextToken()
+        } while ((token != JsonToken.END_ARRAY))
+
+        // 根据读取的数值创建并返回 SGisPosition对象
+        return valueList
+    }
+}

+ 1 - 1
persagy-kotlin-gis/src/main/kotlin/com/persagy/gis/json/SGisPositionArray2Serializer.kt

@@ -34,7 +34,7 @@ import com.persagy.gis.entity.SGisPosition
 /**
  * 自定义 SGisPosition 数组对象序列化器
  *
- * @author  庞利祥 <sybotan@126.com>
+ * @author  庞利祥 <zhangweixin@sagacloud.cn>
  */
 class SGisPositionArray2Serializer : JsonSerializer<ArrayList<ArrayList<SGisPosition>>>() {
     /** SGisPosition 对象序列化器 */

+ 39 - 0
persagy-kotlin-gis/src/main/kotlin/com/persagy/gis/json/SGisPositionArray3Deserializer.kt

@@ -0,0 +1,39 @@
+package com.persagy.gis.json
+
+import com.fasterxml.jackson.core.JsonParser
+import com.fasterxml.jackson.core.JsonToken
+import com.fasterxml.jackson.databind.DeserializationContext
+import com.fasterxml.jackson.databind.JsonDeserializer
+import com.persagy.gis.entity.SGisPosition
+
+/**
+ * 自定义 SGisPosition 3 维数组对象反序列化器
+ *
+ * @author  庞利祥 <sybotan@126.com>
+ */
+class SGisPositionArray3Deserializer : JsonDeserializer<ArrayList<ArrayList<ArrayList<SGisPosition>>>>() {
+    /** SGisPosition 2 维对象数组序列化器 */
+    private val deserializer = SGisPositionArray2Deserializer()
+
+    /**
+     *
+     *
+     * @return Deserialized value
+     */
+    override fun deserialize(parser: JsonParser, ctxt: DeserializationContext): ArrayList<ArrayList<ArrayList<SGisPosition>>> {
+        // 存储读取的元素值
+        val valueList = ArrayList<ArrayList<ArrayList<SGisPosition>>>()
+
+        var token = parser.nextToken()
+
+        // 依次读取数值型对象
+        do {
+            val pos = deserializer.deserialize(parser, ctxt)
+            valueList.add(pos)
+            token = parser.nextToken()
+        } while ((token != JsonToken.END_ARRAY))
+
+        // 根据读取的数值创建并返回 SGisPosition对象
+        return valueList
+    }
+}

+ 43 - 0
persagy-kotlin-gis/src/main/kotlin/com/persagy/gis/json/SGisPositionArrayDeserializer.kt

@@ -0,0 +1,43 @@
+package com.persagy.gis.json
+
+import com.fasterxml.jackson.core.JsonParser
+import com.fasterxml.jackson.core.JsonToken
+import com.fasterxml.jackson.databind.DeserializationContext
+import com.fasterxml.jackson.databind.JsonDeserializer
+import com.persagy.gis.entity.SGisPosition
+
+/**
+ * 自定义 SGisPosition 数组对象反序列化器
+ *
+ * @author  庞利祥 <sybotan@126.com>
+ */
+class SGisPositionArrayDeserializer : JsonDeserializer<ArrayList<SGisPosition>>()  {
+    /** SGisPosition 对象序列化器 */
+    private val deserializer = SGisPositionDeserializer()
+
+    /**
+     *
+     *
+     * @return Deserialized value
+     */
+    override fun deserialize(parser: JsonParser, ctxt: DeserializationContext): ArrayList<SGisPosition> {
+        // 存储读取的元素值
+        val valueList = ArrayList<SGisPosition>()
+
+        var token = parser.nextToken()
+
+        // 依次读取数值型对象
+        do {
+            val pos = deserializer.deserialize(parser, ctxt)
+
+            if (pos != null) {
+                valueList.add(pos)
+            }
+
+            token = parser.nextToken()
+        } while ((token != JsonToken.END_ARRAY))
+
+        // 根据读取的数值创建并返回 SGisPosition对象
+        return valueList
+    }
+}

+ 1 - 1
persagy-kotlin-gis/src/main/kotlin/com/persagy/gis/json/SGisPositionArraySerializer.kt

@@ -34,7 +34,7 @@ import com.persagy.gis.entity.SGisPosition
 /**
  * 自定义 SGisPosition 数组对象序列化器
  *
- * @author  庞利祥 <sybotan@126.com>
+ * @author  张维新 <sybotan@126.com>
  */
 class SGisPositionArraySerializer : JsonSerializer<ArrayList<SGisPosition>>() {
     /** SGisPosition 对象序列化器 */

+ 48 - 0
persagy-kotlin-gis/src/main/kotlin/com/persagy/gis/json/SGisPositionDeserializer.kt

@@ -0,0 +1,48 @@
+package com.persagy.gis.json
+
+import com.fasterxml.jackson.core.JsonParser
+import com.fasterxml.jackson.core.JsonToken
+import com.fasterxml.jackson.databind.DeserializationContext
+import com.fasterxml.jackson.databind.JsonDeserializer
+import com.persagy.gis.entity.SGisPosition
+
+/**
+ *   反序列化
+ *
+ * @author  张维新 <zhangweixin@sagacloud.cn>
+ */
+class SGisPositionDeserializer : JsonDeserializer<SGisPosition>() {
+    /**
+     *
+     */
+    override fun deserialize(parser: JsonParser, ctxt: DeserializationContext): SGisPosition? {
+        // 如果不是数组类型,则返回空
+        if (!parser.isExpectedStartArrayToken) {
+            return null
+        }
+
+        // 存储读取的元素值
+        val valueList = ArrayList<Double>()
+
+        var token: JsonToken
+
+        // 依次读取数值型对象
+        do  {
+            token = parser.nextToken()
+
+            // 如果是数值类型,则保存该值
+            if (token.isNumeric) {
+                valueList.add(parser.valueAsDouble)
+            }
+        } while(token != JsonToken.END_ARRAY)
+
+        // 根据读取的数值创建并返回 SGisPosition对象
+        return when (valueList.size) {
+            0 -> null
+            1 -> SGisPosition(valueList[0])
+            2 -> SGisPosition(valueList[0], valueList[1])
+            else ->
+                SGisPosition(valueList[0], valueList[1], valueList[2])
+        }
+    }
+}

+ 2 - 3
persagy-kotlin-gis/src/main/kotlin/com/persagy/gis/json/SGisPositionSerializer.kt

@@ -38,10 +38,9 @@ import com.persagy.gis.entity.SGisPosition
  */
 class SGisPositionSerializer : JsonSerializer<SGisPosition>() {
     /**
-     * Method that can be called to ask implementation to serialize
-     * values of type this serializer handles.
+     * SGisPosition 类型对象被序列化时调用
      *
-     * @param   value           Value to serialize; can **not** be null.
+     * @param   value           要序列化的值,不能为空
      * @param   gen             Generator used to output resulting Json content
      * @param   serializers     Provider that can be used to get serializers for
      * serializing Objects value contains, if any.