WKT 字符串转为Geometry

在 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,600评论 18 139
  • Java基础常见英语词汇(共70个)['ɔbdʒekt] ['ɔ:rientid]导向的 ...
    今夜子辰阅读 3,265评论 1 34
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,029评论 4 62
  • 思·皆空怒 诺之殇 阴雨连绵日不出,草枯叶落化尘土。 固应守...
    诺之殇佳音阅读 246评论 0 0
  • 早上在车上听到一个段子,说孕妇推算肚里是天秤座宝宝后开始苦口婆心的胎教:孩儿啊,为娘提前给你几句忠告,等你生出来就...
    李馨阅读 698评论 0 4