-----------------------------------

Acquista i software ArcGIS tramite Studio A&T srl, rivenditore autorizzato dei prodotti Esri.

I migliori software GIS, il miglior supporto tecnico!

I migliori software GIS, il miglior supporto tecnico!
Azienda operante nel settore GIS dal 2001, specializzata nell’utilizzo della tecnologia ArcGIS e aderente ai programmi Esri Italia Business Network ed Esri Partner Network

-----------------------------------



sabato 3 ottobre 2009

Store IGeometry in SQL server 2008

Problema: supponiamo di avere un web service che crea IGeometry utilizzando ArcGIS Server e di voler esporre il dato geometrico per SQL Server 2008 (Express).


Soluzione: per ottimizzare il passaggio dei dati dal web service al client conviene passarli in wkb (well-known binary). Per questa operazione ci viene incontro un metodo degli ArcObjects: CreateWkbVariantFromGeometry.


Con il seguente codice convertiamo una IGeometry nella rappresentazione wkb.


IPolygon polygon = GetIGeometry();


IGeometryFactory3 geometryFactory = (IGeometryFactory3)serverContext.CreateObject("esriGeometry.GeometryEnvironment");


byte[] polygonWKB = geometryFactory.CreateWkbVariantFromGeometry(polygon) as byte[];



Lato client: creiamo un SqlGeometry con il metodo SQL server 2008 STGeomFromWKB e prima di memorizzare la geometria la validiamo con il metodo MakeValidGeographyFromGeometry della libreria SQL Server Spatial Tools


System.Data.SqlTypes.SqlBytes polygonWKB = new System.Data.SqlTypes.SqlBytes(PolygonWKB);


SqlGeometry sqlGeometry = SqlGeometry.STGeomFromWKB(polygonWKB, 4326);



SqlGeography sqlGeography = Functions.MakeValidGeographyFromGeometry(sqlGeometry);



using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SQLServerConnectionString"].ConnectionString))


{


conn.Open();


string sqlCommandText = "insert into [YourTable]([Punto],[Poligono]) Values(@pPunto,@pPoligono)";



SqlGeography punto = SqlGeography.Point(lat, lon, 4326);


using (SqlCommand sqlCommand = new SqlCommand(sqlCommandText, conn))


{


sqlCommand.CommandType = CommandType.Text;


sqlCommand.Parameters.Add(new SqlParameter("@pPunto", punto) { UdtTypeName = "Geography" });


sqlCommand.Parameters.Add(new SqlParameter("@pPoligono", sqlGeometry) { UdtTypeName = "Geography" });


sqlCommand.ExecuteNonQuery();



}



}

Nessun commento: