la géographie de sql à dbgeography?
peut-être que je rate quelque chose. J'ai une colonne sql server du type de données "Géographie".
je veux utiliser le type DbGeography dans mon code C. Un moyen de passer de la géographie de sql à la géographie de dbgeography?
6 réponses
désolé pour la réponse tardive - mais j'ai vu ça en cherchant autre chose.
simplement faire ce qui suit:
SqlGeography theGeography;
int srid = 4326; // or alternative
DbGeography newGeography = DbGeography.FromText(theGeography.ToString(), srid);
pour l'Inverser:
DbGeography theGeography;
SqlGeography newGeography = SqlGeography.Parse(theGeography.AsText()).MakeValid();
Espère que ça aide!
lorsque la performance est d'une importance quelconque, le binaire bien connu devrait être utilisé à la place du texte bien connu:
var newGeography = DbGeography.FromBinary(theGeography.STAsBinary().Value);
il y a une surcharge en utilisant un SRID, si cela est important. Dans mon test simple avec un 1 000 polygones raisonnablement compliqués l'approche binaire est 4 fois plus rapide que l'approche textuelle:
* 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
la solution fournie semble correcte Si vous n'utilisez pas EF6. Avec les premières versions, c'est bien, mais avec EF6, on ne devrait pas faire de références à cette assemblée. Ça rend EF litle dingue.
basé sur ma lecture D'Entitefram Framework.SqlServer.dll dans ILSpy, je crois que le moyen le plus rapide de convertir des SqlGeography en DbGeography est:
var dbGeo = System.Data.Entity.SqlServer.SqlSpatialServices.Default.GeographyFromProviderValue(sqlGeo);
cette méthode a l'avantage qu'aucune conversion binaire et parsing n'est nécessaire. Il renvoie simplement une DbGeography en utilisant la SqlGeography comme valeur interne du fournisseur.
j'ai trouvé ceci comme une solution de travail:
int coordSys = DbGeography.DefaultCoordinateSystemId; // 4326;
SqlGeography g = SqlGeography.Point(lat, lon, coordSys);
return DbSpatialServices.Default.GeographyFromProviderValue(g);
Pas de sérialisation/conversion de chaîne de caractères (WKT) ou binaire (WKB) qui tuent les performances.
il travaille pour moi sur EF 6.1.3, SqlServer 2016 SP1 et Microsoft.SqlServer.Type.14.0.314.76