Geração de posições geográficas aleatória.

2,545 views
Skip to first unread message

Rafael Reuber

unread,
Jun 9, 2013, 12:43:32 PM6/9/13
to pug...@googlegroups.com
Olá,

     Estou participando de um projeto que envolve o rastreamento geográfico de objetos. A minha maior dificuldade hoje é testar o componente de rastreamento.
     Para testar esse componente, estou conectando a uma base de produção para capturar as posições dos veículos em tempo real. Não gosto de usar a base de produção para fazer meus testes. Preciso criar um mecanismo que possibilite a geração de coordenadas geográficas (latitude e longitude) aleatórias a partir de um ponto central e dentro uma distância x. Alguém já passou por essa situação e sabe como posso fazê-lo?

Marcelo Melo

unread,
Jun 9, 2013, 12:52:35 PM6/9/13
to pug...@googlegroups.com
Qual o tamanho da área onde o objeto se encontra? 


--
--
----- PugCE.Org - Python Users Group Ceará -----
pugc...@gmail.com
 
http://pug-ce.python.org.br/
http://pug-ce.python.org.br/wiki/
http://groups.google.com/group/pug-ce?hl=pt-BR
irc.freenode.org - #pugce
 
---
Você está recebendo esta mensagem porque se inscreveu no grupo "PugCE.Org" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para pug-ce+un...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 



--
Atenciosamente,

Marcelo L. Melo
[ARDUINO-CE Comunidade de Hardware Livre do Ceará]
Skype: marcelo.laranjeira.melo
Twitter:@marcelorange

Rafael Reuber

unread,
Jun 9, 2013, 1:49:28 PM6/9/13
to pug...@googlegroups.com
Tipo, 30 km.


On 09-06-2013 13:52, Marcelo Melo wrote:

David Viana

unread,
Jun 10, 2013, 10:28:57 AM6/10/13
to pug...@googlegroups.com
Normalmente o gps informa as coordenadas geográficas através do protocolo NMEA. Tem um projeto pynmea, http://code.google.com/p/pynmea/downloads/detail?name=pynmea-0.6.0.tar.gz&can=2&q= que faz a tradução do protocolo pra coordenadas, mas realmente não sei nenhum simulador pra linux. Contudo, acho que gerar coordenadas dentro de um raio de 30km, não é complicado.
Pensei em algo assim:
Ponto X Brr 166 : Lat -4.05977, long -38.49640
Ponto Y Via sul : Lat -3.79509, long -38.47999

Tem a distancia +- de 30Km em relação a latitude, tanto que a variação foi de 0,26468. Tanto que a longitude não mudou muito por que vi no mapa mais ou menos em linha reta.

Ponto Z Lat: -3.81744, long: -38.79943
Ponto Y Via sul : Lat -3.79509, long -38.47999

Tem a distancia +- de 30Km em relação a Longitude, tanto que a variação foi de 0,31944. Tanto que a Latitude não mudou muito por que vi no mapa mais ou menos em linha reta.
Agora, basta você passar o ponto central da sua coordenada e aplica aquela fórmula da distancia entre 2 pontos, usando como variação pra latitude 0,26468, e pra longitude, 0,31944.

De forma rápida e bem prática, sem muita precisão eu fiz assim. tomara que seja +- isso que você queira.

from random import *

class Pontos:
    def __init__(self, lat, lng):
        self.lat = lat #latitude
        self.lng = lng #longitude
        self.centro = [self.lat, self.lng]
        self.distMax = [0.26468, 0.31944] #Minha variação de latitude e longitude, que dá em volta de 30km pra cada

    def gerarPontos(self):
        print self.distMax, (self.distMax[0]*100000)
        lat = float((randrange(0, int(self.distMax[0]*100000))))
        lng = float((randrange(0, int(self.distMax[1]*100000))))
        return [lat, lng]
    
    def criarPonto(self, lat, lng):
        calc = randint(0, 4)
        print "Calc", calc, lat/1000000, lng/1000000
        if calc == 0:
            mlat = self.lat+(lat/1000000)
            mlng = self.lng+(lng/1000000)
        if calc == 1:
            mlat = self.lat+(lat/1000000)
            mlng = self.lng-(lng/1000000)
        if calc == 2:
            mlat = self.lat-(lat/1000000)
            mlng = self.lng+(lng/1000000)
        if calc == 3:
            mlat = self.lat-(lat/1000000)
            mlng = self.lng-(lng/1000000)
        return [mlat, mlng] 

