前言
使用Android Runtime SDK For Java讀寫ShapeFile檔案發現沒有可以直接調用的接口去實作功能,是以就用GeoTools開源的項目進行ShapeFile檔案的讀取,但是發現讀出來的圖形是ArcGIS無法識别的。是以就要求我将GeoTools讀出的圖形轉換成ArcGis能夠識别的圖形并存儲起來。
過程簡述
- 讀取ShapeFile檔案
- 将GeoTools擷取的Geometry轉換為WKT格式
- 将WKT轉換成ArcGIS能夠識别的Json格式
- 通過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哪怕是帶了島或者洞或者多多邊形的圖形都可以正常顯示。
此篇文章為作者原創,如要轉發請注明原文位址!