folium icon indicating copy to clipboard operation
folium copied to clipboard

TopoJSON fails with Polygon/MultiPolygon objects

Open lazka opened this issue 2 years ago • 0 comments

Describe the bug

I got a topojson file and want to draw it with folium. This failed with:

  File ".../lib/python3.11/site-packages/folium/features.py", line 981, in style_data
    geometries = recursive_get(self.data, self.object_path.split("."))[
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
KeyError: 'geometries'

To Reproduce

topo_json = {
  "type": "Topology",
  "objects": {
    "A": {
      "type": "Polygon",
      "id": "A",
      "bbox": [
        9.47021484375, 46.34692761055676, 17.259521484375, 49.059469847170526
      ],
      "arcs": [[0]]
    }
  },
  "arcs": [
    [
      [28, 4614],
      [437, 219],
      [607, -875],
      [99, 738],
      [818, -109],
      [56, -437],
      [338, 54],
      [1185, 1255],
      [874, -626],
      [-310, 1657],
      [423, 782],
      [325, 189],
      [169, 832],
      [141, 107],
      [240, -161],
      [112, 882],
      [424, -507],
      [268, -214],
      [832, 1599],
      [394, -80],
      [1072, -718],
      [282, -187],
      [212, 347],
      [606, -480],
      [71, -829],
      [-155, -511],
      [451, -1430],
      [-183, -1224],
      [-508, -81],
      [-127, 272],
      [-99, -163],
      [240, -246],
      [56, -300],
      [-239, -713],
      [-28, -1294],
      [-311, -110],
      [-366, -609],
      [14, -611],
      [-268, 222],
      [-480, -389],
      [-733, -112],
      [-451, -753],
      [-2892, 1226],
      [-324, 1247],
      [-395, -249],
      [-663, -55],
      [-253, -665],
      [-748, 249],
      [-70, 443],
      [-367, -470],
      [-663, 747],
      [-141, 881],
      [141, 440],
      [-113, 820]
    ]
  ],
  "transform": {
    "scale": [0.0007790085649189919, 0.0002712813517965561],
    "translate": [9.47021484375, 46.34692761055676]
  },
  "bbox": [
    9.47021484375, 46.34692761055676, 17.259521484375, 49.059469847170526
  ],
  "properties": {
  }
}

def fixup_topo_json_for_folium(topo_json: dict):
    # Folium only supports TopoJSON with GeometryCollection, so hack it together
    for key in topo_json["objects"].keys():
        orig = topo_json["objects"][key]
        new = {"type": "GeometryCollection", "geometries": [orig]}
        topo_json["objects"][key] = new

import folium
map = folium.Map()
# fixup_topo_json_for_folium(topo_json)
folium.TopoJson(topo_json, "objects.A").add_to(map)
map.save("bug.html")

Expected behavior

It draws the topojson

Environment (please complete the following information):

  • Browser [e.g. chrome, firefox]: Firefox
  • Jupyter Notebook or html files? html
  • Python version (check it with import sys; print(sys.version_info)) 3.11
  • folium version (check it with import folium; print(folium.__version__)) 0.14.0
  • branca version (check it with import branca; print(branca.__version__)) 0.6.0

Additional context

It looks like it only supports GeometryCollection and not any of the other types, I've included my current workaround in the reproducer called fixup_topo_json_for_folium() which makes it work by wrapping all objects in a dummy GeometryCollection.

lazka avatar Oct 13 '23 14:10 lazka