WKT 字符串转为Geometry

作者: 曾经的追风少年 | 来源:发表于2017-04-14 16:18 被阅读744次

    在 Arcgis for android 中,并没有直接将 wkt 字符转化为 geometry 的接口,所以我们需要先将 wkt 字符先转化为arcgis可用的 json 字符串,再将 json 字符串转化为我们需要的 Geometry图形。

    1、Wkt → Json

    1、图形种类:图形分为POINT、MULTIPOINT、LINESTRING、MULTILINESTRING、POLYGON、MULTIPOLYGON这几种类型。

        POINT  ----  点
        MULTIPOINT ----  多个点
        LINESTRING ---- 线
        MULTILINESTRING ---- 多条线
        POLYGON ---- 多边形
        MULTIPOLYGON ---- 多个多边形
    

    对应的ArcGis对于不同类型所需的JSON格式也不相同。

    2、分别构建各种类型的实体类(根据实际需求)

    PointObject类(对应POINT):

    public class PointObject {  
        private double x;  
        private double y;  
        private HashMap<String, Integer> spatialReference;  
      
        public double getX() {  
            return x;  
        }  
        public void setX(double x) {  
            this.x = x;  
        }  
        public double getY() {  
            return y;  
        }  
        public void setY(double y) {  
            this.y = y;  
        }  
        public HashMap<String, Integer> getSpatialReference() {  
            return spatialReference;  
        }  
        public void setSpatialReference(HashMap<String, Integer> spatialReference) {  
            this.spatialReference = spatialReference;  
        }  
    }  
    

    MultiIPointObject类(对应MultiIPoint):

    public class MultiIPointObject {  
        private List<Double[]> points;  
        private HashMap<String, Integer> spatialReference;  
    
        public List<Double[]> getPoints() {  
            return points;  
        }  
        public void setPoints(List<Double[]> points) {  
            this.points = points;  
        }  
        public HashMap<String, Integer> getSpatialReference() {  
            return spatialReference;  
        }  
        public void setSpatialReference(HashMap<String, Integer> spatialReference) {  
            this.spatialReference = spatialReference;  
        }  
    }  
    

    LineStringObject类(对应 LineString):

    public class LineStringObject {  
        private List<List<Double[]>> paths;  
        private HashMap<String, Integer> spatialReference;  
      
        public List<List<Double[]>> getPaths() {  
            return paths;  
        }  
        public void setPaths(List<List<Double[]>> paths) {  
            this.paths = paths;  
        }  
        public HashMap<String, Integer> getSpatialReference() {  
            return spatialReference;  
        }  
        public void setSpatialReference(HashMap<String, Integer> spatialReference) {  
            this.spatialReference = spatialReference;  
        }  
    }  
    

    MultLinesStringObject类(对应 MultLinesString):

    public class MultLinesStringObject {  
        private List<List<Double[]>> rings;  
        private HashMap<String, Integer> spatialReference;  
      
        public List<List<Double[]>> getRings() {  
            return rings;  
        }  
        public void setRings(List<List<Double[]>> rings) {  
            this.rings = rings;  
        }  
        public HashMap<String, Integer> getSpatialReference() {  
            return spatialReference;  
        }  
        public void setSpatialReference(HashMap<String, Integer> spatialReference) {  
            this.spatialReference = spatialReference;  
        }  
    }  
    

    PolygonObject类(对应 Polygon 和 MULTIPOLYGON):

    public class PolygonObject {  
        private List<List<Double[]>> rings;  
        private HashMap<String, Integer> spatialReference;  
      
        public List<List<Double[]>> getRings() {  
            return rings;  
        }  
        public void setRings(List<List<Double[]>> rings) {  
            this.rings = rings;  
        }  
        public HashMap<String, Integer> getSpatialReference() {  
            return spatialReference;  
        }  
        public void setSpatialReference(HashMap<String, Integer> spatialReference) {  
            this.spatialReference = spatialReference;  
        }  
    }  
    

    3、开始转换(通过 Google 提供的 Gson.jar 进行 JSON转换)

    public class WKT {  
      
        /** 
         * 点 转换 JSON 
         * @param wkt 
         * @param wkid 
         * @return 
         */  
        public String getPOINTWktToJson(String wkt, int wkid) {  
            String[] strHead = wkt.split("\\(");  
            String strContent = strHead[1].substring(0, strHead[1].length() - 1);  
            String[] strResult = strContent.split(" ");  
            PointObject pointObject = new PointObject();  
            pointObject.setX(Double.parseDouble(strResult[0]));  
            pointObject.setY(Double.parseDouble(strResult[1]));  
            HashMap<String, Integer> spatialReference = new HashMap<String, Integer>();  
            spatialReference.put("wkid", wkid);  
            pointObject.setSpatialReference(spatialReference);  
            Gson gson = new Gson();  
            return gson.toJson(pointObject);  
        }  
      
        /** 
         * 多点 转换 JSON 
         * @param wkt 
         * @param wkid 
         * @return 
         */  
        public String getMULTIPOINTWktToJson(String wkt, int wkid) {  
            MultiIPointObject multiIPointObject = new MultiIPointObject();  
            String ToTailWkt = wkt.substring(0, wkt.length() - 1);  
            String[] strHead = ToTailWkt.split("\\(\\(");  
            String strMiddle = strHead[1].substring(0, strHead[1].length() - 1);  
            String[] strMiddles = strMiddle.split(",");  
            List<Double[]> list = new ArrayList<Double[]>();  
            for (int i = 0; i < strMiddles.length; i++) {  
                if (i == 0) {  
                    String item = strMiddles[i].substring(0,  
                            strMiddles[i].length() - 1);  
                    String[] items = item.split(" ");  
                    Double[] listResult = new Double[] {  
                            Double.parseDouble(items[0]),  
                            Double.parseDouble(items[1]) };  
                    list.add(listResult);  
                } else if (i == strMiddles.length) {  
                    String item = strMiddles[i]  
                            .substring(1, strMiddles[i].length());  
                    String[] items = item.split(" ");  
                    Double[] listResult = new Double[] {  
                            Double.parseDouble(items[0]),  
                            Double.parseDouble(items[1]) };  
                    list.add(listResult);  
                } else {  
                    String strItem = strMiddles[i].trim();  
                    String item = strItem.substring(1, strItem.length() - 1);  
                    String[] items = item.split(" ");  
                    Double[] listResult = new Double[] {  
                            Double.parseDouble(items[0]),  
                            Double.parseDouble(items[1]) };  
                    list.add(listResult);  
                }  
            }  
            HashMap<String, Integer> spatialReference = new HashMap<String, Integer>();  
            spatialReference.put("wkid", wkid);  
            multiIPointObject.setPoints(list);  
            multiIPointObject.setSpatialReference(spatialReference);  
            Gson gson = new Gson();  
            return gson.toJson(multiIPointObject);  
        }  
      
        /** 
         * 线 转换 JSON 
         * @param wkt 
         * @param wkid 
         * @return 
         */  
        public String getLINESTRINGWktToJson(String wkt, int wkid) {  
            LineStringObject lineStringObject = new LineStringObject();  
            List<List<Double[]>> lists = new ArrayList<List<Double[]>>();  
            List<Double[]> list = new ArrayList<Double[]>();  
            String[] strHead = wkt.split("\\(");  
            String strContent = strHead[1].substring(0, strHead[1].length() - 1);  
            String[] strResult = strContent.split(",");  
            for (int i = 0; i < strResult.length; i++) {  
                String itme = strResult[i].trim();  
                String[] items = itme.split(" ");  
                Double[] listResult = new Double[] { Double.parseDouble(items[0]),  
                        Double.parseDouble(items[1]) };  
                list.add(listResult);  
            }  
            lists.add(list);  
            HashMap<String, Integer> spatialReference = new HashMap<String, Integer>();  
            spatialReference.put("wkid", wkid);  
            lineStringObject.setPaths(lists);  
            lineStringObject.setSpatialReference(spatialReference);  
            Gson gson = new Gson();  
            return gson.toJson(lineStringObject);  
        }  
      
        /** 
         * 多线 转换 JSON 
         * @param wkt 
         * @param wkid 
         * @return 
         */  
        public String getMULTILINESTRINGWktToJson(String wkt, int wkid) {  
            MultLinesStringObject lineStringObject = new MultLinesStringObject();  
            List<List<Double[]>> lists = new ArrayList<List<Double[]>>();  
            String ToTailWkt = wkt.substring(0, wkt.length() - 1);  
            String[] strHead = ToTailWkt.split("\\(", 2);  
            String[] strList = strHead[1].split("\\),\\(");  
            for (int i = 0; i < strList.length; i++) {  
                String item = strList[i].trim();  
                item = item.substring(1, item.length() - 1);  
                String[] items = item.split(",");  
                List<Double[]> list = new ArrayList<Double[]>();  
                for (int j = 0; j < items.length; j++) {  
                    String jItem = items[j].trim();  
                    String[] jItems = jItem.split(" ");  
                    Double[] listResult = new Double[] {  
                            Double.parseDouble(jItems[0]),  
                            Double.parseDouble(jItems[1]) };  
                    list.add(listResult);  
                }  
                lists.add(list);  
            }  
            HashMap<String, Integer> spatialReference = new HashMap<String, Integer>();  
            spatialReference.put("wkid", wkid);  
            lineStringObject.setRings(lists);  
            lineStringObject.setSpatialReference(spatialReference);  
            Gson gson = new Gson();  
            return gson.toJson(lineStringObject);  
        }  
    
       /** 
         * 多边形 转换 JSON 
         * @param wkt 
         * @param wkid 
         * @return 
         */  
        public String getPOLYGONWktToJson(String wkt, int wkid) {  
            PolygonObject polygonObject = new PolygonObject();  
            List<List<Double[]>> lists = new ArrayList<List<Double[]>>();  
            String ToTailWkt = wkt.substring(0, wkt.length() - 1);  
            String[] strHead = ToTailWkt.split("\\(", 2);  
            String[] strList = strHead[1].split("\\), \\(");  
            for (int i = 0; i < strList.length; i++) {  
                String item = strList[i].trim();  
                item = item.substring(1, item.length() - 1);  
                String[] items = item.split(",");  
                List<Double[]> list = new ArrayList<Double[]>();  
                for (int j = 0; j < items.length; j++) {  
                    String jItem = items[j].trim();  
                    String[] jItems = jItem.split(" ");  
                    Double[] listResult = new Double[] {  
                            Double.parseDouble(jItems[0]),  
                            Double.parseDouble(jItems[1]) };  
                    list.add(listResult);  
                }  
                lists.add(list);  
            }  
            HashMap<String, Integer> spatialReference = new HashMap<String, Integer>();  
            spatialReference.put("wkid", wkid);  
            polygonObject.setRings(lists);  
            polygonObject.setSpatialReference(spatialReference);  
            Gson gson = new Gson();  
            return gson.toJson(polygonObject);  
        }  
      
       /** 
         * 多个多边形 转换 JSON 
         * @param wkt 
         * @param wkid 
         * @return 
         */  
        public String getMULTIPOLYGONWktToJson(String wkt, int wkid) {  
            PolygonObject polygonObject = new PolygonObject();  
            List<List<Double[]>> lists = new ArrayList<List<Double[]>>();  
      
            String ToTailWkt = wkt.substring(0, wkt.length() - 1);  
            String[] strHead = ToTailWkt.split("\\(", 2);  
            ToTailWkt = strHead[1].substring(0, strHead[1].length() - 1);  
            String[] strHeads = ToTailWkt.split("\\(", 2);  
            String[] strList = strHeads[1].split("\\), \\(");  
            if (strList.length == 1) {  
                for (int i = 0; i < strList.length; i++) {  
                    String item = strList[i].trim();  
                    item = item.substring(1, item.length() - 1);  
                    String[] items = item.split(",");  
                    List<Double[]> list = new ArrayList<Double[]>();  
                    for (int j = 0; j < items.length; j++) {  
                        String jItem = items[j].trim();  
                        String[] jItems = jItem.split(" ");  
                        Double[] listResult = new Double[] {  
                                Double.parseDouble(jItems[0]),  
                                Double.parseDouble(jItems[1]) };  
                        list.add(listResult);  
                    }  
                    lists.add(list);  
                }  
            } else {  
                for (int i = 0; i < strList.length; i++) {  
                    String item = strList[i].trim();  
                    item = item.substring(1, item.length() - 1);  
                    String[] items = item.split(",");  
                    List<Double[]> list = new ArrayList<Double[]>();  
                    for (int j = 1; j < items.length; j++) {  
                        String jItem = items[j].trim();  
                        String[] jItems = jItem.split(" ");  
                        Double[] listResult = new Double[] {  
                                Double.parseDouble(jItems[0]),  
                                Double.parseDouble(jItems[1]) };  
                        list.add(listResult);  
                    }  
                    lists.add(list);  
                }  
            }  
            HashMap<String, Integer> spatialReference = new HashMap<String, Integer>();  
            spatialReference.put("wkid", wkid);  
            polygonObject.setRings(lists);  
            polygonObject.setSpatialReference(spatialReference);  
            Gson gson = new Gson();  
            return gson.toJson(polygonObject);  
        }  
    }  
    

    4、在代码中使用,将获取到的 Json 转换为我们需要的图形。

    String geoJson = WKT.getLINESTRINGWktToJson(prjShapeStr, wkid);
    JsonFactory jsonFactory = new JsonFactory();
    JsonParser jsonParser = jsonFactory.createJsonParser(geoJson);
    MapGeometry mapGeometry = GeometryEngine.jsonToGeometry(jsonParser);
    Geometry geometry = mapGeometry.getGeometry();  
    

    5、转换完毕,获取到的 geometry 可以直接添加到 arcgis 动态图层中显示了。

    参考文章:http://blog.csdn.net/u014014578/article/details/21453727

    相关文章

      网友评论

      • wethereornot:请问 getLINESTRINGWktToJson(String wkt, int wkid)中 wkt是什么?有demo可以参考下么?
        曾经的追风少年:@wethereornot wkt参数是指 图形的 wkt格式字符串。例如:LINESTRING(3 4,10 50,20 25)

      本文标题:WKT 字符串转为Geometry

      本文链接:https://www.haomeiwen.com/subject/ceowattx.html