pontos = Pontos(-3.79509, -38.47999) #Passando o ponto central, esse ponto é ao lado do via sul.
gpontos = pontos.gerarPontos() #Gerando os pontos dentro de 30km
fpontos = pontos.criarPonto(gpontos[0], gpontos[1]) #Calculando de forma aleatória para qualquer quadrante
print fpontos

Coloca lá no google Maps, como chegar, e passa no A: -3.79509, -38.47999 é em cima do Via Sul.
E depois coloca no B, o ponto gerado.
Se você quiser o calculo exato distancia em km, por graus em latitude ou longitude. aí tem que fazer a fórmula, não lembro, mas deve ter por aí. Valeu.

Davi di Cavalcanti

unread,
Jun 10, 2013, 2:57:22 PM6/10/13
to pug...@googlegroups.com
Deixa eu ver se entendi. Você quer, dado um par ordenado (x,y), gerar pontos (x',y') que estão dentro da circunferência de raio 30km e centro (x,y)?


2013/6/10 David Viana <david...@gmail.com>

--
--
----- PugCE.Org - Python Users Group Ceará -----
pugc...@gmail.com
 
http://pug-ce.python.org.br/
http://pug-ce.python.org.br/wiki/
http://groups.google.com/group/pug-ce?hl=pt-BR
irc.freenode.org - #pugce
 
---
Você está recebendo esta mensagem porque se inscreveu no grupo "PugCE.Org" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para pug-ce+un...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 



--
Graduado Universidade Estadual do Ceará

Rafael Reuber

unread,
Jun 10, 2013, 3:02:04 PM6/10/13
to pug...@googlegroups.com
É isso mesmo.

Davi di Cavalcanti

unread,
Jun 10, 2013, 3:28:09 PM6/10/13
to pug...@googlegroups.com
Então, você deve gerar os pontos que satisfazem a seguinte inequação 0 < (x - a)² + (x - b)² <= 30² (isso se a escala for km, senão converter 30km para a unidade apropriada), onde (a,b) é o centro da circunferência.

http://pt.wikipedia.org/wiki/Circunfer%C3%AAncia

A equação (x - a)² + (x - b)² = 30² irá dizer todos os pontos que fazem parte da circunferência, isto é, que estão à 30km de distância. por isso a inequação. Nunca resolvi esse problema, mas pensando um pouco agora minha sugestão seria escolher um valor aleatório para o raio 0 < r <= 30 e um valor aleatório para x, a - 30 < x < a + 30. Então você descobre y usando a equação.

Acho que assim dá certo. Deu pra entender?


2013/6/10 Rafael Reuber <rafael...@gmail.com>

David Viana

unread,
Jun 10, 2013, 3:39:56 PM6/10/13
to pug...@googlegroups.com
Cara, não funciona como eu fiz?

Rafael Reuber

unread,
Jun 10, 2013, 3:42:09 PM6/10/13
to pug...@googlegroups.com
O que o David fez funcionou perfeitamente!

David Viana

unread,
Jun 10, 2013, 3:46:10 PM6/10/13
to pug...@googlegroups.com
Blz, deu pra quebrar o galho neh? Valeu!

Moacir Bispo Bezerra Filho

unread,
Jun 10, 2013, 5:13:02 PM6/10/13
to pug...@googlegroups.com
A forma r² = x² + y² só funciona se as unidades forem as mesmas.... X e Y estão em latitude/longitude e R em quilometros. Para converter Latitude e longitude em quilometros é uma formula pouco complexa, pois leva em conta uma "geodesica" ou seja: uma mesma diferença lat/log pode ter distâncias diferentes dependendo do quadrante que se encontre. Quanto mais proximo dos polos menor a distância... quanto mais proximo do ecuador maior a distância.
Atenciosamente,
Moacir Bispo
(85) 9918.1950

Fábio Cerqueira

unread,
Jun 10, 2013, 5:16:24 PM6/10/13
to pug...@googlegroups.com
Opa, curti a informação, Moacir :D


2013/6/10 Moacir Bispo Bezerra Filho <bi...@det.ufc.br>



--
Fábio Cerqueira

Moacir Bispo Bezerra Filho

unread,
Jun 10, 2013, 10:22:29 PM6/10/13
to pug...@googlegroups.com
Como calcular distancia entre dois pontos (lat,long) usando python de forma simples e precisa.

Módulos necessários:
sudo pip install shapely
sudo pip install pyproj

Só um conceito básico... quando trabalhamos com mapas... temos uma imagem plana, porem a terra é "esférica" . Para fazer um mapa temos que planificar a terra e com isso inserimos erros de distorção (mapa esférico -> mapa cartesiano).

from shapely.geometry import Point
from pyproj import Proj

