Pergunta

Eu estou projetando uma tabela no SQL Server 2008 que irá armazenar uma lista de usuários e uma coordenada Google Maps (longitude e latitude).

Vou precisar de dois campos, ou pode ser feito com 1?

Qual é a melhor (ou mais frequente) de dados do tipo de uso para armazenar esse tipo de dados?

Foi útil?

Solução

Dê uma olhada os novos dados tipos espaciais que foram introduzidas no SQL Server 2008. Eles são projetados para este tipo de tarefa e fazer indexação e consulta muito mais fácil e mais eficiente.

Mais informações:

Outras dicas

Fair Warning! Antes de tomar o conselho para usar o tipo de geografia, certifique-se que você não está pensando em usar Linq ou Entity Framework para acessar os dados porque não é suportado (em Novembro de 2010) e você vai ficar triste!

Atualização julho 2017

Para aqueles que estão lendo esta resposta agora, é obsoleto, uma vez que se refere a tecnologia de pilha retroativo. Veja os comentários para mais detalhes.

Eu não sei a resposta para SQL Server, mas ...

Em MySQL guardá-lo como FLOAT( 10, 6 )

Esta é a recomendação oficial do Google .

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

Eu odeio ser um contrarian para aqueles que disseram "aqui é um novo tipo, vamos usá-lo". Os novos tipos espaciais do SQL Server 2008 tem algumas vantagens para isso - ou seja, a eficiência, no entanto você não pode cegamente dizer sempre usar esse tipo. Ela realmente depende de algumas questões foto maior.

Como exemplo, a integração. Este tipo tem um tipo equivilent em .Net - mas que sobre interoperabilidade? E quanto a apoiar ou estender versões mais antigas do .net? E quanto a expor este tipo do outro lado da camada de serviço para outras plataformas? E sobre a normalização de dados - talvez você está interessado em lat ou longa como peças independentes de informação. Talvez você já tenha escrito lógica de negócios complexos para lidar com long / lat.

Eu não estou dizendo que você não deve usar o tipo espacial - em muitos casos, você deve. Eu só estou dizendo que você deve fazer algumas perguntas mais críticas antes de ir por esse caminho. Para mim, para responder sua pergunta com mais precisão eu precisaria saber mais sobre sua situação específica.

O armazenamento long / lat separadamente ou em um tipo espacial são ambas as soluções viáveis, e pode-se ser preferível para o outro, dependendo de suas próprias circunstâncias.

A maneira que eu faço: eu armazenar o latitude e longitude e então eu tenho uma terceira coluna, que é um derivado de tipo automático geografia da 1ª duas colunas. Os olhares tabela como esta:

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

Isto dá-lhe a flexibilidade de consultas espaciais na coluna GeoPoint e você também pode recuperar os valores de latitude e longitude como você precisa deles para exibição ou extrair para fins CSV.

O que você quer fazer é armazenar o Latitude e Longitude como o novo tipo SQL2008 Espaciais -.> GEOGRAFIA

Aqui está uma captura de tela de uma mesa, o que eu tenho.

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

Nesta tabela, temos dois campos que armazenar dados de geografia.

  • Boundary: este é o polígono que é o código postal de fronteira
  • CentrePoint:. Este é o ponto de Latitude / Longitude que representa o ponto médio visual deste polígono

A principal razão pela qual você deseja salvá-lo ao banco de dados como um tipo de geografia é para que você possa, em seguida, aproveitar todos os métodos ESPACIAIS fora dele -> por exemplo. Point em Poly, distância entre dois pontos, etc.

BTW, também usamos API do Google Maps do Google para recuperar dados de latitude / longitude e loja que em nossa SQL Server 2008 DB -. Modo que este método funciona

SQL Server tem suporte para informações relacionadas espacial. Você pode ver mais em http://www.microsoft.com/ sqlserver / 2008 / en / us / espaço-data.aspx .

Alternativly você pode armazenar as informações como dois campos básicos, geralmente um flutuador é o tipo de dados padrão relatado pela maioria dos dispositivos e é bastante preciso para dentro de uma polegada ou dois - mais do que adequado para o Google Maps.

NOTA : Esta é uma resposta recente baseado em servidor SQL recente, .NET pilha atualizações

latitudes médias e longitude do Google Maps devem ser armazenados como dados no servidor SQL em tipo de geografia dados do ponto (nota de capital P).

Assumindo que o seu dados atual é armazenado em um Sample mesa como varchar nas colunas lat e lon, abaixo consulta irá ajudá-lo a converter a geografia

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

PS: Da próxima vez quando você faz uma escolha nesta tabela com dados de geografia, além de resultados e mensagens guia, você também terá guia resultados espacial como abaixo para visualização

SSMS geo resultados guia

Se você estiver usando o Entity Framework 5 DbGeography. Exemplo 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 que eu lutava com o então eu comecei a usar DbGeography foi o coordinateSystemId. Veja a resposta abaixo para uma excelente explicação e fonte para o código abaixo.

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 você está indo só para substituí-lo em uma URL Suponho que um campo faria - para que você possa formar uma URL como

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

mas como é dois pedaços de dados que eu seria armazená-los em campos separados

loja tanto como float, e usar palavras-chave únicas em them.i.em

create table coordinates(
coord_uid counter primary key,
latitude float,
longitude float,
constraint la_long unique(latitude, longitude)
);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top