我想通过在while循环中获取形状文件的点来创建Json对象。形状文件包含73个点。我在json oject中存储形状文件的点,并在循环中将对象添加到ArrayList中我从ArrayList中逐个检索对象并将其存储在JsonArray中,但这里的问题只是shapefile的最后一个记录点存储在arraylist中73次。如何解决这个问题请帮助我。
这是我的代码
try {
File file= new File(Environment.getDataDirectory().getAbsolutePath()+"/ne_50m_admin_0_tiny_countries.shp");
Long fileLength=file.length();
Log.d("FileLength is","file"+fileLength);
String shpFile = Environment.getDataDirectory().getAbsolutePath().toString()+"/ne_50m_admin_0_tiny_countries.shp";
//String shpFile = Environment.getDataDirectory().getAbsolutePath().toString()+"/ne_50m_admin_0_breakaway_disputed_areas.shp";
ShapeReader reader = new ShapeReader(shpFile, true);
ShapeType shpType=reader.getHeader().getShapeType();
JSONObject jObject = new JSONObject();
JSONObject wkidJson = new JSONObject();
jObject.put("objectIdFieldName","OBJECTID");
jObject.put("globalIdFieldName","");
jObject.put("geometryType",shpType);
wkidJson.put("wkid", new Integer(102100));
jObject.put("spatialReference",wkidJson);
JSONArray fieldsList = new JSONArray();
JSONObject idJson = new JSONObject();
JSONObject yJson = new JSONObject();
JSONObject xJson = new JSONObject();
idJson.put( "name","OBJECTID");
idJson.put("alias", "OBJECTID");
idJson.put("type", "esriFieldTypeOID");
yJson.put( "name","y");
yJson.put("alias", "y");
yJson.put("type", "esriFieldTypeDouble");
xJson.put( "name","x");
xJson.put("alias", "x");
xJson.put("type", "esriFieldTypeDouble");
fieldsList.put(idJson);
fieldsList.put(yJson);
fieldsList.put(xJson);
jObject.put("fields",fieldsList);
JSONObject geomJson = new JSONObject();
JSONObject attJson = new JSONObject();
JSONObject featuresJson = new JSONObject();
JSONArray featuresList = new JSONArray();
Log.d("Header info is","Header"+reader.getHeader().getFileLength());
recordshape=reader.new Record();
ArrayList a= new ArrayList();
while (reader.hasNext())
{
if(recordshape.end < fileLength)
{
if(shpType==ShapeType.POINT)
{
recordshape=reader.nextRecord();
int recordNumber=recordshape.number;
double Xcoordinate= recordshape.minX;
double Ycoordinate=recordshape.minY;
Log.d("Xcoordinate info is","Xcoordinate"+Xcoordinate);
Log.d("Ycoordinate info is","Ycoordinate"+Ycoordinate);
geomJson.put("x", Xcoordinate);
geomJson.put("y", Ycoordinate);
attJson.put("OBJECTID", recordNumber);
attJson.put("y", Ycoordinate);
attJson.put("x", Xcoordinate);
}
}
else
break;
featuresJson.put("geometry", geomJson);
featuresJson.put("attributes", attJson);
a.add(featuresJson);
Log.d("featuresJson info is","featuresJson"+featuresJson);
}
Log.d("featuresJson info is","featuresJson"+featuresJson);
Log.d("size info is","size"+a.size());
for(int i=0;i<a.size();i++)
{
featuresList.put(a.get(i));
}
Log.d("featuresList info is","featuresList"+featuresList);
jObject.put("features",featuresList);
String jsonString = jObject.toString();
jsonString = jsonString.replace("\\" , "");
FileWriter writeFile = new FileWriter(Environment.getDataDirectory().getAbsolutePath().toString()+"/Test.json");
BufferedWriter out = new BufferedWriter(writeFile);
out.write(jsonString);
out.flush();
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.d("Error","Message"+e.getMessage());
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.d("Exception","Message"+e.getMessage());
}
我想要的json格式是
{
"objectIdFieldName": "OBJECTID",
"globalIdFieldName": "",
"geometryType": "esriGeometryPoint",
"spatialReference": {
"wkid": 102100
},
"fields": [
{
"name": "OBJECTID",
"alias": "OBJECTID",
"type": "esriFieldTypeOID"
},
{
"name": "y",
"alias": "y",
"type": "esriFieldTypeDouble"
},
{
"name": "x",
"alias": "x",
"type": "esriFieldTypeDouble"
}
],
"features": [
{
"geometry": {
"x": -13021472.272599999,
"y": 4046325.7190999985
},
"attributes": {
"OBJECTID": 212,
"y": 4046325.7191,
"x": -13021472.2726
}
},
{
"geometry": {
"x": -13021124.9134,
"y": 4046747.3976000026
},
"attributes": {
"OBJECTID": 232,
"y": 4046747.3976,
"x": -13021124.9134
}
}
]
}
请帮帮我 感谢。
答案 0 :(得分:1)
,将值一遍又一遍地放在同一个json对象中。因此,当你jsonify它时,你的数组包含n *相同的对象。
您需要在循环的每次传递中创建要添加的新对象。
这三个声明必须在循环内移动:
JSONObject geomJson = new JSONObject();
JSONObject attJson = new JSONObject();
JSONObject featuresJson = new JSONObject();