diff --git a/topojson/core/extract.py b/topojson/core/extract.py
index 5d548f2..71e80cb 100644
--- a/topojson/core/extract.py
+++ b/topojson/core/extract.py
@@ -570,50 +570,56 @@ class Extract(object):
             self._key = key
             self._obj = self._data[self._key]
 
-            # detect if object is a shapely geometry
-            if hasattr(self._obj, "geom_type"):
-                geom = self._obj
-                self._obj = {"type": geom.geom_type}
-                self._data[self._key] = self._obj
-
-            # detect if object contains shapely supported geometries:
-            elif "geometry" in self._obj.keys() and hasattr(
-                self._obj["geometry"], "geom_type"
-            ):
-                # extract geometry and collect type and properties
-                geom = self._obj["geometry"]
-                self._obj.pop("geometry", None)
-                self._obj = {"properties": self._obj, "type": geom.geom_type}
-                self._data[self._key] = self._obj
-
-            # no direct shapely geometries avaiable. Try forcing
-            else:
-                # detect if the obect contains a __geo_interface__.
-                if hasattr(self._obj, "__geo_interface__"):
-                    self._obj = self._obj.__geo_interface__
+            try:
+                # detect if object is a shapely geometry
+                if hasattr(self._obj, "geom_type"):
+                    geom = self._obj
+                    self._obj = {"type": geom.geom_type}
+                    self._data[self._key] = self._obj
+
+                # detect if object contains shapely supported geometries:
+                elif "geometry" in self._obj.keys() and hasattr(
+                    self._obj["geometry"], "geom_type"
+                ):
+                    # extract geometry and collect type and properties
+                    geom = self._obj["geometry"]
+                    self._obj.pop("geometry", None)
+                    self._obj = {"properties": self._obj, "type": geom.geom_type}
                     self._data[self._key] = self._obj
 
-                # try parsing the object into a shapely geometry. If this not succeeds
-                # then the object might be a GeoJSON Feature or FeatureCollection. If
-                # this fails as well then the object is not recognized and removed.
-                try:
-                    geom = geometry.shape(self._obj)
-                    # object can be mapped, but may not be valid. remove invalid objects
-                    # and continue
-                    if not geom.is_valid:
+                # no direct shapely geometries avaiable. Try forcing
+                else:
+                    # detect if the obect contains a __geo_interface__.
+                    if hasattr(self._obj, "__geo_interface__"):
+                        self._obj = self._obj.__geo_interface__
+                        self._data[self._key] = self._obj
+
+                    # try parsing the object into a shapely geometry. If this not succeeds
+                    # then the object might be a GeoJSON Feature or FeatureCollection. If
+                    # this fails as well then the object is not recognized and removed.
+                    try:
+                        geom = geometry.shape(self._obj)
+                        # object can be mapped, but may not be valid. remove invalid objects
+                        # and continue
+                        if not geom.is_valid:
+                            self._invalid_geoms += 1
+                            del self._data[self._key]
+                            continue
+                    except ValueError:
+                        # object might be a GeoJSON Feature or FeatureCollection
+                        geom = geojson.loads(geojson.dumps(self._obj))
+                    except AttributeError:
+                        geom = geojson.loads(self._obj)
+                    except (IndexError, TypeError):
+                        # object is not valid
                         self._invalid_geoms += 1
                         del self._data[self._key]
                         continue
-                except ValueError:
-                    # object might be a GeoJSON Feature or FeatureCollection
-                    geom = geojson.loads(geojson.dumps(self._obj))
-                except AttributeError:
-                    geom = geojson.loads(self._obj)
-                except (IndexError, TypeError):
-                    # object is not valid
-                    self._invalid_geoms += 1
-                    del self._data[self._key]
-                    continue
+            except AttributeError:
+                # object is not valid
+                self._invalid_geoms += 1
+                del self._data[self._key]
+                continue
 
             # the geom object is recognized, lets serialize the geometric type.
             # this function redirects the geometric object based on its type to
diff --git a/topojson/core/join.py b/topojson/core/join.py
index 67c7e2e..f7e1d71 100644
--- a/topojson/core/join.py
+++ b/topojson/core/join.py
@@ -144,6 +144,10 @@ class Join(Extract):
         ptbs = geometry.asMultiPoint(data["coordinates"]).bounds
         data["bbox"] = compare_bounds(lsbs, ptbs)
 
+        if not data["linestrings"] and not data["coordinates"]:
+            data["junctions"] = self.junctions
+            return data
+
         # prequantize linestrings if required
         if self.options.prequantize > 0:
             # set default if not specifically given in the options
