Фильтрация до уровня состояния для карт Choropleth в Altair

#python #gis #choropleth #vega-lite #altair

#python #гис #choropleth #vega-lite #altair

Вопрос:

Я поиграл с функциональностью карты Altair. Теперь я очень легко могу создавать карты США с границами штатов и округов. На чем я застрял, так это на фильтрации карт до более низкого уровня. Например, если бы я хотел создать карту только штата Джорджия с границами округа, как бы я это сделал?

У меня есть решение, но это плохое решение. Любопытно, есть ли способ получше. Вот мой код:

 states_data = alt.topo_feature(data.us_10m.url, "states")
counties = alt.topo_feature(data.us_10m.url, 'counties')

states = alt.Chart(states_data).mark_geoshape(
        stroke='black',
        strokeWidth=1
    ).transform_filter((alt.datum.id == 13))

cobb = alt.Chart(counties).mark_geoshape(
        stroke='black',
        strokeWidth=1
    ).transform_filter((alt.datum.id == 13067))

fulton = alt.Chart(counties).mark_geoshape(
        stroke='black',
        strokeWidth=1
    ).transform_filter((alt.datum.id == 13121))

dekalb = alt.Chart(counties).mark_geoshape(
        stroke='black',
        strokeWidth=1
    ).transform_filter((alt.datum.id == 13089))

states   cobb   fulton   dekalb
  

Этот код дает мне этот результат:

введите описание изображения здесь

Я использую очень распространенные данные Albers USA для создания границ штатов и округов. Я использовал «штаты» для проецирования штата Джорджия, а затем использовал «кобб», «фултон» и «декалб» для проецирования 3 разных округов метро Атланта поверх этого.

Это работает, но крайне неэффективно, и было бы мучительно, очень мучительно сделать это для всех 159 округов штата. Есть ли более простой способ фильтрации округов, чем тот, который я использую? Или какой-нибудь хороший автоматизированный способ чтения во всех 159 округах без более чем 1000 строк кода!?

Редактировать: Также для справки, я пытался выполнить округа, а затем фильтровать по штатам, но это не сработало. Код приведен ниже:

 states = alt.Chart(states_data).mark_geoshape(
        stroke='black',
        strokeWidth=1
    ).transform_filter((alt.datum.id == 13))

counties = alt.Chart(counties).mark_geoshape(
        stroke='black',
        strokeWidth=1
    ).project('albersUsa')

states   counties
  

Похоже, что этот код просто отображает полную карту округа США.

введите описание изображения здесь

Ответ №1:

Немного странный способ.

Идентификационный код округа начинается с идентификатора штата. С помощью простого трюка js вы можете извлечь его.

 counties = alt.topo_feature(data.us_10m.url, 'counties')

map_georgia =(
    alt.Chart(data = counties)
    .mark_geoshape(
        stroke='black',
        strokeWidth=1
    )
    .transform_calculate(state_id = "(datum.id / 1000)|0")
    .transform_filter((alt.datum.state_id)==13)
)

map_georgia
    
  

введите описание изображения здесь