#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