Quelle est la meilleure façon de stocker les coordonnées (longitude / latitude, de Google Maps) dans SQL Server?

StackOverflow https://stackoverflow.com/questions/551894

Question

Je suis la conception d'une table dans SQL Server 2008 qui stockera une liste d'utilisateurs et Google Maps coordonnées (longitude et latitude).

Vais-je besoin de deux champs, ou peut-il être fait avec 1?

Quel est le meilleur (ou le plus courant) de type de données à utiliser pour stocker ce type de données?

Était-ce utile?

La solution

Jetez un oeil à la nouvelle des données spatiales types qui ont été introduites dans SQL Server 2008. Ils sont conçus pour ce type de tâche et de faire l'indexation et l'interrogation beaucoup plus facile et plus efficace.

Plus d'informations:

Autres conseils

Fair Warning! Avant de prendre les conseils d'utiliser le type geography, assurez-vous que vous ne prévoyez pas d'utiliser LINQ ou Entity Framework pour accéder aux données, car il est pas pris en charge (à partir de Novembre 2010) et vous serez triste!

  

Mise à jour juillet 2017

     

Pour ceux qui lisent cette réponse maintenant, il est obsolète car il fait référence à pile technologique avec effet rétroactif. Voir les commentaires pour plus de détails.

Je ne connais pas la réponse pour SQL Server, mais ...

MySQL enregistrer FLOAT( 10, 6 )

Telle est la recommandation officielle de la Google documentation développeur .

CREATE TABLE `coords` (
  `lat` FLOAT( 10, 6 ) NOT NULL ,
  `lng` FLOAT( 10, 6 ) NOT NULL ,
) ENGINE = MYISAM ;

Je déteste être un contre-courant à ceux qui ont dit « ici est un nouveau type, nous allons l'utiliser ». Les nouveaux types spatiaux SQL Server 2008 ont des avantages à ce - à savoir l'efficacité, mais vous ne pouvez pas dire aveuglément toujours utiliser ce type. Cela dépend vraiment des plus gros problèmes d'image.

À titre d'exemple, l'intégration. Ce type a un type de equivilent en .Net - mais qu'en est-interop? Qu'en est-il soutenir ou d'étendre les anciennes versions de .Net? Qu'en est-il d'exposer ce type à travers la couche de service à d'autres plates-formes? Qu'en est-il la normalisation des données - peut-être vous êtes intéressé par lat ou tant que morceaux autonomes d'information. Peut-être que vous avez déjà écrit une logique métier complexe à gérer latitude / longitude.

Je ne dis pas que vous ne devriez pas utiliser le type spatial - dans de nombreux cas, vous devriez. Je vous devriez dire poser des questions plus critiques avant d'aller dans cette voie. Pour moi de répondre à votre question, je aurais besoin plus précisément pour en savoir plus sur votre situation.

Le stockage long / lat séparément ou dans un type spatial sont à la fois des solutions viables, et on peut être préférable à l'autre en fonction de votre situation.

La façon dont je le fais: je stocker les latitude et longitude , puis-je avoir une troisième colonne qui est un type de géographie automatique dérivée des deux 1ères colonnes. Le tableau ressemble à ceci:

CREATE TABLE [dbo].[Geopoint]
(
    [GeopointId] BIGINT NOT NULL PRIMARY KEY IDENTITY, 
    [Latitude] float NOT NULL, 
    [Longitude] float NOT NULL, 
    [ts] ROWVERSION NOT NULL, 
    [GeographyPoint]  AS ([geography]::STGeomFromText(((('POINT('+CONVERT([varchar](20),[Longitude]))+' ')+CONVERT([varchar](20),[Latitude]))+')',(4326))) 
)

Cela vous donne la flexibilité des requêtes spatiales sur la colonne de Geopoint et vous pouvez également récupérer les valeurs de latitude et de longitude que vous avez besoin pour l'affichage ou l'extraction à des fins csv.

Qu'est-ce que vous voulez faire est de stocker la latitude et la longitude du nouveau SQL2008 type spatial -.> GEOGRAPHIE

Voici une capture d'écran d'une table, que j'ai.

