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?
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.