* src/DataViews/_MapView.py: First badly hacked version of online map downloading.
svn: r6451
This commit is contained in:
parent
982105bc5d
commit
a8bc2ebc47
@ -1,3 +1,7 @@
|
||||
2006-04-26 Martin Hawlisch <Martin.Hawlisch@gmx.de>
|
||||
* src/DataViews/_MapView.py: First badly hacked version of online map
|
||||
downloading.
|
||||
|
||||
2006-04-25 Alex Roitman <shura@gramps-project.org>
|
||||
* src/GrampsCfg.py (build_window_key): Remove, as there's no need
|
||||
to override the base class anymore.
|
||||
|
@ -30,6 +30,12 @@ import gc
|
||||
import logging
|
||||
import os
|
||||
import math
|
||||
import urllib
|
||||
import urllib2
|
||||
import tempfile
|
||||
from xml.dom.minidom import parseString as xmlStringParser
|
||||
|
||||
use_online_map = False
|
||||
|
||||
log = logging.getLogger(".")
|
||||
|
||||
@ -72,7 +78,7 @@ glob_loc_data = [ # (Name, longitude, latitude)
|
||||
("Mannheim-Neckarau",8.48,49.45),
|
||||
("Gorxheimertal",8.73,49.53)]
|
||||
|
||||
enable_debug = False
|
||||
enable_debug = True
|
||||
|
||||
|
||||
# Draws a map image and tries to allocate space in the correct aspect ratio
|
||||
@ -221,6 +227,93 @@ class MapTile:
|
||||
self.scale = None
|
||||
self.scaled_pixbuf = None
|
||||
|
||||
class WMSMapTile:
|
||||
def __init__(self,capabilities):
|
||||
self.scaled_pixbuf = None
|
||||
self.capabilities_url = capabilities
|
||||
u_reader = urllib2.urlopen(self.capabilities_url)
|
||||
response_body = u_reader.read()
|
||||
u_reader.close()
|
||||
xml_doc = xmlStringParser( response_body)
|
||||
# validate name of root element
|
||||
e = xml_doc.documentElement
|
||||
if e.nodeName != "WMT_MS_Capabilities":
|
||||
print "unsupported Document type '%s'" % e.nodeName
|
||||
return None
|
||||
self.map_request_params = {}
|
||||
self.map_request_params["VERSION"] = e.getAttribute("version")
|
||||
self.map_request_params["REQUEST"] = "GetMap"
|
||||
self.map_request_params["SERVICE"] = "WMS"
|
||||
self.map_request_params["REQUEST"] = "GetMap"
|
||||
self.map_request_params["REQUEST"] = "GetMap"
|
||||
self.map_request_params["FORMAT"] = "image/png"
|
||||
self.map_request_params["SRS"] = "epsg:4326"
|
||||
self.map_request_params["LAYERS"] = ""
|
||||
# Child-nodes of root element
|
||||
for n in e.childNodes:
|
||||
if n.nodeName == "Service":
|
||||
# Parse Service header
|
||||
map_title = n.getElementsByTagName("Title")[0].firstChild.data
|
||||
print " MAP Title: %s" % map_title
|
||||
try:
|
||||
map_fees = e.getElementsByTagName("Fees")[0].firstChild.data
|
||||
except IndexError:
|
||||
map_fees = "-"
|
||||
print " MAP Fees: %s" % map_fees
|
||||
try:
|
||||
map_access_constraints = e.getElementsByTagName("AccessConstraints")[0].firstChild.data
|
||||
except IndexError:
|
||||
map_access_constraints = "-"
|
||||
print " MAP AccessConstraints: %s" % map_access_constraints
|
||||
|
||||
elif n.nodeName == "Capability":
|
||||
# Parse Capabilities
|
||||
for n2 in n.childNodes:
|
||||
if n2.nodeName == "Request":
|
||||
t1 = n2.getElementsByTagName("GetMap")[0]
|
||||
t2 = t1.getElementsByTagName("DCPType")[0]
|
||||
t3 = t2.getElementsByTagName("HTTP")[0]
|
||||
t4 = t3.getElementsByTagName("Get")[0]
|
||||
t5 = t4.getElementsByTagName("OnlineResource")[0]
|
||||
self.map_get_url = t5.getAttribute("xlink:href")
|
||||
print(" Map Tile base url: %s" % self.map_get_url)
|
||||
elif n2.nodeName == "Layer":
|
||||
# parse Layers
|
||||
if not self._srs_is_supported(n2.getElementsByTagName("SRS")[0].firstChild.data):
|
||||
print "Layer coordinates not supported :-("
|
||||
return None
|
||||
layer_title = n2.getElementsByTagName("Title")[0].firstChild.data
|
||||
print " Layer: %s" % layer_title
|
||||
for n3 in n2.childNodes:
|
||||
if n3.nodeName == "Layer":
|
||||
# parse Layers
|
||||
layer_title = n3.getElementsByTagName("Title")[0].firstChild.data
|
||||
print " - Layer: %s" % layer_title
|
||||
if self.map_request_params["LAYERS"]:
|
||||
self.map_request_params["LAYERS"] += ","
|
||||
self.map_request_params["LAYERS"] += layer_title
|
||||
def _srs_is_supported( self, srs_string):
|
||||
list = srs_string.lower().split()
|
||||
if "epsg:4326" in list:
|
||||
return True
|
||||
return False
|
||||
|
||||
def set_viewport( self, target_scale, x_in, y_in, w_in, h_in):
|
||||
self.scaled_map_x = x_in
|
||||
self.scaled_map_y = y_in
|
||||
self.scaled_map_pixel_w = int(w_in*target_scale)
|
||||
self.scaled_map_pixel_h = int(h_in*target_scale)
|
||||
self.map_request_params["BBOX"] = "%f,%f,%f,%f" % (x_in,y_in-h_in,x_in+w_in,y_in) # Neds to be set for request
|
||||
self.map_request_params["WIDTH"] = int(w_in*target_scale)
|
||||
self.map_request_params["HEIGHT"] = int(h_in*target_scale)
|
||||
params = urllib.urlencode(self.map_request_params)
|
||||
f = tempfile.NamedTemporaryFile()
|
||||
f_name = f.name
|
||||
urllib.urlretrieve(self.map_get_url+params,f_name)
|
||||
self.scaled_pixbuf = gtk.gdk.pixbuf_new_from_file(f_name)
|
||||
|
||||
def free(self):
|
||||
pass
|
||||
|
||||
# Zoomable map image
|
||||
class ZoomMap( gtk.DrawingArea):
|
||||
@ -241,6 +334,9 @@ class ZoomMap( gtk.DrawingArea):
|
||||
self.textlayout = self.create_pango_layout("")
|
||||
self.map_sources = {}
|
||||
self.initial_exposed = False
|
||||
if use_online_map:
|
||||
self.map_sources[0.0] = []
|
||||
self.map_sources[0.0].append(WMSMapTile("http://www2.demis.nl/wms/wms.asp?wms=WorldMap&VERSION=1.1.1&REQUEST=GetCapabilities"))
|
||||
|
||||
def add_map_source( self,filename, x, y, w, h,pw,ph):
|
||||
tile = MapTile( filename, x, y, w, h, pw, ph)
|
||||
@ -411,7 +507,7 @@ class ZoomMap( gtk.DrawingArea):
|
||||
self.queue_draw()
|
||||
|
||||
def zoom_in(self):
|
||||
self.magnifer = min( 500.0, self.magnifer * 1.5)
|
||||
self.magnifer = min( 1000.0, self.magnifer * 1.5)
|
||||
self.backbuf = None
|
||||
self.queue_draw()
|
||||
|
||||
@ -557,6 +653,7 @@ class MapView(PageView.PageView):
|
||||
self.zoom_map = ZoomMap(
|
||||
gtk.gdk.pixbuf_new_from_file(os.path.join(const.image_dir,"bad.png")),
|
||||
gtk.gdk.pixbuf_new_from_file(os.path.join(const.image_dir,"good.png")))
|
||||
if not use_online_map:
|
||||
self.zoom_map.add_map_source('world.topo.200407.3x3200x1600_tile_0_0.jpg', -180,90, 45,45, 400,400)
|
||||
self.zoom_map.add_map_source('world.topo.200407.3x3200x1600_tile_0_1.jpg', -135,90, 45,45, 400,400)
|
||||
self.zoom_map.add_map_source('world.topo.200407.3x3200x1600_tile_0_2.jpg', -90,90, 45,45, 400,400)
|
||||
@ -601,7 +698,6 @@ class MapView(PageView.PageView):
|
||||
self.zoom_map.add_map_source('world.topo.200407.3x400x200.jpg', -180,90, 360,180, 400,200)
|
||||
self.zoom_map.add_map_source('world.topo.200407.3x128x60.jpg', -180,90, 360,180, 128,60)
|
||||
|
||||
#self.zoom_map.add_map_source("europe_2_0.jpg",0,90,90,90,1024,1024)
|
||||
self.zoom_map.set_size_request(300,300)
|
||||
hbox.pack_start( self.zoom_map, True, True, 0)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user