天天看點

ArcGIS For Android 解析WKT [支援多多邊形、島、洞]前言過程簡述WKT -> JsonJSON - > Geometry

前言

    使用Android Runtime SDK For Java讀寫ShapeFile檔案發現沒有可以直接調用的接口去實作功能,是以就用GeoTools開源的項目進行ShapeFile檔案的讀取,但是發現讀出來的圖形是ArcGIS無法識别的。是以就要求我将GeoTools讀出的圖形轉換成ArcGis能夠識别的圖形并存儲起來。

過程簡述

  1. 讀取ShapeFile檔案
  2. 将GeoTools擷取的Geometry轉換為WKT格式
  3. 将WKT轉換成ArcGIS能夠識别的Json格式
  4. 通過ArcGIS API中方法讀取Json轉換為可識别的Geometry

WKT -> Json

    首先我們要知道圖形分為:POINT、MULTIPOINT、LINESTRING、MULTILINESTRING、POLYGON、MULTIPOLYGON這幾種類型。對應的ArcGis對于不同類型所需的JSON格式也不相同。     首先我們先構造這幾種類型的實體類:     PointObject類:

package com.wkt;

import java.util.HashMap;

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類:

package com.wkt;

import java.util.HashMap;
import java.util.List;

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類:

package com.wkt;

import java.util.HashMap;
import java.util.List;

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類:

package com.wkt;

import java.util.HashMap;
import java.util.List;

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類:

package com.wkt;

import java.util.HashMap;
import java.util.List;

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;
	}

}
           

    以上就是整個所有類型的實體類了,我通過Google提供的Gson.jar進行JSON轉換,得到JSON,下面是不同類型的圖形Json轉換代碼:

package com.wkt;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import com.google.gson.Gson;

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);

	}

	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);
	}

	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);

	}

}
           

JSON - > Geometry

    以上JSON轉換完畢後再ArcGis For Android API中有一個方法可以将JSON直接轉換為 Geometry。

MapGeometry mapGeometry = GeometryEngine.jsonToGeometry(jsonParser);
Geometry geometry = mapGeometry.getGeometry();
           
以上就将WKT轉換成了ArcGIS能夠操作的Geometry了,通過這種方式得到的Geometry哪怕是帶了島或者洞或者多多邊形的圖形都可以正常顯示。
           

此篇文章為作者原創,如要轉發請注明原文位址!