转:http://blog.csdn.net/jamessunshine/article/details/44243589
环境:ArcGIS 10
1. IGeometry和Json字符串的相互转换
将 ESRI.ArcGIS.Geometry.IGeometry转换成Json字符串,搜索网上很多都是字符串拼接的,偶然发现有现成的类可以转换,主要使用ESRI.ArcGIS.Geometry.JSONConverterGeometryClass、ESRI.ArcGIS.esriSystem.IJSONWriter、ESRI.ArcGIS.esriSystem.IJSONReader进行相互转换。
1.1 IGeometry转换成Json字符转
- /// <summary>
- /// IGeometry转成JSON字符串
- /// </summary>
- public static string GeometryToJsonString(ESRI.ArcGIS.Geometry.IGeometry geometry)
- {
- ESRI.ArcGIS.esriSystem.IJSONWriter jsonWriter = new ESRI.ArcGIS.esriSystem.JSONWriterClass();
- jsonWriter.WriteToString();
- ESRI.ArcGIS.Geometry.JSONConverterGeometryClass jsonCon = new ESRI.ArcGIS.Geometry.JSONConverterGeometryClass();
- jsonCon.WriteGeometry(jsonWriter, null, geometry, false);
- return Encoding.UTF8.GetString(jsonWriter.GetStringBuffer());
- }
1.2 Json字符转解析成IGeometry
- /// <summary>
- /// JSON字符串转成IGeometry
- /// </summary>
- public static ESRI.ArcGIS.Geometry.IGeometry GeometryFromJsonString(string strJson, ESRI.ArcGIS.Geometry.esriGeometryType type)
- {
- return GeometryFromJsonString(strJson, type, false, false);
- }
- /// <summary>
- /// JSON字符串转成IGeometry
- /// </summary>
- public static ESRI.ArcGIS.Geometry.IGeometry GeometryFromJsonString(string strJson, ESRI.ArcGIS.Geometry.esriGeometryType type,
- bool bHasZ, bool bHasM)
- {
- ESRI.ArcGIS.esriSystem.IJSONReader jsonReader = new ESRI.ArcGIS.esriSystem.JSONReaderClass();
- jsonReader.ReadFromString(strJson);
- ESRI.ArcGIS.Geometry.JSONConverterGeometryClass jsonCon = new ESRI.ArcGIS.Geometry.JSONConverterGeometryClass();
- return jsonCon.ReadGeometry(jsonReader, type, bHasZ, bHasM);
- }
2.包含IGeometry的实体类和Json字符串的相互转换
包含IGeometry的实体类和Json字符串的转换,除了需要使用到上面的对象外,还需要使用AE中描述JSON对象的类ESRI.ArcGIS.esriSystem.IJSONObject(对于集合则为ESRI.ArcGIS.esriSystem.IJSONArray)
2.1 实体类
随便定义一个简单的实体类,包括一个项目编号普通属性和一个项目位置点图形属性。
- //一个简单的实体类
- public class XMInfo
- {
- public string XMBH { get; set; }
- public ESRI.ArcGIS.Geometry.IPoint Location { get; set; }
- }
2.2 实体类转换为Json字符串
- /// <summary>
- /// 实体类转换为Json字符串
- /// </summary>
- public static string XMInfoToJson(XMInfo objXMInfo)
- {
- //先将图形转为json字符串。
- string strJsonLocation = GeometryToJsonString(objXMInfo.Location);
- //将图形json字符串转为IJSONObject,注意使用IJSONReader2,而不是IJSONReader
- ESRI.ArcGIS.esriSystem.IJSONReader2 jsonReader = new ESRI.ArcGIS.esriSystem.JSONReaderClass();
- ESRI.ArcGIS.esriSystem.IJSONObject jsonObjLocation = jsonReader.ParseJSONString(strJsonLocation) as ESRI.ArcGIS.esriSystem.IJSONObject;
- //将实体中的属性和图形填充至IJSONObject中
- ESRI.ArcGIS.esriSystem.IJSONObject jsonObjRet = new ESRI.ArcGIS.esriSystem.JSONObjectClass();
- jsonObjRet.AddString("XMBH", objXMInfo.XMBH);
- jsonObjRet.AddJSONObject("Location", jsonObjLocation);
- return jsonObjRet.ToJSONString(null);
- }
2.3 Json字符串解析成实体类
- /// <summary>
- /// Json字符串解析为实体类
- /// </summary>
- public static XMInfo XMInfoFromJson(string strJson)
- {
- //先从json字符串转换成IJSONObject,注意使用IJSONReader2,而不是IJSONReader
- ESRI.ArcGIS.esriSystem.IJSONReader2 jsonReader = new ESRI.ArcGIS.esriSystem.JSONReaderClass();
- ESRI.ArcGIS.esriSystem.IJSONObject jsonObj = jsonReader.ParseJSONString(strJson) as ESRI.ArcGIS.esriSystem.IJSONObject;
- //再从IJSONObject中取出需要的值
- string strXMBH = null;
- ESRI.ArcGIS.Geometry.IPoint pntLocation = null;
- ESRI.ArcGIS.esriSystem.IJSONObject jsonObjXMLocation = null;
- jsonObj.TryGetValueAsString("XMBH", out strXMBH);
- jsonObj.TryGetValueAsObject("Location", out jsonObjXMLocation);
- //对于GEOMETRY,可以使用之前的GeometryFromJsonString方法将字符串再转换成图形
- pntLocation = GeometryFromJsonString(jsonObjXMLocation.ToJSONString(null), ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint)
- as ESRI.ArcGIS.Geometry.IPoint;
- XMInfo xmInfo = new XMInfo()
- {
- XMBH = strXMBH,
- Location = pntLocation,
- };
- return xmInfo;
- }
2.4 测试一下吧
- /// <summary>
- /// 这是一个测试方法。。。
- /// </summary>
- public static void TestXMInfoJson()
- {
- XMInfo objXM = new XMInfo();
- objXM.XMBH = "13";
- objXM.Location = new ESRI.ArcGIS.Geometry.PointClass();
- objXM.Location.PutCoords(111.11, 222.22);
- objXM.Location.SpatialReference = new ESRI.ArcGIS.Geometry.SpatialReferenceEnvironmentClass().CreateSpatialReference(4326);
- //测试实体转换成Json字符串
- string strJsonXM = JsonHelper.XMInfoToJson(objXM);
- //测试字符串解析成实体
- XMInfo objXM2 = JsonHelper.XMInfoFromJson(strJsonXM);