[fix] some weirdness with the dateline and polygons that have a longitude of exactly 180.0

This commit is contained in:
Al
2016-04-29 19:59:53 -04:00
parent 8cf51378a0
commit 99e634aaba
3 changed files with 11 additions and 5 deletions

View File

@@ -0,0 +1,5 @@
FLOAT_EPSILON = 1e-09
def isclose(a, b, rel_tol=FLOAT_EPSILON, abs_tol=0.0):
return abs(a - b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)

View File

@@ -2,7 +2,7 @@ import bisect
import random import random
import sys import sys
FLOAT_EPSILON = 1e-09 from geodata.math.floats import isclose, FLOAT_EPSILON
def weighted_choice(values, cdf): def weighted_choice(values, cdf):
@@ -16,10 +16,6 @@ def weighted_choice(values, cdf):
return values[i] return values[i]
def isclose(a, b, rel_tol=FLOAT_EPSILON, abs_tol=0.0):
return abs(a - b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
def check_probability_distribution(probs): def check_probability_distribution(probs):
cumulative = 0.0 cumulative = 0.0
for p in probs: for p in probs:

View File

@@ -15,6 +15,7 @@ from itertools import izip, combinations
from geodata.coordinates.conversion import latlon_to_decimal from geodata.coordinates.conversion import latlon_to_decimal
from geodata.graph.scc import strongly_connected_components from geodata.graph.scc import strongly_connected_components
from geodata.math.floats import isclose
from geodata.osm.extract import * from geodata.osm.extract import *
@@ -179,6 +180,10 @@ class OSMPolygonReader(object):
lat, lon = latlon_to_decimal(lat, lon) lat, lon = latlon_to_decimal(lat, lon)
if lat is None or lon is None: if lat is None or lon is None:
continue continue
if isclose(lon, 180.0):
lon = 179.999
# Nodes are stored in a sorted array, coordinate indices are simply # Nodes are stored in a sorted array, coordinate indices are simply
# [lon, lat, lon, lat ...] so the index can be calculated as 2 * i # [lon, lat, lon, lat ...] so the index can be calculated as 2 * i
# Note that the pairs are lon, lat instead of lat, lon for geometry purposes # Note that the pairs are lon, lat instead of lat, lon for geometry purposes