def coordinates_intersect_rect_q(coords, rect): if isinstance(coords[0], numbers.Number): #single point return geo.points_intersect_rect_q((coords,), rect) elif isinstance(coords[0][0], numbers.Number): #list of points return geo.points_intersect_rect_q(coords, rect) else: # nested point lists for l in coords: if coordinates_intersect_rect_q(l, rect): return True return False
def make_pnwk(features, props=None, namesFunc=None, filter_func=None, name=None,quiet=False, clip_rect=None): if not quiet: log.info('%d centerline features.', len(features)) #print 'DEBUG random city feature:',features[10] city_street_network = pnwk.PNwk(name=name) num_segs = 0 num_jcts=[0] # this is a hack to get around scoping issues jct_ids = {} # indexed by jct coords skipped_features = [] max_input_dim = 0 # return jct_id for point (assigning new one if needed) def jct_id(point): if jct_ids.has_key(point): return jct_ids[point] else: num_jcts[0] += 1 jct_ids[point] = num_jcts[0] return num_jcts[0] for feature in features: if filter_func and not filter_func(feature): continue geometry = feature['geometry'] if geometry['type'] == 'MultiLineString': parts = geometry['coordinates'] else: if geometry['type'] == 'LineString': parts = [geometry['coordinates']] else: parts = [] skippedFeatures.append(feature) for part in parts: num_segs += 1 seg_id = num_segs points = [] for l in part: #code assumes 2d coords, retaining only first 2 coords of input. points.append(tuple(l[:2])) max_input_dim = max(max_input_dim,len(l)) start_point = points[0]; end_point = points[-1] if not props: tags = feature['properties'] else: tags = {} for prop in props: if prop in feature['properties']: tags[prop] = feature['properties'][prop] if clip_rect and not geo.points_intersect_rect_q(points, clip_rect): continue city_street_network.add_seg(seg_id, jct_id(start_point), jct_id(end_point), points, names=namesFunc(feature), tags=tags ) if len(skipped_features) > 0 and not quiet: log.warning('%d features skipped.\n' ' first skipped feature: %s', len(skipped_features), str(feature)) if max_input_dim > 2 and not quiet: info.warning('Input coordinates up to %d dimensional.\n' ' Retaining only first 2 dimensions.', max_input_dim) return city_street_network