def test_iterops(self): coords = ((0.0, 0.0), (0.0, 1.0), (1.0, 1.0), (1.0, 0.0), (0.0, 0.0)) polygon = Polygon(coords) points = [Point(0.5, 0.5), Point(2.0, 2.0)] # List of the points contained by the polygon self.assertTrue( all([isinstance(x, Point) for x in iterops.contains(polygon, points, True)])) # 'True' is the default value self.assertTrue( all([isinstance(x, Point) for x in iterops.contains(polygon, points)])) # Test a false value self.assertTrue( all([isinstance(x, Point) for x in iterops.contains(polygon, points, False)])) # If the provided iterator yields tuples, the second value will be # yielded self.assertEqual( list(iterops.contains(polygon, [(p, p.coords[:]) for p in points], False)), [[(2.0, 2.0)]]) # Just to demonstrate that the important thing is that the second # parameter is an iterator: self.assertEqual( list(iterops.contains(polygon, iter((p, p.coords[:]) for p in points))), [[(0.5, 0.5)]])
def rastervals_in_unit(unit, lon_min, lat_min, cellsize, data, view='y-x+'): # For some reason it is MUCH faster to do it this way. if isinstance(unit, geometry.multipolygon.MultiPolygon): return np.hstack([rastervals_in_unit(g,lon_min,lat_min,cellsize,data,view) for g in unit.geoms]) llc = unit.bounds[:2] urc = unit.bounds[2:] lon_min_in = int((llc[0]-lon_min)/cellsize) lon_max_in = int((urc[0]-lon_min)/cellsize)+1 lat_min_in = int((llc[1]-lat_min)/cellsize) lat_max_in = int((urc[1]-lat_min)/cellsize)+1 data_boxed_ = grid_convert(data,view,'x+y+')[lon_min_in:lon_max_in+1,lat_min_in:lat_max_in+1] flat_shape = (-1,)+data_boxed_.shape[2:] data_boxed = data_boxed_.reshape(flat_shape) lon_boxed = np.arange(lon_min_in, lon_max_in+1)*cellsize + lon_min lat_boxed = np.arange(lat_min_in, lat_max_in+1)*cellsize + lat_min mlon_boxed, mlat_boxed = np.meshgrid(lon_boxed, lat_boxed) mlon_boxed = grid_convert(mlon_boxed,'y+x+','x+y+') mlat_boxed = grid_convert(mlat_boxed,'y+x+','x+y+') p=[geom.Point(*pair) for pair in zip(mlon_boxed.ravel(), mlat_boxed.ravel())] if isinstance(unit, geometry.polygon.Polygon): p_in = set(iterops.contains(geometry.polygon.Polygon(unit.exterior.coords), p, True)) for hole in unit.interiors: p_in -= set(iterops.contains(geometry.polygon.Polygon(hole.coords), p, True)) else: p_in = iterops.contains(unit, p, True) i_in = [p.index(p_in_) for p_in_ in p_in] out = data_boxed[i_in] return out
def unit_to_grid(unit, lon_min, lat_min, cellsize): """ unit_to_grid(unit, lon_min, lat_min, cellsize) unit : a shapely polygon or multipolygon lon_min : The llc longitude of the master raster lat_min : The llc latitude of the master raster cellsize: of the master raster Retruns two arrays, lon and lat, of points on the raster in the unit. """ llc = unit.bounds[:2] urc = unit.bounds[2:] lon_min_in = int((llc[0]-lon_min)/cellsize) lon_max_in = int((urc[0]-lon_min)/cellsize)+1 lat_min_in = int((llc[1]-lat_min)/cellsize) lat_max_in = int((urc[1]-lat_min)/cellsize)+1 x_extent = np.arange(lon_min_in, lon_max_in+1)*cellsize + lon_min y_extent = np.arange(lat_min_in, lat_max_in+1)*cellsize + lat_min nx = len(x_extent) ny = len(y_extent) xm,ym = np.meshgrid(x_extent, y_extent) x=xm.ravel() y=ym.ravel() p=[geom.Point([x[i],y[i]]) for i in xrange(len(x))] return iterops.contains(unit, p, True)
def test_iterops_deprecated(self): coords = ((0.0, 0.0), (0.0, 1.0), (1.0, 1.0), (1.0, 0.0), (0.0, 0.0)) polygon = Polygon(coords) points = [Point(0.5, 0.5), Point(2.0, 2.0)] with pytest.warns(ShapelyDeprecationWarning, match="'contains' function"): list(iterops.contains(polygon, points, True))
def multipoly_sample(n, mp): """ Returns uniformly-distributed points on the earth's surface conditioned to be inside a multipolygon. Not particularly fast. """ # b = basemap.Basemap(-180,-90,180,90) if isinstance(mp, geometry.MultiPolygon): print 'Breaking down multipolygon' areas = [shapely_poly_area(p) for p in mp.geoms] areas = np.array(areas)/np.sum(areas) # ns = pm.rmultinomial(n, areas) stair = np.array(np.concatenate(([0],np.cumsum(areas*n))),dtype='int') ns = np.diff(stair) locs = [multipoly_sample(ns[i], mp.geoms[i]) for i in np.where(ns>0)[0]] return np.concatenate([loc[0] for loc in locs]), np.concatenate([loc[1] for loc in locs]) lons = np.empty(n) lats = np.empty(n) done = 0 xmin = mp.bounds[0]*np.pi/180 ymin = mp.bounds[1]*np.pi/180 xmax = mp.bounds[2]*np.pi/180 ymax = mp.bounds[3]*np.pi/180 print 'Starting: n=%i'%n while done < n: x = np.atleast_1d(pm.runiform(xmin,xmax, size=n)) y = np.atleast_1d(np.arcsin(pm.runiform(np.sin(ymin),np.sin(ymax),size=n))) points=[geom.Point([x[i]*180./np.pi,y[i]*180./np.pi]) for i in xrange(len(x))] good = list(iterops.contains(mp, points, True)) n_good = min(n,len(good)) lons[done:done+n_good] = [p.coords[0][0] for p in good][:n-done] lats[done:done+n_good] = [p.coords[0][1] for p in good][:n-done] done += n_good print '\tDid %i, %i remaining.'%(n_good,n-done) # plot_unit(b,mp) # b.plot(x*180./np.pi,y*180./np.pi,'r.') # # from IPython.Debugger import Pdb # Pdb(color_scheme='Linux').set_trace() print 'Filled' return lons, lats
def exclude_ues(xy, unit, ue_shapefile): """ exclude_ues(xy,unit,ue_shapefile) xy : sequence of points. unit : The shapely polygon or multipolygon containing xy. ue_shapefile : A NonSuckyShapeFile object. Returns x and y filtered to be outside the polygons in the shapefile. """ if not unit.is_valid: raise ValueError, 'invalid unit' intersect_fracs = [] for ue in ue_shapefile: if unit.intersects(ue): xy = iterops.contains(unit, xy, True) intersect_fracs.append(unit.intersection(ue).area / ue.area) else: intersect_fracs.append(0) return xy, intersect_fracs
def multipoly_sample(n, mp, test=None, verbose=0): """ Returns uniformly-distributed points on the earth's surface conditioned to be inside a multipolygon. Not particularly fast. """ # b = basemap.Basemap(-180,-90,180,90) if isinstance(mp, geometry.MultiPolygon): if verbose>0: print 'Breaking down multipolygon' areas = [shapely_poly_area(p) for p in mp.geoms] areas = np.array(areas) areas /= np.sum(areas) # ns = pm.rmultinomial(n, areas) stair = np.round(np.concatenate(([0],np.cumsum(areas*n)))).astype('int') ns = np.diff(stair) locs = [multipoly_sample(ns[i], mp.geoms[i], test) for i in np.where(ns>0)[0]] lons = np.concatenate([loc[0] for loc in locs]) lats = np.concatenate([loc[1] for loc in locs]) if len(lons) != n or len(lats) != n: raise ValueError return lons, lats lons = np.empty(n) lats = np.empty(n) done = 0 xmin = mp.bounds[0]*np.pi/180 ymin = mp.bounds[1]*np.pi/180 xmax = mp.bounds[2]*np.pi/180 ymax = mp.bounds[3]*np.pi/180 if verbose>0: print 'Starting: n=%i'%n while done < n: x = np.atleast_1d(pm.runiform(xmin,xmax, size=n)) y = np.atleast_1d(np.arcsin(pm.runiform(np.sin(ymin),np.sin(ymax),size=n))) points=[geom.Point([x[i]*180./np.pi,y[i]*180./np.pi]) for i in xrange(len(x))] good = list(iterops.contains(mp, points, True)) if test: good = filter(lambda p: test(p.coords[0][0], p.coords[0][1]),good) n_good = min(n,len(good)) lons[done:done+n_good] = [p.coords[0][0] for p in good][:n-done] lats[done:done+n_good] = [p.coords[0][1] for p in good][:n-done] done += n_good if verbose>0: print '\tDid %i, %i remaining.'%(n_good,n-done) if verbose>0: print 'Filled' if test: if not np.all([test(lon,lat) for lon,lat in zip(lons,lats)]): raise ValueError, 'Test failed at some outputs' if len(lons)!=n or len(lats)!=n: raise ValueError return lons, lats
elif count % 25 == 0: sys.stdout.write('.') sys.stdout.flush() print str(count) + " coordinates found" print "Matching points to regions" f = open('os.dat', 'r') count = 0 for line in f: (region, wkt) = line.split("\t") polygon = loads(wkt) for point in iterops.contains(polygon, points, True): fout.write("<%s> <http://data.ordnancesurvey.co.uk/ontology/spatialrelations/within> <%s> .\n" % (point.uri, region)) fout.write("<%s> <http://data.ordnancesurvey.co.uk/ontology/spatialrelations/contains> <%s> .\n" % (region, point.uri)) count += 1 if count > 0: if count % 1000 == 0: print str(count) + " regions checked" sys.stdout.flush() elif count % 25 == 0: sys.stdout.write('.') sys.stdout.flush() print str(count) + " regions checked" f.close() fout.close()