gmplot-1.2.0/ 0000755 t.玚 tz者00000000000 13174015654 013503 5 ustar woods 0000000 0000000 gmplot-1.2.0/gmplot/ 0000755 t.玚 tz者00000000000 13174015654 015005 5 ustar woods 0000000 0000000 gmplot-1.2.0/gmplot/__init__.py 0000644 t.玚 tz者00000000045 13174010140 017076 0 ustar woods 0000000 0000000 from .gmplot import GoogleMapPlotter
gmplot-1.2.0/gmplot/color_dicts.py 0000644 t.玚 tz者00000010127 13174010140 017645 0 ustar woods 0000000 0000000 mpl_color_map = {
'b': 'blue',
'g': 'green',
'r': 'red',
'c': 'cyan',
'm': 'magenta',
'y': 'yellow',
'k': 'black',
'w': 'white'
}
# TODO: Copy matplotlib.colors.cnames
# That list has 147 colors. The below is only 120. =(
html_color_codes = {
'aliceblue': '#F0F8FF',
'antiquewhite': '#FAEBD7',
'aqua': '#00FFFF',
'aquamarine': '#7FFFD4',
'azure': '#F0FFFF',
'beige': '#F5F5DC',
'bisque': '#FFE4C4',
'black': '#000000',
'blanchedalmond': '#FFEBCD',
'blue': '#0000FF',
'blueviolet': '#8A2BE2',
'brown': '#A52A2A',
'burlywood': '#DEB887',
'cadetblue': '#5F9EA0',
'chartreuse': '#7FFF00',
'chocolate': '#D2691E',
'coral': '#FF7F50',
'cornflowerblue': '#6495ED',
'cornsilk': '#FFF8DC',
'crimson': '#DC143C',
'cyan': '#00FFFF',
'darkblue': '#00008B',
'darkcyan': '#008B8B',
'darkgoldenrod': '#B8860B',
'darkgray': '#A9A9A9',
'darkgreen': '#006400',
'darkkhaki': '#BDB76B',
'darkmagenta': '#8B008B',
'darkolivegreen': '#556B2F',
'darkorange': '#FF8C00',
'darkorchid': '#9932CC',
'darkred': '#8B0000',
'darksalmon': '#E9967A',
'darkseagreen': '#8FBC8F',
'darkslateblue': '#483D8B',
'darkslategray': '#2F4F4F',
'darkturquoise': '#00CED1',
'darkviolet': '#9400D3',
'deeppink': '#FF1493',
'deepskyblue': '#00BFFF',
'dimgray': '#696969',
'dodgerblue': '#1E90FF',
'firebrick': '#B22222',
'floralwhite': '#FFFAF0',
'forestgreen': '#228B22',
'fuchsia': '#FF00FF',
'gainsboro': '#DCDCDC',
'ghostwhite': '#F8F8FF',
'gold': '#FFD700',
'goldenrod': '#DAA520',
'gray': '#808080',
'green': '#008000',
'greenyellow': '#ADFF2F',
'honeydew': '#F0FFF0',
'hotpink': '#FF69B4',
'indianred': '#CD5C5C',
'indigo': '#4B0082',
'ivory': '#FFFFF0',
'khaki': '#F0E68C',
'lavender': '#E6E6FA',
'lavenderblush': '#FFF0F5',
'lawngreen': '#7CFC00',
'lemonchiffon': '#FFFACD',
'lightblue': '#ADD8E6',
'lightcoral': '#F08080',
'lightcyan': '#E0FFFF',
'lightgoldenrodyellow': '#FAFAD2',
'lightgray': '#D3D3D3',
'lightgreen': '#90EE90',
'lightpink': '#FFB6C1',
'lightsalmon': '#FFA07A',
'lightseagreen': '#20B2AA',
'lightskyblue': '#87CEFA',
'lightslategray': '#778899',
'lightsteelblue': '#B0C4DE',
'lightyellow': '#FFFFE0',
'lime': '#00FF00',
'limegreen': '#32CD32',
'linen': '#FAF0E6',
'magenta': '#FF00FF',
'maroon': '#800000',
'mediumaquamarine': '#66CDAA',
'mediumblue': '#0000CD',
'mediumorchid': '#BA55D3',
'mediumpurple': '#9370DB',
'mediumseagreen': '#3CB371',
'mediumslateblue': '#7B68EE',
'mediumspringgreen': '#00FA9A',
'mediumturquoise': '#48D1CC',
'mediumvioletred': '#C71585',
'midnightblue': '#191970',
'mintcream': '#F5FFFA',
'mistyrose': '#FFE4E1',
'moccasin': '#FFE4B5',
'navajowhite': '#FFDEAD',
'navy': '#000080',
'oldlace': '#FDF5E6',
'olive': '#808000',
'olivedrab': '#6B8E23',
'orange': '#FFA500',
'orangered': '#FF4500',
'orchid': '#DA70D6',
'palegoldenrod': '#EEE8AA',
'palegreen': '#98FB98',
'paleturquoise': '#AFEEEE',
'palevioletred': '#DB7093',
'papayawhip': '#FFEFD5',
'peachpuff': '#FFDAB9',
'peru': '#CD853F',
'pink': '#FFC0CB',
'plum': '#DDA0DD',
'powderblue': '#B0E0E6',
'purple': '#800080',
'red': '#FF0000',
'rosybrown': '#BC8F8F',
'royalblue': '#4169E1',
'saddlebrown': '#8B4513',
'salmon': '#FA8072',
'sandybrown': '#F4A460',
'seagreen': '#2E8B57',
'seashell': '#FFF5EE',
'sienna': '#A0522D',
'silver': '#C0C0C0',
'skyblue': '#87CEEB',
'slateblue': '#6A5ACD',
'slategray': '#708090',
'snow': '#FFFAFA',
'springgreen': '#00FF7F',
'steelblue': '#4682B4',
'tan': '#D2B48C',
'teal': '#008080',
'thistle': '#D8BFD8',
'tomato': '#FF6347',
'turquoise': '#40E0D0',
'violet': '#EE82EE',
'wheat': '#F5DEB3',
'white': '#FFFFFF',
'whitesmoke': '#F5F5F5',
'yellow': '#FFFF00',
'yellowgreen': '#9ACD32'
}
gmplot-1.2.0/gmplot/gmplot.py 0000644 t.玚 tz者00000040563 13174014744 016670 0 ustar woods 0000000 0000000 import math
import requests
import json
import os
from .color_dicts import mpl_color_map, html_color_codes
def safe_iter(var):
try:
return iter(var)
except TypeError:
return [var]
class GoogleMapPlotter(object):
def __init__(self, center_lat, center_lng, zoom, apikey=''):
self.center = (float(center_lat), float(center_lng))
self.zoom = int(zoom)
self.apikey = str(apikey)
self.grids = None
self.paths = []
self.shapes = []
self.points = []
self.heatmap_points = []
self.radpoints = []
self.gridsetting = None
self.coloricon = os.path.join(os.path.dirname(__file__), 'markers/%s.png')
self.color_dict = mpl_color_map
self.html_color_codes = html_color_codes
@classmethod
def from_geocode(cls, location_string, zoom=13):
lat, lng = cls.geocode(location_string)
return cls(lat, lng, zoom)
@classmethod
def geocode(self, location_string):
geocode = requests.get(
'http://maps.googleapis.com/maps/api/geocode/json?address="%s"' % location_string)
geocode = json.loads(geocode.text)
latlng_dict = geocode['results'][0]['geometry']['location']
return latlng_dict['lat'], latlng_dict['lng']
def grid(self, slat, elat, latin, slng, elng, lngin):
self.gridsetting = [slat, elat, latin, slng, elng, lngin]
def marker(self, lat, lng, color='#FF0000', c=None, title="no implementation"):
if c:
color = c
color = self.color_dict.get(color, color)
color = self.html_color_codes.get(color, color)
self.points.append((lat, lng, color[1:], title))
def scatter(self, lats, lngs, color=None, size=None, marker=True, c=None, s=None, **kwargs):
color = color or c
size = size or s or 40
kwargs["color"] = color
kwargs["size"] = size
settings = self._process_kwargs(kwargs)
for lat, lng in zip(lats, lngs):
if marker:
self.marker(lat, lng, settings['color'])
else:
self.circle(lat, lng, size, **settings)
def circle(self, lat, lng, radius, color=None, c=None, **kwargs):
color = color or c
kwargs.setdefault('face_alpha', 0.5)
kwargs.setdefault('face_color', "#000000")
kwargs.setdefault("color", color)
settings = self._process_kwargs(kwargs)
path = self.get_cycle(lat, lng, radius)
self.shapes.append((path, settings))
def _process_kwargs(self, kwargs):
settings = dict()
settings["edge_color"] = kwargs.get("color", None) or \
kwargs.get("edge_color", None) or \
kwargs.get("ec", None) or \
"#000000"
settings["edge_alpha"] = kwargs.get("alpha", None) or \
kwargs.get("edge_alpha", None) or \
kwargs.get("ea", None) or \
1.0
settings["edge_width"] = kwargs.get("edge_width", None) or \
kwargs.get("ew", None) or \
1.0
settings["face_alpha"] = kwargs.get("alpha", None) or \
kwargs.get("face_alpha", None) or \
kwargs.get("fa", None) or \
0.3
settings["face_color"] = kwargs.get("color", None) or \
kwargs.get("face_color", None) or \
kwargs.get("fc", None) or \
"#000000"
settings["color"] = kwargs.get("color", None) or \
kwargs.get("c", None) or \
settings["edge_color"] or \
settings["face_color"]
# Need to replace "plum" with "#DDA0DD" and "c" with "#00FFFF" (cyan).
for key, color in settings.items():
if 'color' in key:
color = self.color_dict.get(color, color)
color = self.html_color_codes.get(color, color)
settings[key] = color
settings["closed"] = kwargs.get("closed", None)
return settings
def plot(self, lats, lngs, color=None, c=None, **kwargs):
color = color or c
kwargs.setdefault("color", color)
settings = self._process_kwargs(kwargs)
path = zip(lats, lngs)
self.paths.append((path, settings))
def heatmap(self, lats, lngs, threshold=10, radius=10, gradient=None, opacity=0.6, dissipating=True):
"""
:param lats: list of latitudes
:param lngs: list of longitudes
:param threshold:
:param radius: The hardest param. Example (string):
:return:
"""
settings = {}
settings['threshold'] = threshold
settings['radius'] = radius
settings['gradient'] = gradient
settings['opacity'] = opacity
settings['dissipating'] = dissipating
settings = self._process_heatmap_kwargs(settings)
heatmap_points = []
for lat, lng in zip(lats, lngs):
heatmap_points.append((lat, lng))
self.heatmap_points.append((heatmap_points, settings))
def _process_heatmap_kwargs(self, settings_dict):
settings_string = ''
settings_string += "heatmap.set('threshold', %d);\n" % settings_dict['threshold']
settings_string += "heatmap.set('radius', %d);\n" % settings_dict['radius']
settings_string += "heatmap.set('opacity', %f);\n" % settings_dict['opacity']
dissipation_string = 'true' if settings_dict['dissipating'] else 'false'
settings_string += "heatmap.set('dissipating', %s);\n" % (dissipation_string)
gradient = settings_dict['gradient']
if gradient:
gradient_string = "var gradient = [\n"
for r, g, b, a in gradient:
gradient_string += "\t" + "'rgba(%d, %d, %d, %d)',\n" % (r, g, b, a)
gradient_string += '];' + '\n'
gradient_string += "heatmap.set('gradient', gradient);\n"
settings_string += gradient_string
return settings_string
def polygon(self, lats, lngs, color=None, c=None, **kwargs):
color = color or c
kwargs.setdefault("color", color)
settings = self._process_kwargs(kwargs)
shape = zip(lats, lngs)
self.shapes.append((shape, settings))
# create the html file which include one google map and all points and
# paths
def draw(self, htmlfile):
f = open(htmlfile, 'w')
f.write('\n')
f.write('
\n')
f.write(
'\n')
f.write(
'\n')
f.write('Google Maps - pygmaps \n')
if self.apikey:
f.write('\n' % self.apikey )
else:
f.write('\n' )
f.write('\n')
f.write('\n')
f.write(
'\n')
f.write(
'\t\n')
f.write('\n')
f.write('\n')
f.close()
#############################################
# # # # # # Low level Map Drawing # # # # # #
#############################################
def write_grids(self, f):
if self.gridsetting is None:
return
slat = self.gridsetting[0]
elat = self.gridsetting[1]
latin = self.gridsetting[2]
slng = self.gridsetting[3]
elng = self.gridsetting[4]
lngin = self.gridsetting[5]
self.grids = []
r = [
slat + float(x) * latin for x in range(0, int((elat - slat) / latin))]
for lat in r:
self.grids.append(
[(lat + latin / 2.0, slng + lngin / 2.0), (lat + latin / 2.0, elng + lngin / 2.0)])
r = [
slng + float(x) * lngin for x in range(0, int((elng - slng) / lngin))]
for lng in r:
self.grids.append(
[(slat + latin / 2.0, lng + lngin / 2.0), (elat + latin / 2.0, lng + lngin / 2.0)])
for line in self.grids:
settings = self._process_kwargs({"color": "#000000"})
self.write_polyline(f, line, settings)
def write_points(self, f):
for point in self.points:
self.write_point(f, point[0], point[1], point[2], point[3])
def get_cycle(self, lat, lng, rad):
# unit of radius: meter
cycle = []
d = (rad / 1000.0) / 6378.8
lat1 = (math.pi / 180.0) * lat
lng1 = (math.pi / 180.0) * lng
r = [x * 10 for x in range(36)]
for a in r:
tc = (math.pi / 180.0) * a
y = math.asin(
math.sin(lat1) * math.cos(d) + math.cos(lat1) * math.sin(d) * math.cos(tc))
dlng = math.atan2(math.sin(
tc) * math.sin(d) * math.cos(lat1), math.cos(d) - math.sin(lat1) * math.sin(y))
x = ((lng1 - dlng + math.pi) % (2.0 * math.pi)) - math.pi
cycle.append(
(float(y * (180.0 / math.pi)), float(x * (180.0 / math.pi))))
return cycle
def write_paths(self, f):
for path, settings in self.paths:
self.write_polyline(f, path, settings)
def write_shapes(self, f):
for shape, settings in self.shapes:
self.write_polygon(f, shape, settings)
# TODO: Add support for mapTypeId: google.maps.MapTypeId.SATELLITE
def write_map(self, f):
f.write('\t\tvar centerlatlng = new google.maps.LatLng(%f, %f);\n' %
(self.center[0], self.center[1]))
f.write('\t\tvar myOptions = {\n')
f.write('\t\t\tzoom: %d,\n' % (self.zoom))
f.write('\t\t\tcenter: centerlatlng,\n')
f.write('\t\t\tmapTypeId: google.maps.MapTypeId.ROADMAP\n')
f.write('\t\t};\n')
f.write(
'\t\tvar map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);\n')
f.write('\n')
def write_point(self, f, lat, lon, color, title):
f.write('\t\tvar latlng = new google.maps.LatLng(%f, %f);\n' %
(lat, lon))
f.write('\t\tvar img = new google.maps.MarkerImage(\'%s\');\n' %
(self.coloricon % color))
f.write('\t\tvar marker = new google.maps.Marker({\n')
f.write('\t\ttitle: "%s",\n' % title)
f.write('\t\ticon: img,\n')
f.write('\t\tposition: latlng\n')
f.write('\t\t});\n')
f.write('\t\tmarker.setMap(map);\n')
f.write('\n')
def write_polyline(self, f, path, settings):
clickable = False
geodesic = True
strokeColor = settings.get('color') or settings.get('edge_color')
strokeOpacity = settings.get('edge_alpha')
strokeWeight = settings.get('edge_width')
f.write('var PolylineCoordinates = [\n')
for coordinate in path:
f.write('new google.maps.LatLng(%f, %f),\n' %
(coordinate[0], coordinate[1]))
f.write('];\n')
f.write('\n')
f.write('var Path = new google.maps.Polyline({\n')
f.write('clickable: %s,\n' % (str(clickable).lower()))
f.write('geodesic: %s,\n' % (str(geodesic).lower()))
f.write('path: PolylineCoordinates,\n')
f.write('strokeColor: "%s",\n' % (strokeColor))
f.write('strokeOpacity: %f,\n' % (strokeOpacity))
f.write('strokeWeight: %d\n' % (strokeWeight))
f.write('});\n')
f.write('\n')
f.write('Path.setMap(map);\n')
f.write('\n\n')
def write_polygon(self, f, path, settings):
clickable = False
geodesic = True
strokeColor = settings.get('edge_color') or settings.get('color')
strokeOpacity = settings.get('edge_alpha')
strokeWeight = settings.get('edge_width')
fillColor = settings.get('face_color') or settings.get('color')
fillOpacity= settings.get('face_alpha')
f.write('var coords = [\n')
for coordinate in path:
f.write('new google.maps.LatLng(%f, %f),\n' %
(coordinate[0], coordinate[1]))
f.write('];\n')
f.write('\n')
f.write('var polygon = new google.maps.Polygon({\n')
f.write('clickable: %s,\n' % (str(clickable).lower()))
f.write('geodesic: %s,\n' % (str(geodesic).lower()))
f.write('fillColor: "%s",\n' % (fillColor))
f.write('fillOpacity: %f,\n' % (fillOpacity))
f.write('paths: coords,\n')
f.write('strokeColor: "%s",\n' % (strokeColor))
f.write('strokeOpacity: %f,\n' % (strokeOpacity))
f.write('strokeWeight: %d\n' % (strokeWeight))
f.write('});\n')
f.write('\n')
f.write('polygon.setMap(map);\n')
f.write('\n\n')
def write_heatmap(self, f):
for heatmap_points, settings_string in self.heatmap_points:
f.write('var heatmap_points = [\n')
for heatmap_lat, heatmap_lng in heatmap_points:
f.write('new google.maps.LatLng(%f, %f),\n' %
(heatmap_lat, heatmap_lng))
f.write('];\n')
f.write('\n')
f.write('var pointArray = new google.maps.MVCArray(heatmap_points);' + '\n')
f.write('var heatmap;' + '\n')
f.write('heatmap = new google.maps.visualization.HeatmapLayer({' + '\n')
f.write('\n')
f.write('data: pointArray' + '\n')
f.write('});' + '\n')
f.write('heatmap.setMap(map);' + '\n')
f.write(settings_string)
if __name__ == "__main__":
mymap = GoogleMapPlotter(37.428, -122.145, 16)
# mymap = GoogleMapPlotter.from_geocode("Stanford University")
mymap.grid(37.42, 37.43, 0.001, -122.15, -122.14, 0.001)
mymap.marker(37.427, -122.145, "yellow")
mymap.marker(37.428, -122.146, "cornflowerblue")
mymap.marker(37.429, -122.144, "k")
lat, lng = mymap.geocode("Stanford University")
mymap.marker(lat, lng, "red")
mymap.circle(37.429, -122.145, 100, "#FF0000", ew=2)
path = [(37.429, 37.428, 37.427, 37.427, 37.427),
(-122.145, -122.145, -122.145, -122.146, -122.146)]
path2 = [[i+.01 for i in path[0]], [i+.02 for i in path[1]]]
path3 = [(37.433302 , 37.431257 , 37.427644 , 37.430303), (-122.14488, -122.133121, -122.137799, -122.148743)]
path4 = [(37.423074, 37.422700, 37.422410, 37.422188, 37.422274, 37.422495, 37.422962, 37.423552, 37.424387, 37.425920, 37.425937),
(-122.150288, -122.149794, -122.148936, -122.148142, -122.146747, -122.14561, -122.144773, -122.143936, -122.142992, -122.147863, -122.145953)]
mymap.plot(path[0], path[1], "plum", edge_width=10)
mymap.plot(path2[0], path2[1], "red")
mymap.polygon(path3[0], path3[1], edge_color="cyan", edge_width=5, face_color="blue", face_alpha=0.1)
mymap.heatmap(path4[0], path4[1], threshold=10, radius=40)
mymap.heatmap(path3[0], path3[1], threshold=10, radius=40, dissipating=False, gradient=[(30,30,30,0), (30,30,30,1), (50, 50, 50, 1)])
mymap.scatter(path4[0], path4[1], c='r', marker=True)
mymap.scatter(path4[0], path4[1], s=90, marker=False, alpha=0.1)
# Get more points with:
# http://www.findlatitudeandlongitude.com/click-lat-lng-list/
scatter_path = ([37.424435, 37.424417, 37.424417, 37.424554, 37.424775, 37.425099, 37.425235, 37.425082, 37.424656, 37.423957, 37.422952, 37.421759, 37.420447, 37.419135, 37.417822, 37.417209],
[-122.142048, -122.141275, -122.140503, -122.139688, -122.138872, -122.138078, -122.137241, -122.136405, -122.135568, -122.134731, -122.133894, -122.133057, -122.13222, -122.131383, -122.130557, -122.129999])
mymap.scatter(scatter_path[0], scatter_path[1], c='r', marker=True)
mymap.draw('./mymap.html')
gmplot-1.2.0/gmplot/markers/ 0000755 t.玚 tz者00000000000 13174015654 016451 5 ustar woods 0000000 0000000 gmplot-1.2.0/gmplot/markers/000000.png 0000644 t.玚 tz者00000000651 13174010140 017661 0 ustar woods 0000000 0000000 塒NG
IHDR " 癶拑 bKGD 牻 ^IDATH壄?K聾邱oN*溑?/A勨 N
邅P枸plq
t7信)nuP%禕旇愮骖毣<佀囩.%聹m`5pk棍O!餸ā坛&N#+擓 8b尻T另殸畍鑄敔茾\/帀霹腿矺]#7w 藶瑎F q:璅y薸 /R= 铀
溜uJ)ゅ壎镏沪=墍迋9啠Og竡飥Uㄓ>WP缭^,
瑧4癝8獲 钁
gX灨搜/]w_tP忽贠漸娝鳨泮;櫲x|凚_鏟k\7搻璩審!''. N=&嚊 IEND瓸` gmplot-1.2.0/gmplot/markers/000080.png 0000644 t.玚 tz者00000001220 13174010140 017662 0 ustar woods 0000000 0000000 塒NG
IHDR " 癶拑 bKGD 牻 EIDATH壄;hQ岂哳!貳,|_!ZQ;A鞍安v`#(傏I &婙Dv$0蚮,瞵d_胮蠝鬅箇緎oJuu`#岻炘O[0坙膴堈=吀8?艷I#臚,HH罬<増庒`"惄 Д)6cnP_厖)^lC_t?K抐暊鵫牵.&G裚:XlmcC澙r軧遷,莗:庮#灼&労\[浝v著w5QFǚ蚡eX涢╙嗳1s萅8fd64~唊l毃1%V烺& pL枽咚厇近翟I>鍁撔~∞I+綪瑧k X繣Lv鉰9堟駎=K匨Fp縉鄍)Z貰}3豂'Z 裤,綸罏'I鸝+鶼稚)R盫X?J28v髍侴S _1飙N咞8LT<妱\O*<蚊妏C懖=螀蟓\w 謾jm狟4o.s8Sy_ab\軒虰酭暊甀岯1,ly竆珷铦`7%3tE降Vr角I>迍B峭鬰<鹾巼z侴}橧h升3 夛鵽迾槤I_ IEND瓸` gmplot-1.2.0/gmplot/markers/00008B.png 0000644 t.玚 tz者00000001222 13174010140 017706 0 ustar woods 0000000 0000000 塒NG
IHDR " 癶拑 bKGD 牻 GIDATH壄胀KTa邱蠈欎"4h摣奮 媹VA nz乂-劆]"h1"Z磾haD慟Rd攭叏0(⒀珤!阭<冦8:汨.楃躶诀9鳒筌敃
–A塢⒂鐳BM骂剝馸晃璺D隱ぎ?臝l+6俉鐽Hn鉠|ㄈ蕖獕О P达C]娹鎗蠽z
坠匉BY蠽霡譗媲>;1蜼s`甞汩T芡h:Z/S[捅2劯陉 m8d褡X*p8r宦穀嫸iTb#祂勚
曢c矊s㈱圤c&\ck剮刹搀躃f嵭尷1烳繒彉+8'膋eˉ熶M櫺!^39 2gBk2h羭^鍮d=G)4樄Yk1WO颺爅頰r煠<撪鸱'ごR>義?午;鍯a嶔鸵p 輕Qㄇ"偮g茔9f%傒c崽[㈠爌擇樨9蔪8慡樥@o筇S3妎q鵒3?\)梷槤潜\(<+P裾B(P
鬋h!&Vj=魮銐@逿坦敐耟L}H樃u侢姪曗\*鬙鑁 铮 蛶訿)莯 IEND瓸` gmplot-1.2.0/gmplot/markers/0000CD.png 0000644 t.玚 tz者00000001222 13174010140 017723 0 ustar woods 0000000 0000000 塒NG
IHDR " 癶拑 bKGD 牻 GIDATH壄9hTQ岂邲!〥尡腂
m秊
罛-\罛P\H!"!ⅳ1w艠A\圡桪E"j鎅7fg2摍|p癸瀧;Kdz-E+!,>1^枆齇0榯腾樁dO橇n +G壊l婇妝)X]q笍擦_+ ?"vbAX%廧=穵A1 П獟Wa1V釬撨褵m鲋潮B`Ni4爋蝐,曑靎a#踗蘨+' la3鎀 #嫩拑謅I7礹吚Q桞=鎲S嬕G}j潑O醀X#5BG鋁箏~MhF嗳鏋呙U鳪堊肨I漚t湲*厁g橁╭1仄r×* ar?铈Ca靯瞵M 違~灷釡祊E瑜Na曇l氰e】誘惫謤~,鉊 8!求oRE'皟'竃貜^豒,呯8薎t鉧编RP8妈紝%f&邢咐s7^T嗮69庛湜.tC躉巬5!i莏崸社S抚H苂
角+a豥鄓1e旻LGL=<+鶥{,谈唕螘<咰渭:nV燺y焹朥バoI虑f:氺g)賴+q靊>謩 IEND瓸` gmplot-1.2.0/gmplot/markers/0000FF.png 0000644 t.玚 tz者00000001110 13174010140 017724 0 ustar woods 0000000 0000000 塒NG
IHDR " 癶拑 bKGD 牻 齀DATH壄1kA鄃/$*ē楬N;臖,氖翨S獔勮OPE攬峘獷皨貥燜RE(垽捖DQr熍9/w椲{a豤v剧鎣g2统嚤责Sx英隹4俲p<8沖珣鶰玢Z&肬櫊D]泬t?癫f[倗
燜m,襵#k撩l6┪p=8躕'X礇戧
鼖^ag耙!鞀浃eC淐o;/矨zCEO枡鑠朎泩滂╀_覩得Y㎎庌蔶g擠W+XIm$:婟鼥蓲瑜洙=朘,┝H蝚峩⒆#针療y鷤g'
戧鏥: ^ 禙猍;3, 嬬8裌d^s,煡E;樑鎂`扆5礼怴麘v"酚消U謧儊a柛[> i侊;飓CO&: 俉9%蚩3eP樺R帋柎x銜f7