Quais serviços pré-existentes existem para calcular a distância entre dois endereços?

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

  •  02-07-2019
  •  | 
  •  

Pergunta

Eu gostaria de implementar uma maneira de exibir uma lista de endereços armazenados classificados por proximidade com um determinado endereço.

Os endereços na lista serão armazenados em uma tabela de banco de dados. Peças separadas têm campos separados (temos campos para código postal, nome da cidade etc.), então não é apenas um gigante varchar. Eles são digitados pelo usuário e, devido à natureza do sistema, nem sempre podem estar completos (alguns podem estar ausentes do código postal e outros podem ter pouco mais que cidade e estado).

Embora isso seja para um aplicativo intranet, não tenho problemas em usar recursos externos, incluindo o acesso à Internet Web Services e tal. Na verdade, eu preferiria isso em rolar o meu próprio, a menos que fosse trivial fazer a mim mesmo. Se Google ou Yahoo! Já fornece um serviço gratuito, estou mais do que disposto a conferir. A palavra -chave é que deve ser gratuita, pois não tenho liberdade para introduzir qualquer custo adicional neste projeto para esse recurso, pois já é um bônus "viva", por assim dizer.

Estou pensando nisso como muitas lojas de tijolo e argamassa fazem seu recurso "Find A Location". Mostrar em uma mesa simples classificada adequadamente e exibir a distância (em, digamos, Miles) é ótima. Mostrar um mash-up de mapa é ainda mais legal, mas eu definitivamente posso viver apenas recuperando a distância e eu lidando com toda a tela subsequente e classificação.

O problema com algoritmos de distância simples é a natureza dos dados. Como todo ou parte do endereço pode ser indefinido, não tenho nada conveniente como coordenados Lat/Long. Além disso, mesmo se eu fizer códigos postais necessários, 90% dos endereços provavelmente terão os mesmos cinco códigos postais.

Embora não precise ser rápido, qualquer coisa que leva mais de sete segundos para aparecer na página devido à latência pode demorar muito para o usuário médio esperar, como sabemos. Se esse serviço hipotético apoiar o envio de um lote de endereços de uma só vez, em vez de consultar um de cada vez, isso seria ótimo. Ainda assim, eu não deveria pensar que a lista de endereços excederia 50 no total, se muitos.

Foi útil?

Solução

Google e Yahoo! Ambos fornecem serviços de geocodificação gratuitamente. Você pode calcular a distância usando o Fórmula Haversine (implementado em .NET ou SQL). Ambos os serviços permitem fazer pesquisas parciais (somente o código postal, apenas a cidade) e informarão quais são a precisão dos resultados deles (para que você possa excluir locais sem informações significativas, embora o Yahoo! forneça mais informações de precisão que o Google).

Outras dicas

A API do Google Maps não é boa para você devido aos termos de uso deles. No entanto, o Yahoo oferece um serviço de descanso para transformar endereços em coordenadas longas/LAT, que você pode usar para calcular distâncias. Seu aqui.

Exige que eles digitem um código ZIP e crie um código ZIP de mapeamento de tabela de banco de dados para pares de latitude/longitude (ou encontre um online). Não sei como é onde você trabalha, mas aqui, o código postal pode ser específico para vários metros, o que deve ser mais preciso o suficiente. Em seguida, use este método para calcular a distância entre dois códigos postais:

public static double distance(double lat1, double lon1, double lat2, double lon2, char unit)
{
  double theta = lon1 - lon2;
  double dist = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) +
    Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) * Math.Cos(deg2rad(theta));
  dist = Math.Acos(dist);
  dist = rad2deg(dist);
  dist = dist * 60 * 1.1515;
  if (unit == 'K')
  {
    dist = dist * 1.609344;
  }
  else if (unit == 'N')
  {
    dist = dist * 0.8684;
  }
  return (dist);
}

private static double deg2rad(double deg)
{
  return (deg * Math.PI / 180.0);
}

private static double rad2deg(double rad)
{
  return (rad / Math.PI * 180.0);
}

A vantagem de usar seu próprio código em um serviço de geocodificação é que você pode fazer um monte de cálculos mais interessantes contra os dados, além de armazenar coisas ao lado dele no seu banco de dados.

Você não pode simplesmente usar a API do Google Maps para obter as distâncias e classificá -las do seu lado?

http://code.google.com/apis/maps/

Eu sugiro investigar a API do Google Maps.

Isso exigiria que você tivesse uma conexão externa (e que esteja tudo bem para derrubar os dados sobre um serviço da web), mas fornece o que você precisa, a saber, a distância pedindo uma rota entre 2 pontos e obtendo a distância de isto.

Referência da API da API de instruções

Uma coisa que fizemos na minha empresa é trapacear e usar a latitude/longitude do código ZIP (aproximadamente o centro da área de código postal). Não é perfeito, mas está perto o suficiente para aqueles que me encontram x a n quilômetros de Y Tipos de pesquisas. Isso é especialmente útil quando os endereços não podem ser reconhecidos pelos serviços de limpeza de endereços.

Em algum momento, me deparei com um código postal gratuito para a tabela de pesquisa de latitude/longitude para usar nesta aproximação. Lamento não ter mais o link para isso.

Confira este site: http://geocoder.us/help/utility.shtml

Você pode processar registros, 1 por 15 segundos como este:http://geocoder.us/service/distance?zip1=95472&zip2=94305

Eles também têm um serviço de assinatura sem o limite de tempo

Alguém já fez isso em Lógica Daft (Editar: erro de digitação). Eles usam a API do Google Maps com a Fórmula de grande círculo. Eu não acho que é difícil de implementar.

Atualizar: Praticamente, você só precisa obter as coordenadas do seu provedor favorito e fazer o cálculo com seu código. Você pode pré -carregar as coordenadas das lojas, quando os usuários fornecem sua localização - você pode até usar isso para validação. Então, quando a solicitação for feita, você só pode procurar a localização do cliente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top