I am trying to figure out how to set the zoom scales to match those meant for OpenStreetMaps and Google Maps, etc., as I am using OSM for a basemap. I've looked all over the internet and can't seem to find any support for this particular goal.
I have an XML document (scales.xml) with all of the scales needed, but I just can't figure out how to implement it:
<qgsScales version="1.0">
<scale value="1:591657528"/>
<scale value="1:295828764"/>
<scale value="1:147914382"/>
<scale value="1:73957191"/>
<scale value="1:36978595"/>
<scale value="1:18489298"/>
<scale value="1:9244649"/>
<scale value="1:4622324"/>
<scale value="1:2311162"/>
<scale value="1:1155581"/>
<scale value="1:577791"/>
<scale value="1:288895"/>
<scale value="1:144448"/>
<scale value="1:72224"/>
<scale value="1:36112"/>
<scale value="1:18056"/>
<scale value="1:9028"/>
<scale value="1:4514"/>
<scale value="1:2257"/>
<scale value="1:1128"/>
<scale value="1:564"/>
<scale value="1:282"/>
<scale value="1:141"/>
<scale value="1:71"/>
</qgsScales>
I've tried reworking some of the code from thr QuickMapServices plugin, but I get no results from it:
def _load_scales_list(self):
scales_filename = os.path.join(self.plugin_dir, 'scales.xml')
scales_list = []
xml_root = ET.parse(scales_filename).getroot()
for scale_el in xml_root.findall('scale'):
scales_list.append(scale_el.get('value'))
return scales_list
def scales_list(self):
if not self._scales_list:
self._scales_list = self._load_scales_list()
return self._scales_list
def set_nearest_scale(self):
#get current scale
curr_scale = self.mapCanvas().scale()
#find nearest
nearest_scale = sys.maxint
for scale_str in self.scales_list:
scale = scale_str.split(':')[1]
scale_int = int(scale)
if abs(scale_int-curr_scale) < abs(nearest_scale - curr_scale):
nearest_scale = scale_int
#set new scale
if nearest_scale != sys.maxint:
self.mapCanvas().zoomScale(nearest_scale)
This code neither throws an error nor does anything at all. Any ideas as to how I can get this working in a standalone window?