Created
August 29, 2018 12:13
-
-
Save atlefren/d106fb2cc470844d9006fd0e4f580950 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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