#Zone UTM de Fortaleza-CE é "24M"
#Instanciando plano de projeção. Existe centenas de formas de fazer isso, o padrão WGS84 é o usado pelo google maps. Então essa aproximação será igual ao valor apresentado pelo goole maps.
proj = Proj(proj='utm',zone=24,ellps='WGS84')

point1_geo = (-38.52, -3.74) # Origem em fortaleza
point2_geo = (-38.53, -3.72) # Destino em fortaleza

#fazendo a projeção do ponto usando 'WGS84'
point1 = proj(point1_geo[0], point1_geo[1])
point2 = proj(point2_geo[0], point2_geo[1])

#converter ponto em ponto cartesiano
point1_cart = Point(point1) 
point2_cart = Point(point2)

print(point1_cart.distance(point2_cart))

Simple e direto, toda a matemática complexa fica por conta das bibliotecas.

Alfredo Miranda

unread,
Jun 11, 2013, 6:11:37 AM6/11/13
to pug...@googlegroups.com
Moacir, eu implementei a função de Haversine. Aparentemente funcionando!hehe
Alfredo Miranda
Graduando em Engenharia de Computação - IFCE
Bolsista FUNCEME

Moacir Bispo Bezerra Filho

unread,
Jun 11, 2013, 8:17:25 AM6/11/13
to pug...@googlegroups.com
Sim... vai funcionar... porem se fosse usar junto ao google maps, por exemplo, poderia ter uma leve distorção nos valores. E assim não.
Sem falar que a velocidade pelo shapely e pyproj são bem melhor... pois eles são calculados  em C.

Alfredo Miranda

unread,
Jun 11, 2013, 8:22:06 AM6/11/13
to pug...@googlegroups.com
Hmm, bom saber! :D

Davi di Cavalcanti

unread,
Jun 11, 2013, 10:01:58 AM6/11/13
to pug...@googlegroups.com
Exato Moacir.. coloquei ali que deve ser convertido. Nunca trabalhei com latitude e longitude, mas a matemática é a mesma. Basta atentar a essas transformações e ao fato que a Terra é redonda. 


2013/6/10 Moacir Bispo Bezerra Filho <bi...@det.ufc.br>
A forma r² = x² + y² só funciona se as unidades forem as mesmas.... X e Y estão em latitude/longitude e R em quilometros. Para converter Latitude e longitude em quilometros é uma formula pouco complexa, pois leva em conta uma "geodesica" ou seja: uma mesma diferença lat/log pode ter distâncias diferentes dependendo do quadrante que se encontre. Quanto mais proximo dos polos menor a distância... quanto mais proximo do ecuador maior a distância.

Davi di Cavalcanti

unread,
Jun 11, 2013, 10:03:49 AM6/11/13
to pug...@googlegroups.com
Massa a biblioteca!

João Paulo Ribeiro

unread,
Jun 16, 2013, 8:34:06 PM6/16/13
to pug...@googlegroups.com
Opa Moacir,

Informação corretíssima. Mas existe sempre a possibilidade de se converter coordenadas LATLONG (geralmente no datum WGS84) para coordenadas no formato UTM, para o brasil o datum SAD69 corrige as "imperfeições" que o WGS84 tem e permite que as coordenadas UTMX e UTMY sejam tratadas como simples coordenadas cartesianas, podendo dessa forma utilizar formulas como a do círculo conforme acima sugerido.


2013/6/10 Moacir Bispo Bezerra Filho <bi...@det.ufc.br>
A forma r² = x² + y² só funciona se as unidades forem as mesmas.... X e Y estão em latitude/longitude e R em quilometros. Para converter Latitude e longitude em quilometros é uma formula pouco complexa, pois leva em conta uma "geodesica" ou seja: uma mesma diferença lat/log pode ter distâncias diferentes dependendo do quadrante que se encontre. Quanto mais proximo dos polos menor a distância... quanto mais proximo do ecuador maior a distância.

Moacir Bispo Bezerra Filho

unread,
Jun 16, 2013, 9:19:38 PM6/16/13
to pug...@googlegroups.com
Legal essa sua dica. Vejo que você entende bem sobre Geoposicionamento.
Você trabalha com isso?

João Paulo Ribeiro

unread,
Jun 17, 2013, 12:01:18 AM6/17/13
to pug...@googlegroups.com
trabalhei com isso um bom tempo na outra empresa q trabalhei
quase uns 3 anos
não era só isso, mas aprender sobre georeferenciamento foi uma coisa estratégica para a área q trabalhei


2013/6/16 Moacir Bispo Bezerra Filho <bi...@det.ufc.br>
Reply all
Reply to author
Forward
0 new messages