From 529396bf5696d60ae1f0c2da5b64ada0d6ed0eae Mon Sep 17 00:00:00 2001 From: javiplx Date: Fri, 4 Jun 2010 13:00:57 +0000 Subject: [PATCH] Account for partial tiles in conversions to and from geographical coordinates git-svn-id: file:///svnroot/wifihood/trunk/wifiscanner@13 c51dfc6a-5949-4919-9c8e-f207a149c383 --- wifiview | 64 ++++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/wifiview b/wifiview index 4a6bbe8..f8cd667 100755 --- a/wifiview +++ b/wifiview @@ -42,29 +42,35 @@ class mapWidget ( gtk.Image , WifihoodConfig ) : # Maximum width should be 800, but actually gets reduced self.win_x , self.win_y = 800 , 480 + self.tile_size = 256 p = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, True, 8, self.win_x, self.win_y) self.set_from_pixbuf(p) self.read() - self.reftile_x , self.reftile_y = self.lon2tilex( self.lon , self.zoom ) , self.lat2tiley( self.lat , self.zoom ) - # Half the size of a tile - self.refpix_x , self.refpix_y = 128 , 128 + self.reftile_x , self.refpix_x = self.lon2tilex( self.lon , self.zoom ) + self.reftile_y , self.refpix_y = self.lat2tiley( self.lat , self.zoom ) self.composeMap() def lon2tilex ( self , lon , zoom ) : - return int( ( lon + 180 ) / 360 * 2 ** zoom ) + number = math.modf( ( lon + 180 ) / 360 * 2 ** zoom ) + return int( number[1] ) , int( self.tile_size * number[0] ) def lat2tiley ( self , lat , zoom ) : lat = lat * math.pi / 180 - return int( ( 1 - math.log( math.tan( lat ) + 1 / math.cos( lat ) ) / math.pi ) / 2 * 2 ** zoom ) - - def tilex2lon ( self , tilex , zoom ) : - return tilex / 2.0 ** zoom * 360.0 - 180.0 - - def tiley2lat ( self , tiley , zoom ) : - tiley = math.pi * ( 1 - 2 * tiley / 2.0 ** zoom ) + number = math.modf( ( 1 - math.log( math.tan( lat ) + 1 / math.cos( lat ) ) / math.pi ) / 2 * 2 ** zoom ) + return int( number[1] ) , int( self.tile_size * number[0] ) + + def tilex2lon ( self , ( tilex , pixx ) , zoom ) : + tilex = float(tilex) + pixx = float(pixx) + return ( tilex + pixx/self.tile_size ) / 2.0 ** zoom * 360.0 - 180.0 + + def tiley2lat ( self , ( tiley , pixy ) , zoom ) : + tiley = float(tiley) + pixy = float(pixy) + tiley = math.pi * ( 1 - 2 * ( tiley + pixy/self.tile_size ) / 2.0 ** zoom ) return math.degrees( math.atan( math.sinh( tiley ) ) ) def composeMap( self ) : @@ -80,7 +86,7 @@ class mapWidget ( gtk.Image , WifihoodConfig ) : for j in range(-3,4) : file = self.tilename( i , j , self.zoom ) if file is None : - pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, 256, 256 ) + pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, self.tile_size, self.tile_size ) pixbuf.fill( 0x00000000 ) else : try : @@ -94,30 +100,30 @@ class mapWidget ( gtk.Image , WifihoodConfig ) : pixbuf = gtk.gdk.pixbuf_new_from_file( file ) except : print "Total failure for tile for %s,%s" % ( self.reftile_x + i , self.reftile_y + j ) - pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, 256, 256 ) + pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, self.tile_size, self.tile_size ) - dest_x = 256 * i + center_x - dest_y = 256 * j + center_y + dest_x = self.tile_size * i + center_x + dest_y = self.tile_size * j + center_y init_x = 0 - size_x = 256 + size_x = self.tile_size if dest_x < 0 : init_x = abs(dest_x) - size_x = 256 + dest_x + size_x = self.tile_size + dest_x dest_x = 0 - if dest_x + 256 > self.win_x : + if dest_x + self.tile_size > self.win_x : size_x = self.win_x - dest_x init_y = 0 - size_y = 256 + size_y = self.tile_size if dest_y < 0 : init_y = abs(dest_y) - size_y = 256 + dest_y + size_y = self.tile_size + dest_y dest_y = 0 - if dest_y + 256 > self.win_y : + if dest_y + self.tile_size > self.win_y : size_y = self.win_y - dest_y - if ( size_x > 0 and size_y > 0 ) and ( init_x < 256 and init_y < 256 ) : + if ( size_x > 0 and size_y > 0 ) and ( init_x < self.tile_size and init_y < self.tile_size ) : pixbuf.copy_area( init_x, init_y, size_x, size_y, self.get_pixbuf(), dest_x , dest_y ) del(pixbuf) @@ -154,23 +160,23 @@ class mapWidget ( gtk.Image , WifihoodConfig ) : def Shift( self , dx , dy ) : self.hide() - tile_x , tile_y = ( self.refpix_x - dx ) / 256 , ( self.refpix_y - dy ) / 256 + tile_x , tile_y = ( self.refpix_x - dx ) / self.tile_size , ( self.refpix_y - dy ) / self.tile_size self.reftile_x += tile_x self.reftile_y += tile_y - self.refpix_x -= dx + 256 * tile_x - self.refpix_y -= dy + 256 * tile_y + self.refpix_x -= dx + self.tile_size * tile_x + self.refpix_y -= dy + self.tile_size * tile_y self.composeMap() self.show() def SetZoom( self , zoom ) : self.hide() - lat = self.tiley2lat( self.reftile_y , self.zoom ) - lon = self.tilex2lon( self.reftile_x , self.zoom ) - self.reftile_x , self.reftile_y = self.lon2tilex( lon , zoom ) , self.lat2tiley( lat , zoom ) + lat = self.tiley2lat( ( self.reftile_y , self.refpix_y ) , self.zoom ) + lon = self.tilex2lon( ( self.reftile_x , self.refpix_x ) , self.zoom ) + self.reftile_x , self.refpix_x = self.lon2tilex( lon , zoom ) + self.reftile_y , self.refpix_y = self.lat2tiley( lat , zoom ) self.zoom = zoom - self.refpix_x , self.refpix_y = 128 , 128 self.composeMap() self.show() -- 1.7.9.5