sqlserver multipolygon linestring georeferenciacion geograficas coordenadas sql-server c#-4.0 gis geospatial spatial

sql server - multipolygon - ¿Geografía sql a dbgeography?



sql server polygon (6)

Cuando el rendimiento es importante, se debe utilizar el binario conocido en lugar del texto conocido:

var newGeography = DbGeography.FromBinary(theGeography.STAsBinary().Value);

Hay una sobrecarga utilizando un SRID, si eso es importante. En mi prueba simple con 1.000 polígonos razonablemente complicados, el enfoque basado en binarios es 4 veces más rápido que el basado en texto:

* Binary-based conversion Run 1: 1948 Run 2: 1944 Run 3: 1959 Run 4: 1979 Run 5: 1988 Average: 1963.6 * Text-based conversion Run 1: 8527 Run 2: 8553 Run 3: 8596 Run 4: 8535 Run 5: 8496 Average: 8541.4

Tal vez me esté perdiendo algo. Tengo una columna de servidor SQL del tipo de datos "Geografía".

Quiero usar el tipo DbGeography en mi código c #. ¿Alguna forma de emitir o convertir la geografía de sql a dbgeography?


Debe agregar una referencia a los ensamblajes como se mencionó anteriormente. La siguiente publicación puede ayudarte a link , link2


Encontré esto como una solución de trabajo:

int coordSys = DbGeography.DefaultCoordinateSystemId; // 4326; SqlGeography g = SqlGeography.Point(lat, lon, coordSys); return DbSpatialServices.Default.GeographyFromProviderValue(g);

No se serializa / convierte a cadena (WKT) o binario (WKB) que mata el rendimiento.

Me está funcionando en EF 6.1.3, SqlServer 2016 SP1 y Microsoft.SqlServer.Types.14.0.314.76


La solución provista parece estar bien si no está ejecutando EF6. Con las primeras versiones, está bien, pero con EF6, no deberíamos hacer referencias a este ensamblaje. Se vuelve EF litle loco.


Lo siento por la respuesta tardía, pero vi esto mientras buscaba algo más.

Simplemente haga lo siguiente:

SqlGeography theGeography; int srid = 4326; // or alternative DbGeography newGeography = DbGeography.FromText(theGeography.ToString(), srid);

Para revertirlo:

DbGeography theGeography; SqlGeography newGeography = SqlGeography.Parse(theGeography.AsText()).MakeValid();

¡Espero que ayude!


Según mi lectura de EntityFramework.SqlServer.dll en ILSpy, creo que la forma más rápida de convertir de SqlGeography a DbGeography es:

var dbGeo = System.Data.Entity.SqlServer.SqlSpatialServices.Default.GeographyFromProviderValue(sqlGeo);

Este método tiene la ventaja de que no se requieren conversiones y análisis binarios. Simplemente devuelve una DbGeography utilizando SqlGeography como el valor del proveedor interno.