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[];
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:
Posta un commento