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?

16
demandé sur Eric 2013-02-27 13:05:26

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!

24
répondu Jon Bellamy 2013-04-18 15:30:01

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
8
répondu Serge Belov 2015-03-22 22:31:03

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.

1
répondu André Sobreiro 2014-05-22 14:29:49

vous devez ajouter une référence aux assemblages mentionnés ci-dessus. Le post suivant peut vous aider lien , link2

1
répondu phipex 2014-08-25 19:43:20

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.

1
répondu Mark Glasgow 2017-08-17 04:57:12

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

0
répondu Sergei Zinovyev 2017-04-10 17:04:51