Errno 32: Сломан канал при использовании getMapId()

Я читаю большой файл geojson, содержащий следы тысяч зданий. Этот файл выглядит так:

{
  "type":"FeatureCollection",
  "features":
  [
    {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-97.208203,50.90649],[-97.208203,50.906568],[-97.208367,50.906568],[-97.208367,50.90649],[-97.208203,50.90649]]]},"properties":{}},
    {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-97.138545,50.91915],[-97.1387,50.919146],[-97.138692,50.919018],[-97.138537,50.919022],[-97.138545,50.91915]]]},"properties":{}},
    {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-97.106312,50.949822],[-97.106178,50.949845],[-97.106255,50.950025],[-97.106389,50.950002],[-97.106312,50.949822]]]},"properties":{}},
.
.
.
  ]
}

Я читаю этот файл и загружаю его в ee.FeatureCollection() с помощью:

import json

# Open file to parse
with open('/content/drive/My Drive/Earthengine/buildings.geojson') as f:
  data = json.load(f)

# Parse each of the polygons to features
polygons = []
for feat in data['features']:
  polygons.append(ee.Feature(feat))

# Create the feature collection
buildings = ee.FeatureCollection(polygons)

Но когда я пытаюсь показать эти здания на листе с помощью:

polyImage = ee.Image(0).byte().paint(buildings, 1)
polyImage = polyImage.updateMask(polyImage)

mapid = polyImage.getMapId()
map = folium.Map(location=[38., -100.], zoom_start=5)
folium.TileLayer(
    tiles=EE_TILES.format(**mapid),
    attr='Google Earth Engine',
    overlay=True,
    name='training polygons',
  ).add_to(map)
map.add_child(folium.LayerControl())
map

Я получаю следующую ошибку:

---------------------------------------------------------------------------
BrokenPipeError                           Traceback (most recent call last)
<ipython-input-7-3c769c73ff13> in <module>()
      2 polyImage = polyImage.updateMask(polyImage)
      3 
----> 4 mapid = polyImage.getMapId()
      5 map = folium.Map(location=[38., -100.], zoom_start=5)
      6 folium.TileLayer(

15 frames
/usr/lib/python3.6/ssl.py in write(self, data)
    640         The 'data' argument must support the buffer interface.
    641         """
--> 642         return self._sslobj.write(data)
    643 
    644     def getpeercert(self, binary_form=False):

BrokenPipeError: [Errno 32] Broken pipe

Может ли это произойти из-за того, что файл слишком большой? Как-нибудь обойти эту проблему?


person Andrés Prada G.    schedule 01.11.2019    source источник


Ответы (1)


Я почти уверен, что это происходит, потому что Earth Engine все еще работает, а соединение закрывается на стороне клиента, не получив ответа. См. этот ответ для получения дополнительной информации о Broken Pipe.

Предполагая, что у вас много полигонов, Earth Engine должен построить полигоны, а затем растрировать их, что может не потребовать много вычислений, но может занять некоторое время, отсюда и сломанная труба. Один из способов обойти это — сохранить полигоны зданий в качестве актива, а затем напрямую загрузить этот актив на карту.

Вы можете экспортировать featureCollection, используя этот синтаксис:

task = ee.batch.Export.table.toAsset(
  collection=buildings,
  description='my-buildings', 
  assetId='users/myusername/buildings'
)
task.start()
person Kel Markert    schedule 20.11.2019