Skip to content

Instantly share code, notes, and snippets.

@pepgonzalez
Created May 12, 2013 17:17
Show Gist options
  • Save pepgonzalez/5564283 to your computer and use it in GitHub Desktop.
Save pepgonzalez/5564283 to your computer and use it in GitHub Desktop.
Código simulador de Geolocalizacion
#encoding utf-8
from math import sqrt, ceil, floor
from PIL import Image, ImageDraw
#normaliza un valor con decimales
def normaliza(valor):
if (valor - int(valor)) > 0.5:
valor = int(ceil(valor))
else:
valor = int(floor(valor))
return valor
#calcula la distancia entre dos puntos
def dameDistancia(a, b):
distancia = sqrt((a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2)
return normaliza(distancia)
#obtene todos los puntos que estan a una cierta distancia
#del centro
def obtenerRadio(c, r, x, y):
coordenadas = list()
for j in xrange(y):
for i in xrange(x):
distancia = dameDistancia(c, (i,j))
if distancia == r:
coordenadas.append((i,j))
return coordenadas
#funcion para pintar los radios en la imagen
def pintaRadio(puntos, v, mapa):
x, y = mapa.size
colores = {1:(0,255,0), 2:(255,255,0), 3:(255,0,255),4:(255,0,0)}
for e in puntos:
if e[0] < x and e[1] < y:
mapa.putpixel(e, colores[v])
return mapa
#fucion para pedir datos
def pideDatos():
print "Datos de routers."
print ""
antenas = dict()
recepcion = dict()
x = int(raw_input("Tamano x del mapa? "))
y = int(raw_input("Tamano y del mapa? "))
for i in range(1,4):
(a,b) = tuple(int(x.strip()) for x in raw_input("Posicion de la antena? ").split(','))
radio = int(raw_input("Radio de cobertura de antena? "))
antenas[i] = (a,b), radio
print ""
print "Datos de geolocalizacion "
print ""
for i in range(1,4):
recepcion[i] = int(raw_input("Porcentaje de recepcion de antena "+str(i)+"?"))
return x, y, antenas, recepcion
#genera un mapa con las distancias de del usuario respecto a cada
#antena en base al la intensidad de senal recibida
def obtenerDistanciasDeAntenas(recepcion, antenas):
df = dict()
for antena in recepcion.keys():
faltante = 100 - recepcion[antena]
distancia = normaliza( (faltante * antenas[antena][1]) / 100.0 )
print "distancia calculada en base a recepcion de senal: ", distancia
df[antena] = distancia
return df
#Vota las posibles posiciones de cada antena, y obtiene el punto comun, el punto
#de ubicacion
def obtenerUbicacion(coordenadas):
votos = dict()
for lista in coordenadas:
for coord in lista:
if coord in votos:
votos[coord] += 1
else:
votos[coord] = 1
l = votos.items()
l.sort(key = lambda x: x[1])
mayor = l[len(votos)-1]
return mayor
#funcion principal
def main():
x , y , antenas, recepcion = pideDatos()
c = 1
mapa = Image.new('RGB',(x,y))
draw = ImageDraw.Draw(mapa)
#Para cada antena, obtener la cobertura y marcarla en la imagen
for ant in antenas.keys():
centro = antenas[ant][0]
radio = antenas[ant][1]
mapa.putpixel(centro, (0,0,255))
draw.text(centro, "Antena "+str(ant), fill=(255,255,255))
cobertura = obtenerRadio(centro, radio, x, y)
mapa = pintaRadio(cobertura, 4, mapa )
c += 1
print ""
print "Resultados."
print ""
dist_antenas = obtenerDistanciasDeAntenas(recepcion, antenas)
posiblesCoordenadas = list()
for antena in dist_antenas.keys():
ubicacionesPosibles = obtenerRadio(antenas[antena][0], dist_antenas[antena], x, y)
mapa = pintaRadio(ubicacionesPosibles, antena, mapa)
posiblesCoordenadas.append(ubicacionesPosibles)
ubicacion = obtenerUbicacion(posiblesCoordenadas)
posicion = ubicacion[0]
print ""
print "ubicacion del usuario detectada en coordenada: ", posicion
mapa.putpixel(posicion, (255,0,0))
draw.ellipse((posicion[0]-3, posicion[1]-3,posicion[0]+3,posicion[1]+3), fill=50, outline=225)
draw.text(posicion, "POSICION USUARIO", fill=(255,255,255))
mapa.show()
#funcion para obtener las intensidadess de un punto
def obtenerPorcentajes():
x, y, antenas, recepcion = pideDatos()
c = 1
mapa = Image.new('RGB',(x,y))
draw = ImageDraw.Draw(mapa)
(a,b) = tuple(int(n.strip()) for n in raw_input("Posicion de la antena? ").split(','))
for ant in antenas.keys():
centro = antenas[ant][0]
radio = antenas[ant][1]
mapa.putpixel(centro, (0,0,255))
draw.text(centro, "Antena "+str(ant), fill=(255,255,255))
cobertura = obtenerRadio(centro, radio, x, y)
mapa = pintaRadio(cobertura, 4, mapa )
c += 1
mapa.putpixel((a,b), (255,0,0))
draw.text((a,b), "POSICION USUARIO", fill=(255,255,255))
for antena in antenas.keys():
porcentaje = op((a,b), antenas[antena])
mapa.show()
def op(usuario, antenaYRadio):
p_antena = antenaYRadio[0]
radio = antenaYRadio[1]
distancia = dameDistancia(usuario, p_antena)
print "radio de antena ", radio
print "distancia entre puntos ", distancia
porcentaje = normaliza((distancia * 100.0) / radio)
print "intensidad recibida: ", 100 - porcentaje
main()
#obtenerPorcentajes()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment