Localize pontos em raio

Use nossos dados para procurar locais dentro de um raio em quilômetros, milhas ou milhas náuticas. Nota usamos um índice em latitude e longitude campos no banco de dados de pesquisa mais rápido.

Exemplo prático

País
Código postal    1000-002  1269-123  1750-075
Distância

Calc é uma variável para construir a fórmula, então  aplicar à nossa declaração de SQL.
Lat and Lon as coordenadas do ponto de início (formato decimal, datum WGS84).
Latitude e Longitude corados são os nomes dos campos de coordenadas no banco de dados.
6378.137 é o diâmetro da terra em quilômetros, use: 3963.191 de milhas.

Fórmula

Calc = 6378.137 * ACos( Cos( RADIANS(Latitude) ) * Cos( RADIANS( Lat ) ) * Cos( RADIANS( Lon ) - RADIANS(Longitude) ) + Sin( RADIANS(Latitude) ) * Sin( RADIANS( Lat ) ) )

SQL = "SELECT Locality, " & Calc & " As Distance FROM Table WHERE " & Calc & " <= '5' ORDER BY Distance"

Amostra de código no ASP usando banco de dados MS SQL

<%
ISO  = Request.Form("ISO")
PostalCode = Request.Form("PostalCode")
Distance   = Request.Form("Distance")

If Request.Form("Radius") = "K" Then
   Radius = 6378.137                       'Kilometers

Else
   Radius = 3963.191                       'Miles

End If

 
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open Application("ConnectionString")
Set RS   = Server.CreateObject("ADODB.Recordset")

' Buscar códigos postais para obter as coordenadas do primeiro ponto
' ---------------------------------------------------------
SQL = "SELECT * FROM [PostalCodes] " & ISO & "' "

SQL = SQL & "AND PostalCode = '" & PostalCode & "';"


Set RS = Conn.Execute(SQL)

Lat = RS("Latitude")
Lon = RS("Longitude")

 

'Construa a fórmula na variável 'calc' para fácil manuseio na instrução SQL

calc = Radius & " * ACos( Cos(RADIANS(Latitude)) * Cos(RADIANS(" & Lat & ")) * Cos(RADIANS(" & Lon & ") - RADIANS(Longitude)) + Sin(RADIANS(Latitude)) * Sin(RADIANS(" & Lat & ")) ) "

SQL = "SELECT TOP 100 "
SQL = SQL & "ISO, "
SQL = SQL & "Postalcode, "
SQL = SQL & "Region1, "
SQL = SQL & "Region2, "
SQL = SQL & "Region3, "
SQL = SQL & "Locality, "
SQL = SQL & "Suburb, "
SQL = SQL & "Latitude, "
SQL = SQL & "Longitude, "
SQL = SQL & calc & " AS Distance "
SQL = SQL & "FROM [PostalCodes] "
SQL = SQL & "WHERE (ISO = '" & ISO & "') "
SQL = SQL & "AND " & calc & " <= " & Distance & " "
SQL = SQL & "ORDER BY Distance ;"

Set RS = Conn.Execute(SQL)

DO While Not RS.EOF

     Response.Write RS("ISO") & "<br>"
     Response.Write RS("PostalCode") & "<br>"
     Response.Write RS("Region1") & "<br>"
     Response.Write RS("Region2") & "<br>"
     Response.Write RS("Region3") & "<br>"
     Response.Write RS("Locality") & "<br>"
     Response.Write RS("Suburb") & "<br>"
     Response.Write FormatNumber(RS("Distance"),1) & "<br>"

RS.MoveNext
Loop
RS.Close
Set RS = nothing

Conn.Close
%>

Sample of code in PHP using MySQL database

<?php
if(isset($_GET['Search']))
{
$PostalCode = $_GET['PostalCode'];
$Distance   = $_GET['distance'];

$sqlstring = "SELECT * FROM PostalCodes WHERE PostalCode = '".$PostalCode."'";
$result = mysql_query($sqlstring);

$row = mysql_fetch_assoc($result);

$Lng = $row["Longitude"] / 180 * M_PI;
$Lat = $row["Latitude"] / 180 * M_PI;

mysql_free_result($result);

$sqlstring2 = "SELECT DISTINCT PostalCode, Locality, (6367.41 * SQRT(2 * (1-Cos(RADIANS(Latitude)) * Cos(".$Lat.") * (Sin(RADIANS(Longitude))*Sin(".$Lng.") + Cos(RADIANS(Longitude)) * Cos(".$Lng.")) - Sin(RADIANS(Latitude)) * Sin(".$Lat.")))) AS Distance FROM PostalCodes WHERE (6367.41 * SQRT(2 * (1 - Cos(RADIANS(Latitude)) * Cos(".$Lat.") * (Sin(RADIANS(Longitude)) * Sin(".$Lng.") + cos(RADIANS(Longitude)) * Cos(".$Lng.")) - Sin(RADIANS(Latitude)) * Sin(".$Lat."))) <= '".$Distance."') ORDER BY Distance";

$result = mysql_query($sqlstring2) or die('query failed: ' . mysql_error());

$str = "<table width=\"300\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">";
$str .= "<tr>";
$str .= "<th>PostalCode</th>";
$str .= "<th>Distance</th>";
$str .= "</tr>";

while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
$str .= "<tr><td>".$row["PostalCode"]."</td><td>".$row["place"]."</td><td>".round($row['Distance'])."km</td></tr>";
}

$str .= "</table>";

mysql_free_result($result);
mysql_close($conn);
echo $str;
}
?>
 Dados de referência
Divisões administrativas
Paises
Nomes de países
Moedas
Idiomas
Formato códigos postais
Fusos horários
Fórmulas e amostras
Distância entre pontos
Localize pontos em raio
 Códigos normalizados
Códigos ISO
Códigos NGA
Códigos NUTS