iclientpy.viz.geolines 源代码

from .abstractmap import AbstractMap
import iclientpy as icp


[文档]class GeoLines(AbstractMap): def __init__(self, data, **kwargs): self._data = data self._layer_option = kwargs self._geojsondata = icp.load_geojson_data() self._all_feature = []
[文档] def compute_coords(self, datas): coordses = [] for data in datas: from_pos = icp.get_geojson_data(self._geojsondata, data[0][self._layer_option["address_key"]]) to_pos = icp.get_geojson_data(self._geojsondata, data[1][self._layer_option["address_key"]]) self._all_feature.append(from_pos) self._all_feature.append(to_pos) coordses.append({"coords": [ [from_pos["properties"]["cp"][0], from_pos["properties"]["cp"][1]], [to_pos["properties"]["cp"][0], to_pos["properties"]["cp"][1]] ]}) return coordses
[文档] def compute_pos(self, datas): result = [] for data in datas: geo_json = icp.get_geojson_data(self._geojsondata, data[1][self._layer_option["address_key"]]) result.append({ "name": data[1][self._layer_option["address_key"]], "value": [geo_json["properties"]["cp"][0], geo_json["properties"]["cp"][1], data[1][self._layer_option["value_key"]]] }) return result
[文档] def prepare_total(self, datas): total_array = [] for data in datas: sum = 0 for d in data: sum = sum + float(d[1][self._layer_option["value_key"]]) total_array.append(sum) self.total_array = total_array self.max_size = self._layer_option["max_symbolsize"] self.min_size = self._layer_option["min_symbolsize"] self.size_sub = self.max_size - self.min_size self.max_total = max(self.total_array) self.min_total = min(self.total_array)
[文档] def compute_size(self, index): val_div = (self.total_array[index] - self.min_total) / ( self.max_total - self.min_total if self.max_total - self.min_total > 0 else 1) return int(self.size_sub * val_div + self.min_size)
def _ipython_display_(self, **kwargs): series = [] i = 0 self.prepare_total(self._data) while i < len(self._data): data = self._data[i] coords = self.compute_coords(data) datas = self.compute_pos(data) line_series = { "name": self._layer_option["names"][i], "type": 'lines', "coordinateSystem": 'leaflet', "zlevel": 2, "symbol": ['none', 'arrow'], "symbolSize": 10, "effect": { "show": True, "period": 6, "trailLength": 0, "symbol": self._layer_option["symbol"], "symbolSize": self.compute_size(i) }, "lineStyle": { "normal": { "color": self._layer_option["colors"][i] if "colors" in self._layer_option else '', "width": 1, "opacity": 0.6, "curveness": 0.2 } }, "data": coords } if line_series['effect']['symbol'] == 'plane': line_series['effect']['symbol'] = icp.SYMBOL['plane'] scatter_series = { "name": self._layer_option["names"][i], "type": 'effectScatter', 'coordinateSystem': 'leaflet', 'zlevel': 2, 'rippleEffect': { 'brushType': 'stroke' }, 'label': { 'normal': { 'show': True, 'position': 'right', 'formatter': '{b}' } }, 'symbolSize': 5, 'itemStyle': { 'normal': { 'color': self._layer_option["colors"][i] if "colors" in self._layer_option else '' } }, 'data': datas } series.append(line_series) series.append(scatter_series) i = i + 1 option = { "tooltip": { "trigger": 'item' }, "legend": { "orient": 'vertical', "left": 'right', "data": self._layer_option["names"], "selectedMode": self._layer_option["selected_mode"], "selected": { k: "selected_legend" not in self._layer_option or k in self._layer_option["selected_legend"] for k in self._layer_option["names"]} }, "series": series } if self._url is None: self.map = icp.MapView() else: default_tile = icp.TileMapLayer(url=self._url) self.map = icp.MapView(default_tiles=default_tile, crs=self._crs) self.layer = icp.EchartsLayer(option=option) self.map.fit_bounds = self.compute_bounds(self._all_feature, lat_key=lambda d: d["properties"]["cp"][1], lng_key=lambda d: d["properties"]["cp"][0]) self.map.add_layer(self.layer) self.map._ipython_display_(**kwargs)