alt texte http://img20.imageshack.us/img20/6839/zipcodetable.png

Dans ce tableau, nous avons deux champs qui stockent des données de géographie.

  • Limite: tel est le polygone qui est la limite du code
  • CentrePoint:. C'est la latitude / point de longitude qui représente le point milieu visuel de ce polygone

La principale raison pour laquelle vous souhaitez enregistrer dans la base de données en tant que type geography est donc vous pouvez alors tirer parti de toutes les méthodes SPATIAL off - ce> par exemple. Point à Poly, distance entre deux points, etc.

BTW, nous utilisons l'API de Google Maps pour récupérer des données lat / long et stockons que dans notre Sql 2008 DB -. Si cette méthode fonctionne

SQL Server supporte les informations relatives spatiale. Vous pouvez voir plus http://www.microsoft.com/ SQLServer / 2008 / fr / fr / data.aspx-spatiale .

Alternativly vous pouvez stocker les informations sous forme de deux champs de base, généralement un flotteur est le type de données standard rapporté par la plupart des appareils et est suffisamment précis pour un pouce ou deux - plus que suffisant pour Google Maps.

  

NOTE : Ceci est une réponse récente basée sur le serveur SQL récentes, mises à jour pile .NET

latitute et la longitude de Google Maps doit être stocké sous forme de données point (note du capital P) dans le serveur SQL sous type de données géographiques.

En supposant que vos données actuelles sont stockées dans une Sample de table varchar sous les colonnes lat et lon, ci-dessous requête vous aider à convertir à la géographie

alter table Sample add latlong geography
go
update Sample set latlong= geography::Point(lat,lon,4326)
go

PS: La prochaine fois que vous faites une sélection sur cette table avec des données géographiques, à l'exception de l'onglet Résultats et messages, vous obtiendrez également onglet Résultats spatiaux comme ci-dessous pour la visualisation

Si vous utilisez Entity Framework 5 DbGeography. Exemple de MSDN:

public class University  
{ 
    public int UniversityID { get; set; } 
    public string Name { get; set; } 
    public DbGeography Location { get; set; } 
}

public partial class UniversityContext : DbContext 
{ 
    public DbSet<University> Universities { get; set; } 
}

using (var context = new UniversityContext ()) 
{ 
    context.Universities.Add(new University() 
        { 
            Name = "Graphic Design Institute", 
            Location = DbGeography.FromText("POINT(-122.336106 47.605049)"), 
        }); 

    context. Universities.Add(new University() 
        { 
            Name = "School of Fine Art", 
            Location = DbGeography.FromText("POINT(-122.335197 47.646711)"), 
        }); 

    context.SaveChanges(); 

    var myLocation = DbGeography.FromText("POINT(-122.296623 47.640405)"); 

    var university = (from u in context.Universities 
                        orderby u.Location.Distance(myLocation) 
                        select u).FirstOrDefault(); 

    Console.WriteLine( 
        "The closest University to you is: {0}.", 
        university.Name); 
}

https://msdn.microsoft. com / fr-fr / bibliothèque / hh859721 (v = vs.113) .aspx

Quelque chose que je débattais avec alors je commencé à utiliser DbGeography était le coordinateSystemId. Voir la réponse ci-dessous pour une excellente explication et source pour le code ci-dessous.

public class GeoHelper
{
    public const int SridGoogleMaps = 4326;
    public const int SridCustomMap = 3857;

    public static DbGeography FromLatLng(double lat, double lng)
    {
        return DbGeography.PointFromText(
            "POINT("
            + lng.ToString() + " "
            + lat.ToString() + ")",
            SridGoogleMaps);
    }
}

https://stackoverflow.com/a/25563269/3850405

Si vous allez juste pour le remplacer dans une URL, je suppose un champ ferait - de sorte que vous pouvez former une URL comme

http://maps.google.co.uk/maps?q=12.345678,12.345678&z=6

mais comme il est deux données, je les stocker dans des champs séparés

Stocker à la fois comme flotteur, et utiliser des mots clés uniques sur them.i.em

create table coordinates(
coord_uid counter primary key,
latitude float,
longitude float,
constraint la_long unique(latitude, longitude)
);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top