From 90773294b985440836a85407c992b246c218db45 Mon Sep 17 00:00:00 2001 From: Al Date: Sun, 1 Nov 2015 12:36:35 -0500 Subject: [PATCH] [polygons] Only fixing polygons in cases with inner rings --- scripts/geodata/polygons/reverse_geocode.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/scripts/geodata/polygons/reverse_geocode.py b/scripts/geodata/polygons/reverse_geocode.py index 5d63f637..448c89cd 100644 --- a/scripts/geodata/polygons/reverse_geocode.py +++ b/scripts/geodata/polygons/reverse_geocode.py @@ -23,6 +23,7 @@ import sys import tempfile from functools import partial +from shapely.geos import TopologicalError this_dir = os.path.realpath(os.path.dirname(__file__)) sys.path.append(os.path.realpath(os.path.join(os.pardir, os.pardir))) @@ -687,7 +688,19 @@ class OSMReverseGeocoder(RTreePolygonIndex): if poly is None or not poly.bounds or len(poly.bounds) != 4: continue # Figure out which outer polygon contains each inner polygon - interior = [p2 for p2 in inner if poly.contains(p2)] + try: + interior = [p2 for p2 in inner if poly.contains(p2)] + except TopologicalError: + poly = cls.fix_polygon(poly) + fixed_inner = [] + for p in inner: + p = cls.fix_polygon(p) + if p.type != 'MultiPolygon': + fixed_inner.append(p) + else: + fixed_inner.extend(p) + inner = fixed_inner + interior = [p2 for p2 in inner if poly.contains(p2)] if interior: # Polygon with holes constructor