У меня есть файл geo json с координатами округов конгресса, которые я хотел бы нанести на карту с использованием заговора.
Резюме: мне нужно выяснить, как рисовать конгресса Границы района в графике из файла geo json или с использованием набора мозаики, выполненного на заказ из Mapbox Studio в графике.
Файл geo json структурирован следующим образом:
>>> geojson.keys()
dict_keys(['type', 'features'])
>>> geojson['features'][0]
{'geometry': {'coordinates': [[[-97.22872199999999, 49.000561999999995],
...]],
'type': 'Polygon'},
'properties': {'ALAND': 86580712408,
'AWATER': 5058381039,
'CD116FP': '07',
'CDSESSN': '116',
'FUNCSTAT': 'N',
'GEOID': '2707',
'INTPTLAT': '+46.5530202',
'INTPTLON': '-095.6759048',
'LSAD': 'C2',
'MTFCC': 'G5200',
'NAMELSAD': 'Congressional District 7',
'STATEFP': '27'},
'type': 'Feature'}
Опция first , которую я пробовал, заключалась в построении линейного графика с использованием Scattermapbox
примерно так:
testfig = go.Figure(
data=[
go.Scattermapbox(
lat=np.array(feature['geometry']['coordinates']).squeeze()[:,1],
lon=np.array(feature['geometry']['coordinates']).squeeze()[:,0],
mode='lines',
line=dict(width=2, color="#84807f")
)
for feature in sources
]
)
testfig.update_layout(
mapbox=go.layout.Mapbox(
style='carto-positron',
zoom=3,
center={"lat": 38.0902, "lon": -96.7129}
)
)
testfig.show()
Однако это приводит к следующей ошибке:
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-122-d134a193b196> in <module>()
7 line=dict(width=2, color="#84807f")
8 )
----> 9 for feature in sources
10 ]
11 )
<ipython-input-122-d134a193b196> in <listcomp>(.0)
7 line=dict(width=2, color="#84807f")
8 )
----> 9 for feature in sources
10 ]
11 )
IndexError: too many indices for array
После небольшого исследования я заметил, что это было вызвано тем, что файл Geo JSON содержит массивы разного размера в каждом источнике.
>>> for feature in sources:
>>> print(np.array(feature['geometry']['coordinates']).squeeze().shape)
(38034, 2)
(4647, 2)
(2,)
(11077, 2)
Массивы разного размера выглядят так:
>>> np.array(sources[2]['geometry']['coordinates'][0]).shape
(6914, 2)
>>> np.array(sources[2]['geometry']['coordinates'][1]).shape
(20, 2)
Метод second , который я пробовал, заключался в использовании Mapbox Studio, создании векторного набора плиток и попытке наложения слоя набора плиток на мою базовую карту на графике, но безрезультатно. Карта возвращает белый экран.
testfig.update_layout(
mapbox_style="carto-positron",
mapbox_accesstoken=ACCESS_TOKEN,
mapbox_layers=[
{
"below": 'trace',
"sourcetype": "vector",
"source": [
f"mapbox:/{tileset}"
]
},
])
Мне удалось быстро «показать» то, что мне нужно, в Mapbox Studio для справки:
В конечном счете, моя стратегия решения этой проблемы заключается в наложении границ на базовую карту, а затем размещении моих трасс данных поверх обоих. Поэтому мой вопрос состоит из двух частей:
- Как программно обработать эти вложенные списки в одномерных массивах в моем файле Geo JSON, чтобы на моей карте отображались районы Конгресса?
-OR-
- Как я могу использовать набор плиток, созданный в Mapbox, в качестве слоя поверх базовой карты в виде графика? Где я могу найти документацию для этого?