ArcGIS Engine中 IGeometry和Json字符串的相互转换

来源:互联网 发布:农村淘宝官网电话 编辑:程序博客网 时间:2024/05/17 22:34

 转: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字符转

 
[csharp] view plain copy
  1. /// <summary>  
  2.        /// IGeometry转成JSON字符串  
  3.        /// </summary>  
  4.        public static string GeometryToJsonString(ESRI.ArcGIS.Geometry.IGeometry geometry)  
  5.        {  
  6.            ESRI.ArcGIS.esriSystem.IJSONWriter jsonWriter = new ESRI.ArcGIS.esriSystem.JSONWriterClass();  
  7.            jsonWriter.WriteToString();  
  8.   
  9.            ESRI.ArcGIS.Geometry.JSONConverterGeometryClass jsonCon = new ESRI.ArcGIS.Geometry.JSONConverterGeometryClass();  
  10.            jsonCon.WriteGeometry(jsonWriter, null, geometry, false);  
  11.   
  12.            return Encoding.UTF8.GetString(jsonWriter.GetStringBuffer());  
  13.        }  

1.2 Json字符转解析成IGeometry

[csharp] view plain copy
  1. /// <summary>  
  2. /// JSON字符串转成IGeometry  
  3. /// </summary>  
  4. public static ESRI.ArcGIS.Geometry.IGeometry GeometryFromJsonString(string strJson, ESRI.ArcGIS.Geometry.esriGeometryType type)  
  5. {  
  6.     return GeometryFromJsonString(strJson, type, falsefalse);  
  7. }  
  8.   
  9. /// <summary>  
  10. /// JSON字符串转成IGeometry  
  11. /// </summary>  
  12. public static ESRI.ArcGIS.Geometry.IGeometry GeometryFromJsonString(string strJson, ESRI.ArcGIS.Geometry.esriGeometryType type,  
  13.     bool bHasZ, bool bHasM)  
  14. {  
  15.     ESRI.ArcGIS.esriSystem.IJSONReader jsonReader = new ESRI.ArcGIS.esriSystem.JSONReaderClass();  
  16.     jsonReader.ReadFromString(strJson);  
  17.   
  18.     ESRI.ArcGIS.Geometry.JSONConverterGeometryClass jsonCon = new ESRI.ArcGIS.Geometry.JSONConverterGeometryClass();  
  19.     return jsonCon.ReadGeometry(jsonReader, type, bHasZ, bHasM);  
  20. }  

2.包含IGeometry的实体类和Json字符串的相互转换

包含IGeometry的实体类和Json字符串的转换,除了需要使用到上面的对象外,还需要使用AE中描述JSON对象的类ESRI.ArcGIS.esriSystem.IJSONObject(对于集合则为ESRI.ArcGIS.esriSystem.IJSONArray)

2.1 实体类

随便定义一个简单的实体类,包括一个项目编号普通属性和一个项目位置点图形属性。

[csharp] view plain copy
  1. //一个简单的实体类          
  2. public class XMInfo  
  3.        {  
  4.            public string XMBH { getset; }  
  5.            public ESRI.ArcGIS.Geometry.IPoint Location { getset; }  
  6.        }  

2.2 实体类转换为Json字符串

[csharp] view plain copy
  1. /// <summary>  
  2.       /// 实体类转换为Json字符串  
  3.       /// </summary>  
  4.       public static string XMInfoToJson(XMInfo objXMInfo)  
  5.       {  
  6.           //先将图形转为json字符串。  
  7.           string strJsonLocation = GeometryToJsonString(objXMInfo.Location);  
  8.           //将图形json字符串转为IJSONObject,注意使用IJSONReader2,而不是IJSONReader   
  9.           ESRI.ArcGIS.esriSystem.IJSONReader2 jsonReader = new ESRI.ArcGIS.esriSystem.JSONReaderClass();  
  10.           ESRI.ArcGIS.esriSystem.IJSONObject jsonObjLocation = jsonReader.ParseJSONString(strJsonLocation) as ESRI.ArcGIS.esriSystem.IJSONObject;  
  11.   
  12.           //将实体中的属性和图形填充至IJSONObject中  
  13.           ESRI.ArcGIS.esriSystem.IJSONObject jsonObjRet = new ESRI.ArcGIS.esriSystem.JSONObjectClass();  
  14.           jsonObjRet.AddString("XMBH", objXMInfo.XMBH);  
  15.           jsonObjRet.AddJSONObject("Location", jsonObjLocation);  
  16.   
  17.           return jsonObjRet.ToJSONString(null);  
  18.       }  

 

2.3 Json字符串解析成实体类

[csharp] view plain copy
  1. /// <summary>  
  2.        /// Json字符串解析为实体类  
  3.        /// </summary>  
  4.        public static XMInfo XMInfoFromJson(string strJson)  
  5.        {  
  6.            //先从json字符串转换成IJSONObject,注意使用IJSONReader2,而不是IJSONReader   
  7.            ESRI.ArcGIS.esriSystem.IJSONReader2 jsonReader = new ESRI.ArcGIS.esriSystem.JSONReaderClass();  
  8.            ESRI.ArcGIS.esriSystem.IJSONObject jsonObj = jsonReader.ParseJSONString(strJson) as ESRI.ArcGIS.esriSystem.IJSONObject;  
  9.   
  10.            //再从IJSONObject中取出需要的值  
  11.            string strXMBH = null;  
  12.            ESRI.ArcGIS.Geometry.IPoint pntLocation = null;  
  13.            ESRI.ArcGIS.esriSystem.IJSONObject jsonObjXMLocation = null;  
  14.   
  15.            jsonObj.TryGetValueAsString("XMBH"out strXMBH);  
  16.            jsonObj.TryGetValueAsObject("Location"out jsonObjXMLocation);  
  17.   
  18.   
  19.            //对于GEOMETRY,可以使用之前的GeometryFromJsonString方法将字符串再转换成图形  
  20.            pntLocation = GeometryFromJsonString(jsonObjXMLocation.ToJSONString(null), ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint)  
  21.                as ESRI.ArcGIS.Geometry.IPoint;  
  22.   
  23.            XMInfo xmInfo = new XMInfo()  
  24.            {  
  25.                XMBH = strXMBH,  
  26.                Location = pntLocation,  
  27.            };  
  28.            return xmInfo;  
  29.        }  

 

2.4 测试一下吧

[csharp] view plain copy
  1. /// <summary>  
  2.        /// 这是一个测试方法。。。  
  3.        /// </summary>  
  4.        public static void TestXMInfoJson()  
  5.        {  
  6.            XMInfo objXM = new XMInfo();  
  7.            objXM.XMBH = "13";  
  8.            objXM.Location = new ESRI.ArcGIS.Geometry.PointClass();  
  9.            objXM.Location.PutCoords(111.11, 222.22);  
  10.            objXM.Location.SpatialReference = new ESRI.ArcGIS.Geometry.SpatialReferenceEnvironmentClass().CreateSpatialReference(4326);  
  11.   
  12.            //测试实体转换成Json字符串  
  13.            string strJsonXM = JsonHelper.XMInfoToJson(objXM);  
  14.   
  15.            //测试字符串解析成实体  
  16.            XMInfo objXM2 = JsonHelper.XMInfoFromJson(strJsonXM);  
  17.