Created
May 12, 2013 17:17
-
-
Save pepgonzalez/5564283 to your computer and use it in GitHub Desktop.
Código simulador de Geolocalizacion
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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