Построение границ избирательного округа в Plotly с использованием Python - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть файл 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 для справки:

enter image description here

В конечном счете, моя стратегия решения этой проблемы заключается в наложении границ на базовую карту, а затем размещении моих трасс данных поверх обоих. Поэтому мой вопрос состоит из двух частей:

  • Как программно обработать эти вложенные списки в одномерных массивах в моем файле Geo JSON, чтобы на моей карте отображались районы Конгресса?

-OR-

  • Как я могу использовать набор плиток, созданный в Mapbox, в качестве слоя поверх базовой карты в виде графика? Где я могу найти документацию для этого?
...