Qual è il modo migliore per memorizzare le coordinate (longitudine/latitudine, da Google Maps) in SQL Server?

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

Domanda

Sto progettando una tabella in SQL Server 2008 che memorizzerà un elenco di utenti e una coordinata di Google Maps (longitudine e latitudine).

Avrò bisogno di due campi o è possibile farlo con 1?

Qual è il tipo di dati migliore (o più comune) da utilizzare per archiviare questo tipo di dati?

È stato utile?

Soluzione

Date un'occhiata ai nuovi tipi di dati spaziali che sono state introdotte in SQL Server 2008. Sono progettati per questo tipo di compito e rendere l'indicizzazione e l'esecuzione di query molto più facile e più efficiente.

Più informazioni:

Altri suggerimenti

Fair Warning! Prima di prendere il consiglio di utilizzare il tipo di geografia, assicurarsi che non si sta pensando di usare LINQ o Entity Framework per accedere ai dati perché non è supportato (a partire da novembre 2010) e sarai triste!

  

Aggiornamento luglio 2017

     

Per coloro che leggono questa risposta ora, è obsoleta in quanto si riferisce alla tecnologia stack retroattivo. Vedere i commenti per ulteriori dettagli.

non so la risposta per SQL Server, ma ...

Nel MySQL salvarlo come FLOAT( 10, 6 )

Questa è la raccomandazione ufficiale del href="https://developers.google.com/maps/documentation/javascript/mysql-to-maps#createtable" rel="nofollow noreferrer"> documentazione per gli sviluppatori di Google .

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

Odio essere un contrarian a coloro che ha detto "ecco un nuovo tipo, lo si può usare". I nuovi tipi spaziali di SQL Server 2008 hanno alcuni vantaggi ad esso - vale a dire l'efficienza, ma non si può sempre dire ciecamente utilizzare quel tipo. Dipende molto su alcune questioni quadro generale.

A titolo di esempio, l'integrazione. Questo tipo ha un tipo equivilent in .Net - ma per quanto riguarda l'interoperabilità? Che dire di sostenere o estendere le vecchie versioni di Net? Che dire di esporre questo tipo in tutto il livello di servizio ad altre piattaforme? Che cosa circa la normalizzazione dei dati - forse siete interessati a lat o lungo come pezzi autonomi di informazioni. Forse avete già scritto la logica di business complessa da gestire lungo / lat.

Non sto dicendo che non si deve utilizzare il tipo spaziale - in molti casi si dovrebbe. Sto solo dicendo che si dovrebbe porre alcune domande più critiche prima di andare su questa strada. Per me per rispondere alla tua domanda più accuratamente avrei bisogno di sapere di più circa la vostra situazione specifica.

Memorizzazione lungo / LAT separatamente o in un tipo spaziale sono entrambi soluzioni praticabili, e uno può essere preferibile all'altra a seconda delle proprie circostanze.

Il modo in cui lo faccio: ho memorizzare il latitudine e longitudine e poi ho una terza colonna che è un tipo automatico geografia derivato del 1 ° due colonne. La tabella è simile al seguente:

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))) 
)

Questo ti dà la flessibilità di query spaziali sulla colonna GeoPoint e si può anche recuperare i valori di latitudine e longitudine quando ne hai bisogno per la visualizzazione o l'estrazione a fini csv.

Che cosa si vuole fare è conservare la latitudine e longitudine come il nuovo tipo spaziale SQL2008 -.> GEOGRAFIA

Ecco una schermata di un tavolo, che ho.

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

In questa tabella, abbiamo due campi che memorizzano i dati di geografia.

  • Boundary: questo è il poligono che è il codice postale di confine
  • CentrePoint:. Questo è il punto di latitudine / longitudine che rappresenta il punto di mezzo visivo del poligono

Il motivo principale per cui si desidera salvare nel database come un tipo GEOGRAFIA è così si può quindi sfruttare tutti i metodi SPAZIALI fuori di esso -> ad es. Point in Poly, distanza tra due punti, ecc.

A proposito, abbiamo anche uso di Google Maps API per recuperare i dati di lat / long e memorizziamo che nel nostro SQL 2008 DB -. Quindi questo metodo funziona

SQL Server ha il supporto per le informazioni correlate spaziale. Si può vedere di più al http://www.microsoft.com/ sqlserver / 2008 / it / us / spazio-data.aspx.

Alternativly è possibile memorizzare le informazioni come due campi di base, di solito un galleggiante è il tipo di dati standard riportati dalla maggior parte dei dispositivi ed è abbastanza preciso per all'interno di un pollice o due - più che sufficiente per Google Maps.

NOTA:Questa è una risposta recente basata sul recente server SQL, aggiornamenti dello stack .NET

la latitudine e la longitudine di Google Maps devono essere archiviate come dati Point (nota maiuscola P) nel server SQL nel tipo di dati geografico.

Supponendo che i tuoi dati correnti siano archiviati in una tabella Sample come varchar sotto le colonne lat E lon, la query seguente ti aiuterà a convertire in geografia

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

PS: La prossima volta che effettuerai una selezione su questa tabella con i dati geografici, oltre alla scheda Risultati e Messaggi, otterrai anche la scheda Risultati spaziali come di seguito per la visualizzazione

SSMS geo results tab

Se si utilizza Entity Framework 5 <è possibile utilizzare DbGeography. Esempio da 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 / it-it / library / hh859721 (v = vs.113) aspx

Qualcosa ho lottato con l'allora ho iniziato ad usare DbGeography era il coordinateSystemId. Vedere la risposta qui sotto per una spiegazione eccellente e fonte per il codice qui sotto.

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

Se si sta solo andando a sostituire in un URL suppongo un campo avrebbe fatto - in modo da poter formare un URL come

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

ma come si tratta di due pezzi di dati io li conservo in campi separati

Conservare sia come float, e utilizzare le parole chiave univoche sulla them.i.em

create table coordinates(
coord_uid counter primary key,
latitude float,
longitude float,
constraint la_long unique(latitude, longitude)
);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top