你的出发点:
import pandas as pd
from shapely.geometry import box
import matplotlib.pyplot as plt
from matplotlib.collections import PatchCollection
from matplotlib.patches import Polygon
from shapely.geometry import Point
import seaborn as sns
import numpy as np
# some pretend data
data = {'lat':[2.7,3.5,1.4,2.3,.9,1.9], 'lon':[1.2,.9,1.9,2.2,3,1.1]}
df = pd.DataFrame(data)
# the 'bounding' polygon
poly = box(1,1,2,2)
patches = PatchCollection([Polygon(poly.exterior)], facecolor='red', linewidth=.5, alpha=.5)
# plot the bounding box
fig, ax = sns.plt.subplots(1, figsize=(4,4))
ax.add_collection(patches, autolim=True)
# plot the lat/lon points
df.plot(x='lat',y='lon', kind='scatter',ax=ax)
plt.show()
这些数字看起来像这样:
摆脱不需要的点的一种方法是使用布尔掩码:
#probably more efficient ways to do this, but this works
mask = [poly.intersects(Point(lat,lon)) for lat,lon in zip(df.lat,df.lon)]
df = df[mask]
# make new plot (must make a new 'patch' object)
patches1 = PatchCollection([Polygon(poly.exterior)], facecolor='red', linewidth=.5, alpha=.5)
fig1, ax1 = sns.plt.subplots(1, figsize=(4,4))
ax1.add_collection(patches1, autolim=True)
# make the axis bounds the same
ax1.set_xlim(ax.get_xlim())
ax1.set_ylim(ax.get_ylim())
# plot the lat/lon points
df.plot(x='lat',y='lon', kind='scatter',ax=ax1)
plt.show()
给我这张图。
请注意,您可以以其他更快的方式制作布尔蒙版,例如纬度是否高于多边形中的最高点。这些可能本身并不完美,但可以减少问题,因此您不会多次调用intersects()
。
[编辑:如果您的多边形是矩形,]另一种方式(正如您在问题中建议的那样)将只是“裁剪”边界多边形周围的图像。这是一个更快的解决方案,因为您不必intersects()
一遍又一遍地调用该函数。要根据边界多边形修剪图像,您可以在之前插入plt.plot()
:
ax.set_xlim((np.min(poly.exterior.xy[0]),np.max(poly.exterior.xy[0])) )
ax.set_ylim((np.min(poly.exterior.xy[1]),np.max(poly.exterior.xy[1])) )
给出以下内容: