Respuestas:
Eche 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 hacen que la indexación y las consultas sean mucho más fáciles y eficientes.
Más información:
¡Advertencia justa! Antes de seguir el consejo de usar el tipo GEOGRAPHY, asegúrese de que no planea usar Linq o Entity Framework para acceder a los datos porque no es compatible (a partir de noviembre de 2010) y se entristecerá.
Actualización de julio de 2017
Para aquellos que lean esta respuesta ahora, es obsoleta, ya que se refiere a la pila de tecnología retroactiva. Consulte los comentarios para obtener más detalles.
No sé la respuesta para SQL Server pero ...
En MySQL guárdelo comoFLOAT( 10, 6 )
Esta es la recomendación oficial de la documentación para desarrolladores de Google .
CREATE TABLE `coords` (
`lat` FLOAT( 10, 6 ) NOT NULL ,
`lng` FLOAT( 10, 6 ) NOT NULL ,
) ENGINE = MYISAM ;
lat
y lng
superan georgraphy
, incluso con índices de alta densidad en SQL 2014. Por ejemplo: encontrar todos los puntos está dentro de un rectángulo. Solo que no estoy seguro, veo que Google Maps ahora usa 7 en lugar de 6 dígitos.
La forma en que lo hago: almaceno la latitud y la longitud y luego tengo una tercera columna que es un tipo de geografía derivada automáticamente de las primeras dos columnas. La tabla se ve así:
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 brinda la flexibilidad de las consultas espaciales en la columna geoPoint y también puede recuperar los valores de latitud y longitud cuando los necesite para mostrarlos o extraerlos con fines de csv.
Point
lugar de STGeomFromText
. Por ejemplo: [geography]::Point([Latitude], [Longitude], 4326)
.
Odio ser contrario a aquellos que dijeron "aquí hay un nuevo tipo, usémoslo". Los nuevos tipos espaciales de SQL Server 2008 tienen algunas ventajas: la eficiencia, sin embargo, no se puede decir ciegamente que siempre use ese tipo. Realmente depende de algunos problemas de imagen más amplios.
Como ejemplo, integración. Este tipo tiene un tipo equivalente en .Net, pero ¿qué pasa con la interoperabilidad? ¿Qué hay de admitir o ampliar versiones anteriores de .Net? ¿Qué hay de exponer este tipo a través de la capa de servicio a otras plataformas? ¿Qué pasa con la normalización de datos? Tal vez le interese la latitud o la longitud como piezas de información independientes. Quizás ya haya escrito una lógica empresarial compleja para manejar long / lat.
No estoy diciendo que no debas usar el tipo espacial, en muchos casos deberías hacerlo. Solo digo que debería hacer algunas preguntas más críticas antes de seguir ese camino. Para poder responder a su pregunta con mayor precisión, necesitaría saber más sobre su situación específica.
Almacenar long / lat por separado o en un tipo espacial son soluciones viables, y una puede ser preferible a la otra dependiendo de sus propias circunstancias.
Lo que desea 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, que tengo.
texto alternativo http://img20.imageshack.us/img20/6839/zipcodetable.png
En esta tabla, tenemos dos campos que almacenan datos geográficos.
La razón principal por la que desea guardarlo en la base de datos como un tipo GEOGRAPHY es para que pueda aprovechar todos los métodos ESPACIALES de él -> ej. Punto en Poli, Distancia entre dos puntos, etc.
Por cierto, también usamos la API de Google Maps para recuperar datos lat / long y almacenarlos en nuestra base de datos Sql 2008, por lo que este método funciona.
SQL Server tiene soporte para información relacionada con el espacio. Puede ver más en http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx .
Alternativamente, puede almacenar la información como dos campos básicos, por lo general, un flotante es el tipo de datos estándar informado por la mayoría de los dispositivos y es lo suficientemente preciso para una pulgada o dos, más que adecuado para Google Maps.
NOTA : Esta es una respuesta reciente basada en el servidor SQL reciente, actualizaciones de pila .NET
La latitud y la longitud de Google Maps deben almacenarse como datos de punto (nota P mayúscula) en el servidor SQL bajo el tipo de datos geográficos.
Suponiendo que sus datos actuales están almacenados en una tabla Sample
como varchar debajo de las columnas lat
y lon
, la consulta a continuación lo ayudará a convertir a geografía
alter table Sample add latlong geography
go
update Sample set latlong= geography::Point(lat,lon,4326)
go
PD: La próxima vez que haga una selección en esta tabla con datos geográficos, además de la pestaña Resultados y Mensajes, también obtendrá la pestaña Resultados espaciales como la siguiente para visualización
Si está usando Entity Framework 5 <puede usar 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/en-us/library/hh859721(v=vs.113).aspx
Algo con lo que luché y luego comencé a usar DbGeography
fue el coordinateSystemId
. Consulte la respuesta a continuación para obtener una excelente explicación y fuente del código a continuación.
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);
}
}
Si solo va a sustituirlo en una URL, supongo que un campo sería suficiente, para que pueda formar una URL como
http://maps.google.co.uk/maps?q=12.345678,12.345678&z=6
pero como son dos datos, los almacenaría en campos separados
Almacene ambos como flotantes y use palabras clave únicas en ellos.
create table coordinates(
coord_uid counter primary key,
latitude float,
longitude float,
constraint la_long unique(latitude, longitude)
);
House A
y se mudará a House B
la casa donde solía vivir Alice. Pronto Bob no podrá guardar su dirección (ubicación), porque Alice no actualizó la suya todavía, o nunca lo hará.