Achar locais mais perto de um ponto (Calcular distância entre dois pontos usando SQL)

Publicado por: Ricardo Parente 0 Comments

Problema

Nós usualmente temos que listar lojas mais perto de um CEP e exibir a distância entre dois pontos tambem.

Solução

A solução está dentro do próprio SQL (MSSQL neste caso, mas provavelmente pode ser facilmente modificada para outro database).

Explicação detalhada

Para calcular a distância entre dois pontos (par de latitude/longitude) na superfície da Terra, temos que usar a lei dos cosenos (Spherical Law of Cosines http://en.wikipedia.org/wiki/Spherical_law_of_cosines) mostrada abaixo:

d = acos( sin(φ1).sin(φ2) + cos(φ1).cos(φ2).cos(Δλ) ).R

onde: φ = latitude, λ = longitude, R = raio da Terra, d = distância entre dois pontos

e a fórmula para calcular a distância usando uma query SQL em ColdFusion é mostrada abaixo:

Isto requer que voce passe a latitude/longitude para os locais que voce estiver pesquisando e assume que voce tenha os valores latitude/longitude para uma loja armazenados em um database. (Ou voce pode join com uma tabela de CEPs para obter os pares de latitude/longitude).

O valor 69.17073 e usado para converter a distância em milhas e o valor 111.3195 e usado para converter a distância em quilômetros. Este valor é mais exato para os pontos perto do equador e varia quando se desvia da linha equatorial.

<cfset radius = 111.3195> <!--- km --->
<cfset radius = 69.17073> <!--- mi --->
<cfset distance = 100> <!--- distance from the point you are searching for --->
<!---
degrees - tweak according to your needs / it should be related to the distance you set above
this will help limit the records searched instead of having to perform the calculation for every record
--->
<cfset searchDegree = 4>
<cfset latitude = 0> <!--- pass in this value --->
<cfset longitude = 0> <!--- pass in this value --->

<cfquery name="closestStore" datasource="#application.dsn#">
Select #radius# * Degrees(
acos(
sin(radians(#latitude#))*sin(radians(store.latitude))
+
cos(radians(#latitude#)) * cos(radians(store.latitude)) * cos(radians(store.longitude)-radians(#longitude#))
)
) As distance,
store.name
From store
Where
(
store.latitude between
#latitude# - #searchDegree#
and
#latitude# + #searchDegree#
)
And
(
store.longitude between
#longitude# - #searchDegree#
and
#longitude# + #searchDegree#
)
And
(
#radius# * Degrees(
acos(
sin(radians(#latitude#))*sin(radians(store.latitude))
+
cos(radians(#latitude#)) * cos(radians(store.latitude)) * cos(radians(store.longitude)-radians(#longitude#))
)
)
) < #distance#
Order By distance, name
«/cfquery>

by Eapen

Versão original em inglês: Adobe ColdFusion Cookbook

Creative Commons License Adobe

 


Flash Remoting com Flash CS 5 & ColdFusion

Publicado por: Ricardo Parente 0 Comments

Problema

Configurar sua conexão com Flex & ColdFusion.

Solução

Me perguntaram algumas vezes como conectar Flash & ColdFusion para acesso remoto.

Detailed explanation

Configurar Flash Remoting com ActionScript 3.0 eColdFusion é fácil.
Crie um fla, chame-o connection e cria um componente ColdFusion e chame-o getTest.cfc.
No getTest.cfc us o código abaixo

<cfcomponent displayName="getTest">
<cffunction name="getTestConn" access="remote" returnType="string" output="true">
<cfreturn "connection to localhost was made!">
</cffunction>
</cfcomponent>

Este CFC inicia a conexão, e retorna uma string.
Coloque este CFC no seu webroot.
No painel actions do seu fla, entre o seguinte código:

import flash.net.NetConnection;
import flash.net.Responder;



var gateway:NetConnection = new NetConnection();
var responder:Responder=new Responder(onResult,onFault);

function onResult(responds:Object):void {
trace("cfc result "+" --"+" "+responds.toString());
//message.text= "cfc result "+"-- "+" "+responds.toString();

}

function onFault(responds:Object):void {
//loop over the fault structure
for (var i:String in responds) {
trace( i + ":" + responds[i] );

}
}

// name the default gateway on this machine. if you are using the default ColdFusion server use port 8500
gateway.connect("http://localhost/flashservices/gateway/");

// name of the cfc and the function
gateway.call("getTest.getTestConn", responder);




No actions nós estamos importando as classes necessárias, configurando variáveis. E, criamos as funções onResult e onFault. Então, definimos o gateway, que está em http://localhost/flashservices/gateway/ ou http://localhost:8500/flashservices/gateway/ para o servidor ColdFusion default.

Finalmente chamamos a função que queremos para retornar no CFC. No exemplo acima eu tenho o campo de texto com a  mensagem comentado, mas no download ele está funcionando para que voce possa ver o exemplo rodando. 

Sinta-se à vontade em baixar o zip, e se tiver alguma dúvida, deixe um comentário ou contate-me :)

connection.zip

by John Barret

Versão em inglês: Adobe ColdFusion Cookbook

Creative Commons License Adobe

 


Criando um URL Shortener com ColdFusion

Publicado por: Ricardo Parente 0 Comments

Há vários sites onde podemos encurtar nossos URLs, como tinyURL.com, is.gd, dwarfURL.com, bit.ly e outros.
Recebi uma chamada de um amigo que tem vários artigos distribuidos com URLs encurtados e ele estava com medo de caso os sites que hospedam o redirecionamento parassem, seus artigos distribuidos estariam perdidos.
Então ele me perguntou se eu podia criar um site de URL Shortener para seu uso privado e para ser hospedado em seu servidor junto com seus websites.
Decidi disponibilizar o código para a comunidade para aqueles que pensam da mesma forma.
Nosso ambiente é Windows Server 2003, Microsoft SQL 2008 e ColdFusion 8.

Leia mais...


Older Entries