Skip to content

Instantly share code, notes, and snippets.

@atlefren
Created August 29, 2018 12:13
Show Gist options
  • Save atlefren/d106fb2cc470844d9006fd0e4f580950 to your computer and use it in GitHub Desktop.
Save atlefren/d106fb2cc470844d9006fd0e4f580950 to your computer and use it in GitHub Desktop.
from shapely.geometry import LineString
import random
def get_coord_rand(prev=None):
delta_lat = random.uniform(-0.1, 0.1)
delta_lon = random.uniform(-0.1, 0.1)
if delta_lat == 0.0 and delta_lon == 0.0:
return get_coord_rand(prev)
if prev is None:
lat = random.uniform(-90.0, 90.0)
lon = random.uniform(-180.0, 180.0)
prev = (lon, lat)
return (round(prev[0] + delta_lon, 6), round(prev[1] + delta_lat, 6))
def get_coord_static(prev=None):
delta_lat = 1.0
delta_lon = 0
if prev is None:
prev = (1, 1)
return (round(prev[0] + delta_lon, 6), round(prev[1] + delta_lat, 6))
def find_noncrossing(prev_point, line_so_far, cord_gen):
new_point = cord_gen(prev_point)
new_segment = LineString([prev_point, new_point])
intersects = line_so_far.intersects(new_segment)
if not intersects:
return new_point
return find_noncrossing(prev_point, line_so_far, cord_gen)
def get_coord_no_cross(coords, cord_gen):
prev_point = coords[-1] if len(coords) > 0 else None
if len(coords) <= 2:
return cord_gen(prev_point)
line_so_far = LineString(coords[:-1])
res = find_noncrossing(prev_point, line_so_far, cord_gen)
line_so_far = None
return res
def get_coords(num_coords, cord_gen):
coords = []
for i in range(0, num_coords):
coords.append(get_coord_no_cross(coords, cord_gen))
return coords
get_coords(100, get_coord_rand) # ValueError: Prepared geometries cannot be operated on
get_coords(100, get_coord_static) # ok!
get_coords(10, get_coord_rand) # ok!
get_coords(10, get_coord_static) # ok!
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment