Estou trabalhando em um site de diretório comercial local que usará tipos de postagem personalizados para as entradas comerciais. Um dos campos será "CEP". Como posso configurar uma pesquisa baseada em local?
Gostaria que os visitantes pudessem inserir seu CEP e escolher uma categoria e mostrar todas as empresas dentro de um determinado raio ou todas as empresas ordenadas por distância. Vi alguns plugins que afirmam fazer isso, mas eles não suportam o WordPress 3.0. Alguma sugestão?
Respostas:
Eu modificaria a resposta de gabrielk e da postagem do blog vinculado usando índices de banco de dados e minimizando o número de cálculos de distância reais .
Se você conhece as coordenadas do usuário e a distância máxima (digamos 10 km), pode desenhar uma caixa delimitadora de 20 a 20 km com a localização atual no meio. Obtenha essas coordenadas delimitadoras e consulte apenas armazenamentos entre essas latitudes e longitudes . Ainda não use funções trigonométricas em sua consulta ao banco de dados, pois isso impedirá que índices sejam usados. (Portanto, você pode obter uma loja a 12 km de distância, se estiver no canto nordeste da caixa delimitadora, mas a lançaremos na próxima etapa.)
Calcule apenas a distância (conforme o pássaro voa ou com instruções de direção reais, como preferir) para as poucas lojas que são devolvidas. Isso aumentará drasticamente o tempo de processamento se você tiver um grande número de lojas.
Para a pesquisa relacionada ( "ofereça as dez lojas mais próximas" ), é possível fazer uma pesquisa semelhante, mas com uma estimativa inicial da distância (você começa com uma área de 10 km por 10 km e, se não tiver lojas suficientes, expanda-a para 20 km por 20 km e assim por diante). Para essa distância inicial, suponha que você calcule o número de lojas na área total e use-a. Ou registre o número de consultas necessárias e se adapte ao longo do tempo.
Eu adicionei um exemplo de código completo na pergunta relacionada de Mike e aqui está uma extensão que fornece os locais X mais próximos (rápidos e pouco testados):
fonte
Primeiro, você precisa de uma tabela parecida com esta:
... preenchido para cada código postal. Você pode expandir isso adicionando campos de cidade e estado, se quiser procurar dessa maneira.
Então, cada loja pode receber um código postal e, quando você precisar calcular a distância, poderá associar a tabela lat / long aos dados da loja.
Em seguida, você consultará essa tabela para obter a latitude e longitude dos códigos postais da loja e do usuário. Depois de obtê-lo, você pode preencher seu array e passá-lo para uma função "obter distância":
Isso é uma prova de conceito, não um código que eu recomendaria implementar. Se você tiver 10.000 lojas, por exemplo, seria uma operação bastante cara consultá-los todos, percorrer e classificá-los em todas as solicitações.
fonte
A documentação do MySQL também inclui informações sobre extensões espaciais. Estranhamente, a função distance () padrão não está disponível, mas verifique esta página: http://dev.mysql.com/tech-resources/articles/4.1/gis-with-mysql.html para obter detalhes sobre como "converter os dois valores de POINT em um LINESTRING e depois calculam o comprimento disso. "
Observe que é provável que todo fornecedor ofereça latitudes e longitudes diferentes, representando o "centróide" de um CEP. Também vale a pena saber que não há arquivos de "limite" de CEP definidos. Cada fornecedor terá seu próprio conjunto de limites que correspondem aproximadamente às listas específicas de endereços que compõem um código postal do USPS. (Por exemplo, em alguns "limites", é necessário incluir os dois lados da rua, em outros, apenas um.) As ZCTAs (Áreas de Tabulação de CEP), amplamente usadas pelos fornecedores ", não representam precisamente as áreas de entrega de CEP, e não inclui todos os códigos postais usados para entrega de correio " http://www.census.gov/geo/www/cob/zt_metadata.html
Muitas empresas do centro terão seu próprio código postal. Você deseja que o conjunto de dados seja o mais completo possível, encontre uma lista de códigos postais que inclua os códigos postais "ponto" (geralmente empresas) e os códigos postais "limite".
Tenho experiência em trabalhar com os dados de CEP de http://www.semaphorecorp.com/ . Mesmo isso não era 100% exato. Por exemplo, quando meu campus assumiu um novo endereço para correspondência e um novo CEP, o CEP foi extraviado. Dito isto, foi a única fonte de dados que eu descobri que ainda tinha o novo código postal, logo após a sua criação.
Eu tinha uma receita no meu livro para exatamente como atender seu pedido ... no Drupal. Baseava-se no módulo Ferramentas do Google Maps ( http://drupal.org/project/gmaps , para não confundir com http://drupal.org/project/gmap , também um módulo válido.) Você pode encontrar alguns exemplos úteis código nesses módulos, embora, é claro, eles não funcionem imediatamente no WordPress.
fonte