Создайте карту Альтаира с интерактивным панорамированием и масштабированием - PullRequest
4 голосов
/ 02 марта 2020

Я могу сгенерировать карту мира с помощью всплывающих подсказок при наведении мыши и щелчком мыши, чтобы выделить не выбранные страны. Я хотел бы иметь возможность щелкать по стране и иметь карту панорамирования и увеличения. Я выяснил, как использовать центроиды lon / lat для каждой страны и вручную изменить масштаб / lon / lat для панорамирования и масштабирования, но я я изо всех сил пытаюсь изменить lon / lat с помощью метода выбора, чтобы пользователь мог щелкнуть по стране, чтобы увеличить масштаб (также, мне нужно было бы иметь возможность увеличить масштаб до стандартного полного вида). Можно ли как-то использовать transform_calculate или что-то, чтобы присвоить значения lon / lat? Спасибо. (данные карты взяты из naturalearthdata )

import altair as alt
import geopandas as gpd
import json
import numpy as np

world_shp =  gpd.read_file('data_world/ne_110m_admin_0_countries.shp')[['ADMIN', 'geometry']]
world_shp.rename(columns={'ADMIN': 'Country'}, inplace=True)
world_shp = world_shp.drop(159)  # remove antarctica
world_shp.sort_values(by='Country')

# Add centroids
world_shp['centroid_lon'] = world_shp['geometry'].centroid.x
world_shp['centroid_lat'] = world_shp['geometry'].centroid.y

# Add column to map_df of some dummy data to plot
dummy = np.random.randint(10, 1000, len(world_shp))
world_shp['Cases'] = dummy

# Setup data
world_json = json.loads(world_shp.to_json())
world_data = alt.Data(values=world_json['features'])

# Plotting:
selection = alt.selection_single(fields=['properties.Cases'])

color = alt.condition(
    selection,
    alt.Color('properties.Cases', 
              type='quantitative',
              scale=alt.Scale(scheme='bluegreen')),
              alt.value('lightgray')
)

# Add Choropleth Layer
world = alt.Chart(world_data).mark_geoshape().encode(
    color=color,
    tooltip=['properties.Country:O', 'properties.Cases:Q']
).properties(
    width=600,
    height=400
).add_selection(
    selection
)

# Add top layer to mark boundaries
boundaries = alt.Chart(world_data, title='Title Here').mark_geoshape(
    stroke='white',
    strokeWidth=1,
    fill=None
)

world + boundaries

И ручной метод панорамирования / масштабирования:

centroid = 'China'

lon = world_shp[world_shp['Country'] == centroid]['centroid_lon'].iloc[0]
lat = world_shp[world_shp['Country'] == centroid]['centroid_lat'].iloc[0]

world.project(
    scale=250, 
    center=[lon, lat]
)

Кадр данных выглядит следующим образом:

enter image description here

...