@@ -165,6 +169,7 @@ class Join(Extract):
             return data
 
         if self.options.shared_paths == "coords":
+
             def _get_verts(geom):
                 # get coords of each LineString
                 return [x for x in geom.coords]
@@ -176,7 +181,9 @@ class Join(Extract):
                 verts = _get_verts(ls)
                 for i, vert in enumerate(verts):
                     ran = geoms.pop(vert, None)
-                    neighs = sorted([verts[i - 1], verts[i + 1 if i < len(verts) - 1 else 0]])
+                    neighs = sorted(
+                        [verts[i - 1], verts[i + 1 if i < len(verts) - 1 else 0]]
+                    )
                     if ran and ran != neighs:
                         junctions.append(vert)
                     geoms[vert] = neighs
diff --git a/topojson/core/topology.py b/topojson/core/topology.py
index 2d60a9b..4adfa94 100644
--- a/topojson/core/topology.py
+++ b/topojson/core/topology.py
@@ -298,6 +298,8 @@ class Topology(Hashmap):
         result = copy.deepcopy(self)
         arcs = result.output["arcs"]
 
+        if not arcs:
+            return result
         # dequantize if quantization is applied
         if "transform" in result.output.keys():
             np_arcs = np_array_from_arcs(arcs)
diff --git a/topojson/utils.py b/topojson/utils.py
index b768d08..e38b7e3 100644
--- a/topojson/utils.py
+++ b/topojson/utils.py
@@ -400,22 +400,23 @@ def serialize_as_svg(topo_object, separate=False, include_junctions=False):
     keys = topo_object.keys()
     if "arcs" in keys:
         arcs = topo_object["arcs"]
-        # dequantize if quantization is applied
-        if "transform" in keys:
+        if arcs:
+            # dequantize if quantization is applied
+            if "transform" in keys:
 
-            np_arcs = np_array_from_arcs(arcs)
+                np_arcs = np_array_from_arcs(arcs)
 
-            transform = topo_object["transform"]
-            scale = transform["scale"]
-            translate = transform["translate"]
+                transform = topo_object["transform"]
+                scale = transform["scale"]
+                translate = transform["translate"]
 
-            np_arcs = dequantize(np_arcs, scale, translate)
-            l_arcs = []
-            for ls in np_arcs:
-                l_arcs.append(ls[~np.isnan(ls)[:, 0]].tolist())
-            arcs = l_arcs
+                np_arcs = dequantize(np_arcs, scale, translate)
+                l_arcs = []
+                for ls in np_arcs:
+                    l_arcs.append(ls[~np.isnan(ls)[:, 0]].tolist())
+                arcs = l_arcs
 
-        arcs = [geometry.LineString(arc) for arc in arcs]
+            arcs = [geometry.LineString(arc) for arc in arcs]
 
     else:
         arcs = topo_object["linestrings"]
