¿Cuál es la mejor manera de almacenar las coordenadas (longitud / latitud, desde Google Maps) en SQL Server?

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

Pregunta

Estoy diseñando una tabla en SQL Server 2008 que almacenará una lista de usuarios y Google Maps coordenadas (longitud y latitud).

¿Necesitaré dos campos, o puede ser hecho con 1?

¿Cuál es la mejor (o más frecuente) de tipo de datos que se utilizará para el almacenamiento de este tipo de datos?

¿Fue útil?

Solución

Tome un vistazo a los nuevos tipos de datos espaciales que se introdujeron en SQL Server 2008. Están diseñados para este tipo de tarea y hacer que la indexación y consulta mucho más fácil y más eficiente.

Más información:

Otros consejos

Fair Warning! Antes de tomar el consejo de usar el tipo GEOGRAFÍA, asegúrese de que usted no está planeando sobre el uso de LINQ o Entity Framework para tener acceso a los datos, ya que no es compatible (a partir de noviembre de 2010) y usted será triste!

  

Actualizar Jul 2017

     

Para aquellos que lean esta respuesta ahora, es obsoleta, ya que se refiere a la tecnología de pila con efecto retroactivo. Véanse los comentarios para más detalles.

No sé la respuesta para SQL Server, pero ...

MySQL guardarlo como FLOAT( 10, 6 )

Esta es la recomendación oficial de la href="https://developers.google.com/maps/documentation/javascript/mysql-to-maps#createtable" rel="nofollow noreferrer"> documentación para desarrolladores Google .

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

No me gusta ser aventurero para los que dijeron "aquí es un nuevo tipo, vamos a aplicarla". Los nuevos tipos de SQL Server 2008 espaciales tienen algunas ventajas a ella - es decir, la eficiencia, sin embargo, puede no a ciegas siempre decir utilizar ese tipo. Realmente depende de algunos problemas de imagen más grande.

Como un ejemplo, la integración. Este tipo tiene un tipo de equivilent en .Net - pero ¿qué hay de interoperabilidad? ¿Qué pasa con el apoyo o la ampliación de las versiones anteriores de Net? ¿Qué pasa con la exposición de este tipo a través de la capa de servicios a otras plataformas? ¿Qué pasa con la normalización de los datos - tal vez usted está interesado en lat o largo como piezas independientes de información. Tal vez que ya ha escrito la lógica de negocio complejos de manejar lat / long.

No estoy diciendo que no se debe utilizar el tipo espacial - en muchos casos debe. Sólo estoy diciendo que usted debe hacer algunas preguntas más críticas antes de ir por ese camino. Para mí, para responder a su pregunta con más precisión que tendría que saber más acerca de su situación específica.

Almacenando longitud / latitud separado o en un tipo espacial son ambas soluciones viables, y uno puede ser preferible a la otra en función de sus propias circunstancias.

La forma en que lo hago: Me almacenar el latitud y longitud y luego tengo una tercera columna que es un tipo de geografía derivada automática de la 1ª dos columnas. La tabla es el siguiente:

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

Esto le da la flexibilidad de las consultas espaciales en la columna de la GeoPoint y también se puede recuperar los valores de latitud y longitud a medida que los necesita para la exhibición o la extracción con fines csv.

Lo que se quiere hacer es almacenar la latitud y la longitud como el nuevo tipo espacial SQL2008 -.> Geografía

Aquí hay una captura de pantalla de una mesa, lo que tengo.

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

En esta tabla, tenemos dos campos que almacenan los datos de geografía.

  • Límites: este es el polígono que es el límite código postal
  • CentrePoint:. Este es el punto de latitud / longitud que representa el punto medio visual de este polígono

La razón principal por la que desea guardarlo en la base de datos como un tipo de geografía es por lo que puede aprovechar todos los métodos ESPACIALES fuera de él -> por ejemplo. Punto en el Poli, la distancia entre dos puntos, etc.

Por cierto, también utilizamos la API de Mapas de Google para recuperar los datos de latitud / longitud y almacenamos que en nuestra base de datos SQL 2008 -. Por lo que este método de trabajo

SQL Server tiene soporte para la información relacionada espacial. Puede ver más en http://www.microsoft.com/ sqlserver / 2008 / es / es / espacio-data.aspx.

Alternativly puede almacenar la información como dos campos básicos, por lo general un flotador es el tipo de datos estándar reportado por la mayoría de los dispositivos y es lo suficientemente precisa para dentro de una pulgada o dos - más que suficiente para Google Maps.

  

Nota: : Esta es una respuesta reciente basado en servidor SQL reciente, .NET pila actualizaciones

Latitute y longitud de Google Maps debe ser almacenada como punto (nota P mayúscula) de datos en el servidor SQL en Tipo de datos geografía.

Si se asume que sus datos actual se almacena en una tabla como varchar Sample bajo las columnas lat y lon, por debajo de consulta le ayudará a convertir a la geografía

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

PS: La próxima vez cuando se hace una selección en esta tabla con datos de geografía, además de los resultados y mensajes de ficha, también obtendrá resultados pestaña espaciales, como a continuación para la visualización

geo SSMS resultados pestaña

Si está utilizando Entity Framework <5 puede utilizar DbGeography. Ejemplo 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 / es-es / library / hh859721 (v = vs.113) .aspx

Algo Luché con el entonces empecé a usar DbGeography fue el coordinateSystemId. Ver la respuesta más abajo para una explicación y una excelente fuente para el código de abajo.

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 sólo se va a sustituir en un URL supongo un campo haría - para que pueda formar una URL como

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

pero como es de dos piezas de datos me los guarde en campos separados

almacenar tanto como flotador, y el uso de palabras clave únicas en them.i.em

create table coordinates(
coord_uid counter primary key,
latitude float,
longitude float,
constraint la_long unique(latitude, longitude)
);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top