[DebianGIS-dev] r2697 - packages/gpsdrive/trunk/debian/patches

hamish-guest at alioth.debian.org hamish-guest at alioth.debian.org
Sun Feb 7 23:18:00 UTC 2010


Author: hamish-guest
Date: 2010-02-07 23:18:00 +0000 (Sun, 07 Feb 2010)
New Revision: 2697

Added:
   packages/gpsdrive/trunk/debian/patches/gpsdrive2.10pre7_osm_proj.patch
Log:
add basis for patch to be applied to 2.10pre7 (whenever that happens) to fix broken OpenStreetMap projection handling

Added: packages/gpsdrive/trunk/debian/patches/gpsdrive2.10pre7_osm_proj.patch
===================================================================
--- packages/gpsdrive/trunk/debian/patches/gpsdrive2.10pre7_osm_proj.patch	                        (rev 0)
+++ packages/gpsdrive/trunk/debian/patches/gpsdrive2.10pre7_osm_proj.patch	2010-02-07 23:18:00 UTC (rev 2697)
@@ -0,0 +1,572 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## gpsdrive2.10pre7_osm_proj.patch by H. Bowman <hamish_b yahoo com>
+##
+## DP: Fix OpenStreetMap projection handling (backport from upstream)
+
+ at DPATCH@
+Index: src/map_download.c
+===================================================================
+--- src/map_download.c	(revision 2476)
++++ src/map_download.c	(revision 2477)
+@@ -61,8 +61,8 @@
+ # endif
+ 
+ 
+-#include <gpsdrive.h>
+-#include <map_handler.h>
++#include "gpsdrive.h"
++#include "map_handler.h"
+ #include "gpsdrive_config.h"
+ #include "gui.h"
+ #include "map_download.h"
+@@ -133,24 +133,20 @@
+ 	MAPSOURCE_LANDSAT, "1 : 50 million", 0, 50000000,
+ 
+ 	MAPSOURCE_OSM_TAH, "OpenStreetMap Tiles at Home", -1, -1,
+-	MAPSOURCE_OSM_TAH, "1 : 147 456 000", 1, 256*576000,
+-	MAPSOURCE_OSM_TAH, "1 : 73 728 000", 2, 128*576000,
+-	MAPSOURCE_OSM_TAH, "1 : 36 864 000", 3, 64*576000,
+-	MAPSOURCE_OSM_TAH, "1 : 18 432 000", 4, 32*576000,
+-	MAPSOURCE_OSM_TAH, "1 : 9 216 000", 5, 16*576000,
+-	MAPSOURCE_OSM_TAH, "1 : 4 608 000", 6, 8*576000,
+-	MAPSOURCE_OSM_TAH, "1 : 2 304 000", 7, 4*576000,
+-	MAPSOURCE_OSM_TAH, "1 : 1 152 000", 8, 2*576000,
+-
+-	MAPSOURCE_OSM_TAH, "1 : 576 000", 9, 576000,
+-	MAPSOURCE_OSM_TAH, "1 : 288 000", 10, 288000,
+-	MAPSOURCE_OSM_TAH, "1 : 144 000", 11, 144000,
+-	MAPSOURCE_OSM_TAH, "1 : 72 000", 12, 72000,
+-	MAPSOURCE_OSM_TAH, "1 : 36 000", 13, 36000,
+-	MAPSOURCE_OSM_TAH, "1 : 18 000", 14, 18000,
+-	MAPSOURCE_OSM_TAH, "1 : 9 000", 15, 9000,
+-	MAPSOURCE_OSM_TAH, "1 : 4 500", 16, 4500,
+-	MAPSOURCE_OSM_TAH, "1 : 2 250", 17, 2250,
++	/* scale varies with latitude, so this is just a rough guide
++		which will only be valid for mid-lats */
++	/* Octave code: for lat=0:5:75;   disp( [lat (a * 2*pi *pixelfact * cos(lat  * pi/180))  / (256*2^9)]); end */
++	MAPSOURCE_OSM_TAH, "1 : 2 500", 17, 2250,
++	MAPSOURCE_OSM_TAH, "1 : 5 000", 16, 4500,
++	MAPSOURCE_OSM_TAH, "1 : 10 000", 15, 9000,
++	MAPSOURCE_OSM_TAH, "1 : 20 000", 14, 18000,
++	MAPSOURCE_OSM_TAH, "1 : 40 000", 13, 36000,
++	MAPSOURCE_OSM_TAH, "1 : 75 000", 12, 72000,
++	MAPSOURCE_OSM_TAH, "1 : 150 000", 11, 144000,
++	MAPSOURCE_OSM_TAH, "1 : 300 000", 10, 288000,
++	MAPSOURCE_OSM_TAH, "1 : 600 000", 9, 576000,
++	/* the distortion gets too bad at scales wider than 1:500k
++	    It would be more accurate to stop earlier, but we compromise */
+ 	MAPSOURCE_N_ITEMS, "", 0, 0
+ };
+ 
+@@ -165,7 +161,23 @@
+ 	gtk_entry_set_text (GTK_ENTRY (lon_entry), lon);
+ }
+ 
++/* *****************************************************************************
++ * calculate the local map scale based on Web Tile zoom level and latitude
++ */
++double
++calc_webtile_scale (double lat, int zoom)
++{
++    double scale;
++    double a = 6378137.0; /* major radius of WGS84 ellipsoid (meters) */
+ 
++    scale = (a * 2*M_PI * cos(DEG2RAD(lat)) * PIXELFACT) / (256 * pow(2,zoom));
++
++    if (mydebug > 3)
++	g_print ("Tile scale: %.2f\n", scale);
++
++    return scale;
++}
++
+ /* *****************************************************************************
+  * callback to set paramaters for map to download
+  */
+@@ -195,9 +207,13 @@
+ 			3, &mapdl_scale, -1);
+ /* TODO: determine map_ or top_ proj at this point so drawdownloadrectangle()
+  *	 knows how big to draw the green preview box */
++		if (local_config.mapsource_type == MAPSOURCE_OSM_TAH)
++		    mapdl_scale = (int)calc_webtile_scale(mapdl_lat, mapdl_zoom);
++
+ 		if (mydebug > 3)
+ 			g_print ("new map scale/zoom level: %d / %d\n",
+ 				mapdl_scale, mapdl_zoom);
++
+ 		local_config.mapsource_scale = gtk_combo_box_get_active (GTK_COMBO_BOX (scale_combobox));
+ 		current.needtosave = TRUE;
+ 	}
+@@ -439,6 +455,7 @@
+ 	gchar file_path[512];
+ 	gchar path[40];
+ 	gchar img_fmt[4];
++	gchar scale_str[40];
+ 
+ 	if (mapdl_active)
+ 		return TRUE;
+@@ -450,11 +467,14 @@
+ 			g_strlcpy (path, "landsat", sizeof (path));
+ 			g_strlcpy (img_fmt, "jpg", sizeof (img_fmt));
+ 			mapdl_geturl_landsat ();
++			g_snprintf (scale_str, sizeof (scale_str), "%d", mapdl_scale);
+ 			break;
+ 		case MAPSOURCE_OSM_TAH:
+ 			g_strlcpy (path, "openstreetmap_tah", sizeof (path));
+ 			g_strlcpy (img_fmt, "png", sizeof (img_fmt));
+ 			mapdl_geturl_osm_tah ();
++			mapdl_scale = (int)calc_webtile_scale(mapdl_lat, mapdl_zoom);
++			g_snprintf (scale_str, sizeof (scale_str), "%d", mapdl_zoom);
+ 			break;
+ 		default:
+ 			return TRUE;
+@@ -464,10 +484,11 @@
+ 		g_print ("  download url:\n%s\n", mapdl_url);
+ 
+ 	/* set file path and create directory if necessary */
+-	
+-	
+-	g_snprintf (file_path, sizeof (file_path), "%s%s/%d/%.0f/%.0f/",
+-		local_config.dir_maps, path, mapdl_scale, mapdl_lat, mapdl_lon);
++
++	g_snprintf (file_path, sizeof (file_path), "%s%s/%s/%.0f/%.0f/",
++		local_config.dir_maps, path, scale_str, mapdl_lat, mapdl_lon);
++
++
+ 	if(!g_file_test (file_path, G_FILE_TEST_IS_DIR))
+ 	{
+ 		if (g_mkdir_with_parents (file_path, 0700))
+@@ -477,14 +498,15 @@
+ 	}
+ 
+ 	/* complete filename */
+-	g_snprintf (mapdl_file_w_path, sizeof (mapdl_file_w_path), "%s%s_%d_%5.3f_%5.3f.%s",
+-		file_path, mapdl_proj, mapdl_scale, mapdl_lat, mapdl_lon, img_fmt);
++	g_snprintf (mapdl_file_w_path, sizeof (mapdl_file_w_path), "%s%s_%s_%5.3f_%5.3f.%s",
++		file_path, mapdl_proj, scale_str, mapdl_lat, mapdl_lon, img_fmt);
+ 
+ 	if (mydebug > 10)
+ 		g_print ("  filename: %s\n", mapdl_file_w_path);
+ 
+ 	gtk_progress_bar_set_text (GTK_PROGRESS_BAR (mapdl_progress),
+ 		_("Loading Map..."));
++
+ 	mapdl_abort = FALSE;
+ 	mapdl_download ();
+ 
+Index: src/map_download.h
+===================================================================
+--- src/map_download.h	(revision 2476)
++++ src/map_download.h	(revision 2477)
+@@ -1,10 +1,9 @@
+ /***********************************************************************
+ 
+ Copyright (c) 2008 Guenther Meyer <d.s.e (at) sordidmusic.com>
+-
+ Website: www.gpsdrive.de/
+ 
+-Disclaimer: Please do not use for navigation.
++Disclaimer: Please do not use as a primary means of navigation.
+ 
+     This program is free software; you can redistribute it and/or modify
+     it under the terms of the GNU General Public License as published by
+@@ -36,5 +35,6 @@
+ void mapdl_set_coords (gchar *lat, gchar *lon);
+ gint mapdl_init (void);
+ gint mapdl_cleanup (void);
++double calc_webtile_scale (double, int);
+ 
+ #endif /* GPSDRIVE_MAP_DOWNLOAD_H */
+Index: scripts/gpsfetchmap.pl
+===================================================================
+--- scripts/gpsfetchmap.pl	(revision 2479)
++++ scripts/gpsfetchmap.pl	(revision 2480)
+@@ -47,6 +47,7 @@
+ modified (Jul 2007) by Maciek Kaliszewski <mkalkal\@interia.pl>
+ modified (Oct 2007) by Andreas Putzo <andreas\@putzo.net>
+ modified (Jan 2008) by Gernot Hillier <gernot\@hillier.de> (added Openstreetmap support)
++modified (Aug 2009) by Hamish Bowman <hamish_b yahoo com> (fix OSM+WMS map scales)
+ Version svn-$Version
+ ";
+ 
+@@ -151,24 +152,20 @@
+       10000000 =>10000000,
+       50000000 =>50000000,
+     },
++# Web Map Tiles scale varies with latitude by the formula
++# (a * 2*pi * PIXELFACT * cos(lat * pi/180)) / (256 * 2^zoom)
++# where a is major radius of the Earth according to the WGS84 ellipsoid definition.
++# zoom levels lower than 9 (~1:500k) badly distort the Mercator so are not offered.
+     openstreetmap_tah => {
+-      256*576000 =>  1,
+-      128*576000 =>  2,
+-       64*576000 =>  3,
+-       32*576000 =>  4,
+-       16*576000 =>  5,
+-        8*576000 =>  6,
+-        4*576000 =>  7,
+-        2*576000 =>  8,
+-          576000 =>  9,
+-          288000 => 10,
+-          144000 => 11,
+-           72000 => 12,
+-           36000 => 13,
+-           18000 => 14,
+-           9000  => 15,
+-            4500 => 16,
+-            2250 => 17
++          600000 =>  9,
++          300000 => 10,
++          150000 => 11,
++           75000 => 12,
++           40000 => 13,
++           20000 => 14,
++           10000 => 15,
++            5000 => 16,
++            2500 => 17
+     }
+ };
+ 
+@@ -240,8 +237,6 @@
+     $polite=1;
+ }
+ 
+-
+-
+ if ( $mapserver eq 'geoscience' )
+ {
+     $scale ||= join(",",keys %{$Scale2Zoom->{'geoscience'}});
+@@ -269,22 +264,24 @@
+ pod2usage(-verbose=>2) if $man;
+ 
+ sub append_koords($$$$);   # {}
++sub calc_webtile_scale ($$); # {}
+ sub check_coverage($);     # {}
+ sub check_koord_file($);   # {}
+ sub debug($);              # {}
++sub file_count($);         # {}
+ sub geoscience_url($$$);   # {}
+-sub landsat_url($$$);   # {}
+-sub resize($$); #{}
+-sub file_count($);         # {}
+ sub get_coords_for_route;  # {}
+ sub get_coords_for_track($); # {}
++sub get_gpsd_position();   # {}
+ sub get_waypoint($);       # {}
+ sub is_map_file($);        # {}
++sub landsat_url($$$);      # {}
++sub openstreetmap_tah_url($$$); # {}
+ sub read_gpstool_map_file(); # {}
+ sub read_koord_file($);    # {}
++sub resize($$);            # {}
+ sub update_gpsdrive_map_koord_file(); # {}
+ sub wget_map($$$);         # {}
+-sub get_gpsd_position();       # {}
+ 
+ STDERR->autoflush(1);
+ STDOUT->autoflush(1);
+@@ -407,7 +404,9 @@
+ 
+ my ($existing,$wanted) = file_count($desired_locations);
+ print "You are about to download $wanted (".($existing+$wanted).") file(s).\n";
+-
++if ($debug) {
++    print "Politeness delay set to $polite seconds,\n";
++}
+ if ( $mapserver eq 'geoscience' ){
+     print "+-----------------------------------------------------------+\n";
+     print "| Geoscience Maps are Copyright, Commonwealth of Australia  |\n";
+@@ -419,6 +418,7 @@
+     print "+----------------------------------------------------------------+\n";
+     print "| Landsat maps are courtesy JPL/NASA's OnEarth WMS Global Mosaic |\n";
+     print "| Map prefix will be set automatically based on scale.           |\n";
++    print "+----------------------------------------------------------------+\n";
+     # By law, US Government data is without copyright.
+ }elsif ( $mapserver eq 'openstreetmap_tah' ){
+     print "+-----------------------------------------------------------+\n";
+@@ -427,6 +427,8 @@
+     print "| They are free for use under the terms of the              |\n";
+     print "| Creative Commons \"Attribution-Share Alike 2.0 Generic\"    |\n";
+     print "| license. See http://www.openstreetmap.org for details.    |\n";
++    print "+-----------------------------------------------------------+\n";
++
+ } elsif ( ! $force) {
+     print "You may violating the map servers terms of use!\n";
+     print "Please use their service responsible!\n";
+@@ -654,14 +656,32 @@
+ ######################################################################
+ sub map_filename($$$){
+     my ($scale,$lati,$long) = @_;
++
++    my $mscale = $scale;
++
++    if ( $mapserver eq 'openstreetmap_tah' ) {
++	my $zoom = undef;
++	for my $s ( sort keys %{$Scale2Zoom->{openstreetmap_tah}} ) {
++	    next unless $s == $scale;
++	    $zoom = $Scale2Zoom->{openstreetmap_tah}->{$s};
++	    last;
++	}
++	unless ( $zoom ) {
++	    print "Error calculating Zoomlevel for Scale: $scale\n";
++	    return (undef);
++	}
++	$mscale = $zoom;
++    }
+     
+-    my $filename = "$mapserver/$scale"
++    my $filename = "$mapserver/$mscale"
+ 	."/".int($lati)
+ #	."/".sprintf("%3.1f",$lati)
+ 	."/".int($long)
+-	."/$FILEPREFIX$scale-$lati-$long.$fileext";
+-    printf("Filename(%.0f,%.5f,%.5f): $filename\n",$scale,$lati,$long)
++	."/$FILEPREFIX$mscale-$lati-$long.$fileext";
++
++    printf("Filename(%.0f,%.5f,%.5f): $filename\n",$mscale,$lati,$long)
+ 	if $debug;
++
+     return $filename;
+ }
+ 
+@@ -678,6 +698,9 @@
+     # mapblast/1000/047/047.0232/9/map_1000-047.0232-0009.8140.gif 47.02320 9.81400 1000
+     #my $filename = "$mapserver/$scale/".int($lati)."/".sprintf("%3.1f",$lati).
+     #"/".int($long)."/$FILEPREFIX$scale-$lati-$long.gif";
++    if ($debug) {
++	print "---------------\n";
++    }
+ 
+     # redundant??
+     if ($mapserver eq 'landsat')
+@@ -1082,7 +1105,7 @@
+ 	    $lon2 += 360;
+ 	}
+ 
+-    debug( "landsat_url(LAT=$lat,LON=$lon,SCALE=$scale,FACTOR=$factor)");
++    debug( "landsat_url(LAT=$lat,LON=$lon,SCALE=$scale)");
+ 
+     debug( "Calculated Lat1  $lat1");
+     debug( "Calculated Lat2  $lat2");
+@@ -1111,7 +1134,28 @@
+     return ($url,$scale);
+ }
+ 
++
+ #############################################################################
++# calculate the local map scale based on Web Tile zoom level and latitude
++# This same formula is used by OSM, Google Maps, Microsoft Maps, ...
++sub calc_webtile_scale ($$){
++    my $lat = shift;
++    my $zoom = shift;
++
++    # major radius of WGS84 ellipsoid (meters)
++    my $a = $RADIUS_KM * 1000;
++
++    my $zscale = (2*$a*$PI * cos($lat*$D2R) * $PIXELFACT) / (256 * 2**$zoom);
++
++    if ($debug) {
++        print "Tile scale: $zscale\n";
++    }
++
++    return ($zscale);
++}
++
++
++#############################################################################
+ sub openstreetmap_tah_url($$$){
+     my $lati = shift;
+     my $long = shift;
+@@ -1122,7 +1166,7 @@
+     for my $s ( sort keys %{$Scale2Zoom->{openstreetmap_tah}} ) {
+ 	next unless $s == $scale;
+ 	$zoom = $Scale2Zoom->{openstreetmap_tah}->{$s};
+-	$mapscale = $s;
++	$mapscale = calc_webtile_scale($lati, $zoom);
+ 	last;
+     }
+ 
+@@ -1132,10 +1176,9 @@
+     }
+ 
+     if ($debug) {
+-	print "\n";
+-	print "Using openstreetmap_tah zoom ", $zoom, " for requested scale ", $scale, ":1 actual scale ", $mapscale, ":1\n";
+-	print "lat: $lati\n";
+-	print "lon: $long\n";
++	print "Using openstreetmap_tah zoom ", $zoom, " for requested scale 1:", $scale, ". Actual scale 1:", $mapscale, "\n";
++	print "cetner lat: $lati\n";
++	print "cetner lon: $long\n";
+     }
+ 
+     my $url = "http://tah.openstreetmap.org/MapOf/?lat=$lati&long=$long&z=$zoom&w=1280&h=1024&format=png";
+@@ -1903,7 +1946,7 @@
+ 
+ gpsfetchmap -w <WAYPOINT NAME> -sc <SCALE> -a <#> -p
+ 
+-gpsfetchmap -la <latitude DD.DDDD> -lo <latitude DD.DDDD> -sc <SCALE> -a <#> -p
++gpsfetchmap -la <latitude DD.DDDD> -lo <longitude DD.DDDD> -sc <SCALE> -a <#> -p
+ 
+ gpsfetchmap -sla <start latitude DD.DDDD> -endla <end latitude DD.DDDD> -slo <start longitude DD.DDDD> -endlo <end longitude DD.DDDD> -sc <SCALE> -a <#> -p
+ 
+@@ -1915,7 +1958,7 @@
+             [-la <latitude DD.DDDD>] [-lo <longitude DD.DDDD>] 
+             [-sla <start latitude DD.DDDD>] [-endla <end latitude DD.DDDD>]
+             [-slo <start longitude DD.DDDD>] [-endlo <end longitude DD.DDDD>]
+-            [-sc <SCALE>] [-a <#>] [-p] [-m <MAPSERVER>]
++            [-sc <SCALE>] [-a <#>] [-p <#>] [-m <MAPSERVER>]
+             [-u <UNIT>] [-md <DIR>] [-W <FILE>] [-t <FILE>] [-r]
+             [-C <FILE>] [-P <PREFIX>] [-F] [-d] [-v] [-h] [-M] [-n] [-U] [-c]
+ 
+@@ -2000,7 +2043,7 @@
+ of longitude. 'units' is read from the configuration file (-C) or as defined
+ by (-u).
+ 
+-=item B<-p, --polite>
++=item B<-p, --polite <#>>
+ 
+ This causes the program to sleep one second between downloads to be polite
+ to the mapserver. Takes an optional value of number of seconds to sleep.
+@@ -2117,6 +2160,13 @@
+ 
+ Prints the manual page and exits.
+ 
++=back
++
++
++=head1 OUTPUT
++
++=over 2
++
+ =item B<Download>
+ 
+ When downloading Maps the output reads as folows:
+@@ -2130,5 +2180,16 @@
+ 
+ =back
+ 
++
++=head1 EXAMPLE
++
++Download all 1:10000 OpenStreetMaps in a 5 km radius around the
++Sydney Convention Centre. Between tile downloads it will let
++the server rest for 3 seconds.
++ 
++gpsfetchmap --mapserver openstreetmap_tah --polite 3 \
++   --lat "-33.8753" --lon 151.2001 --scale 10000 \
++   --area 5 --unit kilometers
++
+ =cut
+ 
+Index: scripts/mapnik/gpsdrive_mapnik_gentiles-in.py
+===================================================================
+--- scripts/mapnik/gpsdrive_mapnik_gentiles-in.py	(revision 2473)
++++ scripts/mapnik/gpsdrive_mapnik_gentiles-in.py	(revision 2479)
+@@ -7,14 +7,20 @@
+ 
+ Options:
+   -h, --help     show this help
+-  -b, --bbox     boundingbox (lon,lat,lon,lat) - Be carefull! Quote negative values!
+-  -s, --scale    scale single/range
+-                              1 = 147456000
+-                              2 = 73728000
+-                             ...
+-                             15 = 9000
+-                             16 = 4500
+-                             17 = 2250
++  -b, --bbox     boundingbox (minlon,minlat,maxlon,maxlat)
++                  - Be carefull! "Quote" negative values!
++  -s, --scale    scale single/range (zoom level or min-max)
++                   (below "9" Mercator becomes distorted;
++		    actual scale will vary with latitude)
++                        9 - 1:600,000
++                       10 - 1:300,000
++                       11 - 1:150,000
++                       12 - 1:75,000
++                       13 - 1:40,000
++                       14 - 1:20,000
++                       15 - 1:10,000
++                       16 - 1:5,000
++                       17 - 1:2,500
+   --test         testrun = generates Munich example
+                              
+ Examples:
+@@ -22,7 +28,7 @@
+   Munich:
+     gpsdrive_mapnik_gentiles.py -b  11.4,48.07,11.7,48.2 -s 10-16
+   
+-  World:
++  World: (just to demonstrate lat/lon order; scale not recommended)
+     gpsdrive_mapnik_gentiles.py -b "-180.0,-90.0,180.0,90.0" -s 1-6
+ """
+ 
+@@ -32,12 +38,19 @@
+ import getopt
+ import string
+ 
+-zoom2scale = [728 * 576000,256 * 576000,128 * 576000,64 * 576000,32 * 576000,16 * 576000,8 * 576000,4 * 576000,2 * 576000,576000,288000,144000,72000,36000,18000,9000,4500,2250,1125]
+ 
+-
+ DEG_TO_RAD = pi/180
+ RAD_TO_DEG = 180/pi
+ 
++def calc_scale (lat, zoom):
++    # GpsDrive's hardcoded pixels per meter ratio
++    PixelFact = 2817.947378
++    # wgs84 major Earth axis
++    a = 6378137.0
++    dynscale = ( a * 2*pi * cos(lat * DEG_TO_RAD) * PixelFact ) / ( 256*pow(2,zoom) )
++    print dynscale
++    return dynscale
++
+ def minmax (a,b,c):
+     a = max(a,b)
+     a = min(a,c)
+@@ -90,17 +103,28 @@
+          os.mkdir(tile_dir)
+ 
+     gprj = GoogleProjection(maxZoom+1) 
++
+     #m = Map(2 * 256,2 * 256)
+     m = Map(1280,1024)
+     load_map(m,mapfile)
+-    prj = Projection("+proj=merc +datum=WGS84")
+-    
++
++    #prj = Projection("+proj=merc +datum=WGS84")
++    # What follows is from /usr/share/proj/esri.extra, EPSG:900913
++    #  "Chris' funny epsgish code for the google mercator"
++    prj = Projection("+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs")
++
+     ll0 = (bbox[0],bbox[3])
+     ll1 = (bbox[2],bbox[1])
+-    
++
+     for z in range(minZoom,maxZoom + 1):
++        if z == 9:
++            print "CAUTION: Mercator projection begins to be noticeably distorted at this zoom level."
++        elif z < 9:
++            print "WARNING: Mercator projection is very distorted at this zoom level."
++
+         px0 = gprj.fromLLtoPixel(ll0,z)
+         px1 = gprj.fromLLtoPixel(ll1,z)
++
+         for x in range(int(px0[0]/640.0),int(px1[0]/640.0)+1):
+             for y in range(int(px0[1]/512.0),int(px1[1]/512.0)+1):
+                 p0 = gprj.fromPixelToLL((x * 640.0, (y+1) * 512.0),z)
+@@ -145,7 +169,7 @@
+                     fh_mapkoord.write(tile_path + " ")
+                     fh_mapkoord.write(str((p0[1] + p1[1]) / 2) + " ")
+                     fh_mapkoord.write(str((p0[0] + p1[0]) / 2) + " ")
+-                    fh_mapkoord.write(str(zoom2scale[z]))
++                    fh_mapkoord.write(str( calc_scale( (p0[1] + p1[1])/2, z) ))
+                     fh_mapkoord.write(" " + str(p0[1]) + " " + str(p0[0]))
+                     fh_mapkoord.write(" " + str(p1[1]) + " " + str(p1[0]))
+                     fh_mapkoord.write("\n")
+@@ -221,6 +245,7 @@
+     
+     # check for correct values
+     if str(eval(bboxs[0])) != bboxs[0] or str(eval(bboxs[1])) != bboxs[1] or str(eval(bboxs[2])) != bboxs[2] or str(eval(bboxs[3])) != bboxs[3]:
++        # rounding problems... what exactly is this supposed to be checking ???
+         sys.exit("Boundingbox invalid!")
+         
+     if minZoom < 1 or minZoom > 17 or maxZoom < 1 and maxZoom > 17 or minZoom > maxZoom or int(minZoom) <> minZoom or int(maxZoom) <> maxZoom:




More information about the Pkg-grass-devel mailing list