@@ -475,18 +476,18 @@ def serialize_as_geojson(
 
     # prepare arcs from topology object
     arcs = topo_object["arcs"]
+    transform = None
+    if "transform" in topo_object.keys():
+        transform = topo_object["transform"]
+        scale = transform["scale"]
+        translate = transform["translate"]
+
     if arcs:
         np_arcs = np_array_from_arcs(arcs)
-
-        transform = None
         # dequantize if quantization is applied
-        if "transform" in topo_object.keys():
-
-            transform = topo_object["transform"]
-            scale = transform["scale"]
-            translate = transform["translate"]
-
-            np_arcs = dequantize(np_arcs, scale, translate)
+        np_arcs = dequantize(np_arcs, scale, translate)
+    else:
+        np_arcs = None
 
     # select object member from topology object
     features = topo_object["objects"][objectname]["geometries"]

bounding box not working when using geodata
I'm working on using your library including a warper to process postgres geogis data into TopoJson.
I'm getting a `"ValueError: not enough values to unpack (expected 4, got 0)"` error when calling `tj = topojson.Topology(geoList)`.
geoList content is enclosed as "pretty" and "raw" files
[geoList_pretty.txt](https://github.com/mattijn/topojson/files/4617905/geoList_pretty.txt)
[geoList_raw.txt](https://github.com/mattijn/topojson/files/4617907/geoList_raw.txt)




diff --git a/tests/test_extract.py b/tests/test_extract.py
index 9aa942a..73ce4e4 100644
--- a/tests/test_extract.py
+++ b/tests/test_extract.py
@@ -334,3 +334,14 @@ def test_extract_geopandas_geodataframe():
     topo = Extract(data).to_dict()
 
     assert len(topo["bookkeeping_geoms"]) == 3
+
+
+# dict shoud have a valued key:geom_object. Otherwise key:value is removed
+def test_extract_invalid_dict_item():
+    data = {
+        "type": "MultiPolygon",
+        "coordinates": [[[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]],
+    }
+    topo = Extract(data).to_dict()
+
+    assert len(topo["bookkeeping_geoms"]) == 0
diff --git a/tests/test_join.py b/tests/test_join.py
index 1660b38..c316485 100644
--- a/tests/test_join.py
+++ b/tests/test_join.py
@@ -599,3 +599,19 @@ def test_join_linemerge_multilinestring():
         assert geometry.MultiPoint(topo["junctions"]).equals(
             geometry.MultiPoint([(0.0, 0.0), (1.0, 0.0)])
         )
+
+    # test a list of two invalid geometric objects with prequantize True
+    def test_join_invalid_prequantize():
+        data = [
+            {
+                "type": "MultiPolygon",
+                "coordinates": [[[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]],
+            },
+            {
+                "type": "MultiPolygon",
+                "coordinates": [[[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]],
+            },
+        ]
+        topo = Join(data, options={"prequantize": True}).to_dict()
+
+        assert len(topo["junctions"]) == 0
diff --git a/tests/test_topology.py b/tests/test_topology.py
index 668e811..6854cf3 100644
--- a/tests/test_topology.py
+++ b/tests/test_topology.py
@@ -26,7 +26,7 @@ def test_topology_winding_order_TopoOptions():
     topo = topojson.Topology(data, winding_order="CW_CCW").to_dict(options=True)
 
     assert len(topo["objects"]) == 1
-    assert len(topo["options"]) == 8
+    assert len(topo["options"]) == 9
 
 
 # test winding order using kwarg variables
@@ -37,7 +37,7 @@ def test_topology_winding_order_kwarg_vars():
     topo = topojson.Topology(data, winding_order="CW_CCW").to_dict(options=True)
 
     assert len(topo["objects"]) == 1
-    assert len(topo["options"]) == 8
+    assert len(topo["options"]) == 9
 
 
 def test_topology_computing_topology():
@@ -191,9 +191,11 @@ def test_topology_polygon_point():
 
 def test_topology_point():
     data = [{"type": "Point", "coordinates": [0.5, 0.5]}]
+    # topo = topojson.Topology(data, topoquantize=True).to_dict()
     with pytest.raises(SystemExit) as topo:
         topojson.Topology(data, topoquantize=True).to_dict()
 
+    # assert len(topo["arcs"]) == 0
     assert topo.type == SystemExit
     assert topo.value.code == "Cannot quantize when xmax-xmin OR ymax-ymin equals 0"
 
@@ -307,3 +309,14 @@ def test_topology_to_geojson_polygon_point():
     assert "]]]}}" in topo  # feat 1
     assert "]}}]}" in topo  # feat 2
 
+
+def test_topology_to_geojson_quantized_points_only():
+    data = [{"type": "MultiPoint", "coordinates": [[0.5, 0.5], [1.0, 1.0]]}]
+    topo = topojson.Topology(data, prequantize=True).to_dict()
+
+    assert len(topo["arcs"]) == 0
+    assert topo["objects"]["data"]["geometries"][0]["coordinates"] == [
+        [0, 0],
+        [999999, 999999],
+    ]
+    assert topo["transform"]["translate"] == [0.5, 0.5]

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest
apt-get update apt-get install -y gcc
3.9
requirements/base.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
altair==5.5.0
asttokens==3.0.0
attrs==25.3.0
certifi==2025.1.31
click==8.1.8
click-plugins==1.1.1
cligj==0.7.2
comm==0.2.2
decorator==5.2.1
exceptiongroup==1.2.2
executing==2.2.0
fiona==1.10.1
geojson==3.2.0
geopandas==1.0.1
importlib_metadata==8.6.1
iniconfig==2.1.0
ipython==8.18.1
ipywidgets==8.1.5
jedi==0.19.2
Jinja2==3.1.6
jsonschema==4.23.0
jsonschema-specifications==2024.10.1
jupyterlab_widgets==3.0.13
MarkupSafe==3.0.2
matplotlib-inline==0.1.7
narwhals==1.32.0
numpy==2.0.2
packaging==24.2
pandas==2.2.3
parso==0.8.4
pexpect==4.9.0
pluggy==1.5.0
prompt_toolkit==3.0.50
ptyprocess==0.7.0
pure_eval==0.2.3
Pygments==2.19.1
pyogrio==0.10.0
pyproj==3.6.1
pyshp==2.3.1
pytest==8.3.5
python-dateutil==2.9.0.post0
pytz==2025.2
referencing==0.36.2
rpds-py==0.24.0
shapely==2.0.7
simplification==0.7.13
six==1.17.0
stack-data==0.6.3
tomli==2.2.1
-e git+https://github.com/mattijn/topojson.git@b6508ecf595b474b0d41987c9987487957dd51ab#egg=topojson
traitlets==5.14.3
typing_extensions==4.13.0
tzdata==2025.2
wcwidth==0.2.13
widgetsnbextension==4.0.13
zipp==3.21.0

name: topojson
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - altair==5.5.0
      - asttokens==3.0.0
      - attrs==25.3.0
      - certifi==2025.1.31
      - click==8.1.8
      - click-plugins==1.1.1
      - cligj==0.7.2
      - comm==0.2.2
      - decorator==5.2.1
      - exceptiongroup==1.2.2
      - executing==2.2.0
      - fiona==1.10.1
      - geojson==3.2.0
      - geopandas==1.0.1
      - importlib-metadata==8.6.1
      - iniconfig==2.1.0
      - ipython==8.18.1
      - ipywidgets==8.1.5
      - jedi==0.19.2
      - jinja2==3.1.6
      - jsonschema==4.23.0
      - jsonschema-specifications==2024.10.1
      - jupyterlab-widgets==3.0.13
      - markupsafe==3.0.2
      - matplotlib-inline==0.1.7
      - narwhals==1.32.0
      - numpy==2.0.2
      - packaging==24.2
      - pandas==2.2.3
      - parso==0.8.4
      - pexpect==4.9.0
      - pluggy==1.5.0
      - prompt-toolkit==3.0.50
      - ptyprocess==0.7.0
      - pure-eval==0.2.3
      - pygments==2.19.1
      - pyogrio==0.10.0
      - pyproj==3.6.1
      - pyshp==2.3.1
      - pytest==8.3.5
      - python-dateutil==2.9.0.post0
      - pytz==2025.2
      - referencing==0.36.2
      - rpds-py==0.24.0
      - shapely==2.0.7
      - simplification==0.7.13
      - six==1.17.0
      - stack-data==0.6.3
      - tomli==2.2.1
      - topojson==1.0rc9
      - traitlets==5.14.3
      - typing-extensions==4.13.0
      - tzdata==2025.2
      - wcwidth==0.2.13
      - widgetsnbextension==4.0.13
      - zipp==3.21.0
prefix: /opt/conda/envs/topojson

tests/test_extract.py::test_extract_invalid_dict_item
tests/test_extract.py::test_extract_multipolygon tests/test_extract.py::test_extract_multilinestring tests/test_extract.py::test_extract_nested_geometrycollection tests/test_extract.py::test_extract_geometrycollection_polygon tests/test_extract.py::test_extract_features tests/test_extract.py::test_extract_featurecollection tests/test_extract.py::test_extract_geojson_feat_col_geom_col tests/test_extract.py::test_extract_geojson_feature_geom_col tests/test_extract.py::test_extract_shapely_geometrycollection tests/test_extract.py::test_extract_geomcol_multipolygon_polygon tests/test_extract.py::test_extract_geo_interface_shapefile tests/test_extract.py::test_extract_single_multilinestring tests/test_extract.py::test_extract_single_multilinestring_list tests/test_extract.py::test_extract_geopandas_geodataframe tests/test_join.py::test_join_true_for_junction_points tests/test_join.py::test_join_undefined_for_non_junction_points tests/test_join.py::test_join_forward_backward_lines tests/test_join.py::test_join_more_than_two_lines tests/test_join.py::test_join_duplicate_lines_junction_endpoints tests/test_join.py::test_join_reversed_duplicate_lines_junction_endpoints tests/test_join.py::test_join_exact_duplicate_rings tests/test_join.py::test_join_reversed_duplicate_rings tests/test_join.py::test_join_rotated_duplicate_rings tests/test_join.py::test_join_equal_ring_and_line_no_junctions tests/test_join.py::test_join_rotated_ring_and_line_no_junctions tests/test_join.py::test_join_line_ABC_extends_new_line_AB tests/test_join.py::test_join_reversed_line_CBA_extends_new_line_AB tests/test_join.py::test_join_line_ADE_share_starts_with_ABC tests/test_join.py::test_join_single_ring_ABCA tests/test_join.py::test_join_single_ring_AA tests/test_join.py::test_join_line_DEC_share_line_ABC tests/test_join.py::test_join_line_ABC_extends_line_AB tests/test_join.py::test_join_line_ABC_extends_line_BA tests/test_join.py::test_join_line_ABC_extends_line_BC tests/test_join.py::test_join_line_BC_start_middle_reversed_line_CBA tests/test_join.py::test_join_line_ABD_deviates_line_ABC tests/test_join.py::test_join_line_ABD_deviates_line_CBA tests/test_join.py::test_join_line_DBC_merge_line_ABC tests/test_join.py::test_join_line_DBC_merge_reversed_line_CBA tests/test_join.py::test_join_line_DBE_share_singe_midpoint_line_ABC tests/test_join.py::test_join_line_ABDE_skips_point_line_ABCDE tests/test_join.py::test_join_line_ABDE_skips_point_reversed_line_EDCBA tests/test_join.py::test_join_line_ABCDBE_self_intersects_with_middle tests/test_join.py::test_join_line_ABACD_self_intersects_with_middle tests/test_join.py::test_join_line_ABCDBD_self_intersects_with_end tests/test_join.py::test_join_line_ABCDB_self_intersects tests/test_join.py::test_join_line_ABCA_is_closed tests/test_join.py::test_join_ring_ABCA_is_closed tests/test_join.py::test_join_exact_duplicate_rings_ABCA_ABCA_share_ABCA tests/test_join.py::test_join_exact_duplicate_rings_ABCA_ACBA_share_ABCA tests/test_join.py::test_join_coincident_rings_ABCA_BCAB_share_BCAB tests/test_join.py::test_join_coincident_rings_ABCA_BACB_share_BCAB tests/test_join.py::test_join_coincident_rings_ABCA_DBED_share_B tests/test_join.py::test_join_coincident_ring_ABCA_and_line_DBE_share_B tests/test_join.py::test_join_shared_junctions_in_shared_paths tests/test_join.py::test_join_shared_segment_partly_start_partly_end_segment tests/test_join.py::test_join_non_noded_interesection tests/test_join.py::test_join_super_function_extract tests/test_join.py::test_join_point tests/test_join.py::test_join_prequantize_points tests/test_join.py::test_join_linemerge_multilinestring tests/test_topology.py::test_topology_linestrings_parsed_to_gdf tests/test_topology.py::test_topology_winding_order_TopoOptions tests/test_topology.py::test_topology_winding_order_kwarg_vars tests/test_topology.py::test_topology_computing_topology tests/test_topology.py::test_topology_prequantization tests/test_topology.py::test_topology_prequantization_including_delta_encoding tests/test_topology.py::test_topology_toposimplify_set_in_options tests/test_topology.py::test_topology_toposimplify_as_chaining tests/test_topology.py::test_topology_topoquantize_as_chaining tests/test_topology.py::test_topology_prequantize_topoquantize_as_chaining tests/test_topology.py::test_topology_to_svg tests/test_topology.py::test_topology_with_arcs_without_linestrings tests/test_topology.py::test_topology_widget tests/test_topology.py::test_topology_simplification_vw tests/test_topology.py::test_topology_simplification_dp tests/test_topology.py::test_topology_polygon_point tests/test_topology.py::test_topology_point tests/test_topology.py::test_topology_multipoint tests/test_topology.py::test_topology_polygon tests/test_topology.py::test_topology_point_multipoint tests/test_topology.py::test_topology_to_geojson_nested_geometrycollection tests/test_topology.py::test_topology_to_geojson_polygon_geometrycollection tests/test_topology.py::test_topology_to_geojson_linestring_polygon tests/test_topology.py::test_topology_to_geojson_polygon_point tests/test_topology.py::test_topology_to_geojson_quantized_points_only
tests/test_extract.py::test_extract_linestring tests/test_extract.py::test_extract_empty_linestring tests/test_extract.py::test_extract_invalid_polygon tests/test_extract.py::test_extract_geopandas_geoseries tests/test_extract.py::test_extract_geo_interface_from_list tests/test_extract.py::test_extract_shapely_geo_interface_from_list tests/test_extract.py::test_extract_points tests/test_extract.py::test_extract_single_polygon tests/test_extract.py::test_extract_single_linestring
topojson/core/join.py topojson/utils.py topojson/core/extract.py topojson/core/topology.py
topojson/core/join.py topojson/utils.py topojson/core/extract.py topojson/core/topology.py