def fishnetmap(ax, points, weights, bounding_box, color_gradient=["#0000FF", "#FF0000"], cell_size=4, cell_spacing=1, opacity=1.0, coordinate_system='epsg:3857', aggregation_type='sum', **extra_contextily_params): from matplotlib import pyplot as plt import contextily as cx bbox = _transform_bbox(bounding_box, coordinate_system, 'epsg:3857') w, h = _get_recom_size(bbox[2] - bbox[0], bbox[3] - bbox[1]) vega = vega_fishnetmap(w, h, bounding_box=bounding_box, color_gradient=color_gradient, cell_size=cell_size, cell_spacing=cell_spacing, opacity=opacity, coordinate_system=coordinate_system, aggregation_type=aggregation_type) hexstr = arctern.fishnet_map_layer(vega, points, weights) f = io.BytesIO(base64.b64decode(hexstr)) img = plt.imread(f) ax.set(xlim=(bbox[0], bbox[2]), ylim=(bbox[1], bbox[3])) cx.add_basemap(ax, **extra_contextily_params) ax.imshow(img, alpha=img[:, :, 3], extent=(bbox[0], bbox[2], bbox[1], bbox[3]))
def draw_fishnet_map(spark): start_time = time.time() df = spark.read.format("csv").option("header", True).option( "delimiter", "," ).schema( "VendorID string, tpep_pickup_datetime timestamp, tpep_dropoff_datetime timestamp, passenger_count long, trip_distance double, pickup_longitude double, pickup_latitude double, dropoff_longitude double, dropoff_latitude double, fare_amount double, tip_amount double, total_amount double, buildingid_pickup long, buildingid_dropoff long, buildingtext_pickup string, buildingtext_dropoff string" ).load("file:///tmp/0_5M_nyc_taxi_and_building.csv").cache() df.createOrReplaceTempView("nyc_taxi") register_funcs(spark) res = spark.sql( "select ST_Point(pickup_longitude, pickup_latitude) as point, passenger_count as w from nyc_taxi where ST_Within(ST_Point(pickup_longitude, pickup_latitude), ST_GeomFromText('POLYGON ((-73.998427 40.730309, -73.954348 40.730309, -73.954348 40.780816 ,-73.998427 40.780816, -73.998427 40.730309))'))" ) res.show() vega = vega_fishnetmap( 1024, 896, bounding_box=[-73.998427, 40.730309, -73.954348, 40.780816], color_gradient=["#0000FF", "#FF0000"], cell_size=4, cell_spacing=1, opacity=1.0, coordinate_system='EPSG:4326') res = fishnetmap(vega, res) save_png(res, '/tmp/fishnetmap.png') spark.sql("show tables").show() spark.catalog.dropGlobalTempView("nyc_taxi") print("--- %s seconds ---" % (time.time() - start_time))
def test_fishnet_map(): x_data = [] y_data = [] c_data = [] x_data.append(-73.96524) x_data.append(-73.96118) x_data.append(-73.97324) x_data.append(-73.98456) y_data.append(40.73747) y_data.append(40.74507) y_data.append(40.75890) y_data.append(40.77654) c_data.append(10) c_data.append(20) c_data.append(30) c_data.append(40) arr_x = pandas.Series(x_data) arr_y = pandas.Series(y_data) arr_c = pandas.Series(c_data) points = arctern.ST_Point(arr_x, arr_y) vega = vega_fishnetmap( 1024, 896, bounding_box=[-73.998427, 40.730309, -73.954348, 40.780816], color_gradient=["#0000FF", "#FF0000"], cell_size=4, cell_spacing=1, opacity=1.0, coordinate_system='EPSG:4326') heat_map1 = arctern.fishnet_map_layer(vega, points, arr_c) save_png(heat_map1, "/tmp/test_fishnetmap.png")
def fishnetmap(ax, points, weights, bounding_box, color_gradient=["#0000FF", "#FF0000"], cell_size=4, cell_spacing=1, opacity=1.0, coordinate_system='epsg:3857', aggregation_type='sum', **extra_contextily_params): """ Plot fishnetmap in Matplotlib :type ax: AxesSubplot :param ax: Matplotlib axes object on which to add the basemap. :type points: GeoSeries :param points: Sequence of Points :type weights: Series(dtype: float|int64) :param weights: Color weight of points :type bounding_box: list :param bounding_box: Specify the bounding rectangle [west, south, east, north]. :type color_gradient: list :param color_gradient: Specify range of color gradient. Either use ["hex_color"] to specify a same color for all points, or ["hex_color1", "hex_color2"] to specify a color gradient ranging from "hex_color1" to "hex_color2" Current only default value ["#0000FF", "#FF0000"] is supported :type cell_size: int :param cell_size: Side length of fishnet cells, default as 4 :type cell_spacing: int :param cell_spacing: Margin between adjacent fishnet cells, default as 1 :type opacity: float :param opacity: Opacity of fishnet, ranged from 0.0 to 1.0, default as 1.0 :type coordinate_system: str :param coordinate_system: Coordinate Reference System of the geometry objects. Must be SRID formed, e.g. 'EPSG:4326' or 'EPSG:3857' Default as 'EPSG:3857' :type aggregation_type: str :param aggregation_type: Aggregation type of data processing. Default as 'sum' :type extra_contextily_params: dict :param extra_contextily_params: Extra parameters will be passed to contextily.add_basemap See https://contextily.readthedocs.io/en/latest/reference.html for details :example: >>> import pandas as pd >>> import numpy as np >>> import arctern >>> import matplotlib.pyplot as plt >>> # read from test_data.csv >>> # Download link: https://raw.githubusercontent.com/arctern-io/arctern-resources/benchmarks/benchmarks/dataset/layer_rendering_test_data/test_data.csv >>> df = pd.read_csv("/path/to/test_data.csv", dtype={'longitude':np.float64, 'latitude':np.float64, 'color_weights':np.float64, 'size_weights':np.float64, 'region_boundaries':np.object}) >>> points = arctern.GeoSeries.point(df['longitude'], df['latitude']) >>> # render fishnet >>> fig, ax = plt.subplots(figsize=(10, 6), dpi=200) >>> arctern.plot.fishnetmap(ax, points=points, weights=df['color_weights'], bounding_box=[-74.01424568752932, 40.72759334104623, -73.96056823889673, 40.76721122683304], cell_size=8, cell_spacing=2, opacity=1.0, coordinate_system="EPSG:4326") >>> plt.show() """ from matplotlib import pyplot as plt import contextily as cx bbox = _transform_bbox(bounding_box, coordinate_system, 'epsg:3857') w, h = _get_recom_size(bbox[2] - bbox[0], bbox[3] - bbox[1]) vega = vega_fishnetmap(w, h, bounding_box=bounding_box, color_gradient=color_gradient, cell_size=cell_size, cell_spacing=cell_spacing, opacity=opacity, coordinate_system=coordinate_system, aggregation_type=aggregation_type) hexstr = arctern.fishnet_map_layer(vega, points, weights) f = io.BytesIO(base64.b64decode(hexstr)) img = plt.imread(f) ax.set(xlim=(bbox[0], bbox[2]), ylim=(bbox[1], bbox[3])) cx.add_basemap(ax, **extra_contextily_params) ax.imshow(img, alpha=img[:, :, 3], extent=(bbox[0], bbox[2], bbox[1], bbox[3])) ax.axis('off')
opacity=1.0, coordinate_system="EPSG:4326") png = choropleth_map_layer(vega, ST_GeomFromText(pickup_df.buildingtext_pickup), df.head(limit_num).fare_amount) save_png(png, "/tmp/arctern_choroplethmap_pandas.png") vega = vega_icon(1024, 384, bounding_box=[pos1[0], pos1[1], pos2[0], pos2[1]], icon_path='/path/to/arctern-color.png', coordinate_system="EPSG:4326") png = icon_viz_layer( vega, ST_Point( pickup_df.head(25).pickup_longitude, pickup_df.head(25).pickup_latitude)) save_png(png, "/tmp/arctern_iconviz_pandas.png") vega = vega_fishnetmap(1024, 384, bounding_box=[pos1[0], pos1[1], pos2[0], pos2[1]], cell_size=8, cell_spacing=1, opacity=1.0, coordinate_system="EPSG:4326") png = fishnet_map_layer( vega, ST_Point(pickup_df.pickup_longitude, pickup_df.pickup_latitude), df.head(limit_num).fare_amount) save_png(png, "/tmp/arctern_fishnetmap_pandas.png")
def fishnetmap(ax, points, weights, bounding_box, color_gradient=["#0000FF", "#FF0000"], cell_size=4, cell_spacing=1, opacity=1.0, coordinate_system='epsg:3857', aggregation_type='sum', **extra_contextily_params): """ Plots a fishnet map in Matplotlib. Parameters ---------- ax : matplotlib.axes.Axes Axes where geometries will be plotted. points : GeoSeries Sequence of points. weights : Series Color weights of polygons. bounding_box : list Bounding box of the map. For example, [west, south, east, north]. color_gradient : list, optional Range of color gradient, by default ["#0000FF", "#FF0000"]. Either use ["hex_color"] to specify a same color for all geometries, or ["hex_color1", "hex_color2"] to specify a color gradient ranging from "hex_color1" to "hex_color2". cell_size : int, optional Side length of fishnet cells, by default 4. cell_spacing : int, optional Margin between adjacent fishnet cells, by default 1. opacity : float, optional Opacity of the fishnet, ranged from 0.0 to 1.0, by default 1.0. coordinate_system : str, optional The Coordinate Reference System (CRS) set to all geometries, by default 'EPSG:3857'. Only supports SRID as a WKT representation of CRS by now. aggregation_type : str, optional Aggregation type, by default 'sum'. **extra_contextily_params: dict Extra parameters passed to `contextily.add_basemap. <https://contextily.readthedocs.io/en/latest/reference.html>`_ Examples ------- >>> import pandas as pd >>> import numpy as np >>> import arctern >>> import matplotlib.pyplot as plt >>> # read from test_data.csv >>> # Download link: https://raw.githubusercontent.com/arctern-io/arctern-resources/benchmarks/benchmarks/dataset/layer_rendering_test_data/test_data.csv >>> df = pd.read_csv("/path/to/test_data.csv", dtype={'longitude':np.float64, 'latitude':np.float64, 'color_weights':np.float64, 'size_weights':np.float64, 'region_boundaries':np.object}) >>> points = arctern.GeoSeries.point(df['longitude'], df['latitude']) >>> # render fishnet >>> fig, ax = plt.subplots(figsize=(10, 6), dpi=200) >>> arctern.plot.fishnetmap(ax, points=points, weights=df['color_weights'], bounding_box=[-74.01424568752932, 40.72759334104623, -73.96056823889673, 40.76721122683304], cell_size=8, cell_spacing=2, opacity=1.0, coordinate_system="EPSG:4326") >>> plt.show() """ from matplotlib import pyplot as plt import contextily as cx bbox = _transform_bbox(bounding_box, coordinate_system, 'epsg:3857') w, h = _get_recom_size(bbox[2] - bbox[0], bbox[3] - bbox[1]) vega = vega_fishnetmap(w, h, bounding_box=bounding_box, color_gradient=color_gradient, cell_size=cell_size, cell_spacing=cell_spacing, opacity=opacity, coordinate_system=coordinate_system, aggregation_type=aggregation_type) hexstr = arctern.fishnet_map_layer(vega, points, weights) f = io.BytesIO(base64.b64decode(hexstr)) img = plt.imread(f) ax.set(xlim=(bbox[0], bbox[2]), ylim=(bbox[1], bbox[3])) cx.add_basemap(ax, **extra_contextily_params) ax.imshow(img, alpha=img[:, :, 3], extent=(bbox[0], bbox[2], bbox[1], bbox[3])) ax.axis('off')
def db_query(): """ /db/query handler """ log.INSTANCE.info('POST /db/query: {}'.format(request.json)) if not utils.check_json(request.json, 'id') \ or not utils.check_json(request.json, 'query') \ or not utils.check_json(request.json['query'], 'type') \ or not utils.check_json(request.json['query'], 'sql'): return jsonify(status='error', code=-1, message='query format error') query_sql = request.json['query']['sql'] query_type = request.json['query']['type'] content = {} content['sql'] = query_sql content['err'] = False db_instance = db.CENTER.get(str(request.json['id']), None) if db_instance is None: return jsonify(status="error", code=-1, message='there is no database whose id equal to ' + str(request.json['id'])) if query_type == 'sql': res = db_instance.run_for_json(query_sql) data = [] for row in res: obj = json.loads(row) data.append(obj) content['result'] = data else: if not utils.check_json(request.json['query'], 'params'): return jsonify(status='error', code=-1, message='query format error') query_params = request.json['query']['params'] res = db_instance.run(query_sql) if query_type == 'point': vega = vega_pointmap(int(query_params['width']), int(query_params['height']), query_params['point']['bounding_box'], int(query_params['point']['point_size']), query_params['point']['point_color'], float(query_params['point']['opacity']), query_params['point']['coordinate_system']) data = pointmap(vega, res) content['result'] = data elif query_type == 'heat': vega = vega_heatmap(int(query_params['width']), int(query_params['height']), query_params['heat']['bounding_box'], float(query_params['heat']['map_zoom_level']), query_params['heat']['coordinate_system'], query_params['heat']['aggregation_type']) data = heatmap(vega, res) content['result'] = data elif query_type == 'choropleth': vega = vega_choroplethmap( int(query_params['width']), int(query_params['height']), query_params['choropleth']['bounding_box'], query_params['choropleth']['color_gradient'], query_params['choropleth']['color_bound'], float(query_params['choropleth']['opacity']), query_params['choropleth']['coordinate_system'], query_params['choropleth']['aggregation_type']) data = choroplethmap(vega, res) content['result'] = data elif query_type == 'weighted': vega = vega_weighted_pointmap( int(query_params['width']), int(query_params['height']), query_params['weighted']['bounding_box'], query_params['weighted']['color_gradient'], query_params['weighted']['color_bound'], query_params['weighted']['size_bound'], float(query_params['weighted']['opacity']), query_params['weighted']['coordinate_system']) data = weighted_pointmap(vega, res) content['result'] = data elif query_type == 'icon': vega = vega_icon(int(query_params['width']), int(query_params['height']), query_params['icon']['bounding_box'], query_params['icon']['icon_path'], query_params['icon']['coordinate_system']) data = icon_viz(vega, res) content['result'] = data elif query_type == 'fishnet': vega = vega_fishnetmap( int(query_params['width']), int(query_params['height']), query_params['fishnet']['bounding_box'], query_params['fishnet']['color_gradient'], int(query_params['fishnet']['cell_size']), int(query_params['fishnet']['cell_spacing']), float(query_params['fishnet']['opacity']), query_params['fishnet']['coordinate_system'], query_params['fishnet']['aggregation_type']) data = fishnetmap(vega, res) content['result'] = data else: return jsonify(status="error", code=-1, message='{} not support'.format(query_type)) return jsonify(status="success", code=200, data=content)