我的数据框上有坐标(记录的路线)。 数据框结构是这样的(有更多列):
没有纬度经度海拔速度课程日期时间等。
0 59.303758 18.078915 NaN 0.0 114.9 2017/04/01 13:21:48
1 59.303758 18.078915 -8.5 0.0 114.9 2017/04/01 13:21:49
2 59.303758 18.078915 -8.5 0.0 114.9 2017/04/01 13:21:50
。
。
列表继续...
我正在尝试从数据框中解析不需要的点。图片示例。红线表示数据框中的坐标点,我只想获取绿色字段上的点。
示例代码:
#north
y_1n=59.33551 #point 1 latitude
x_1n=18.02649 #point 1 longitude
y_2n=59.33327 #point 2 latitude
x_2n=18.04500 #point 2 longitude
#south
y_1s=59.33478 #point 3 latitude
x_1s=18.02645 #point 3 longitude
y_2s=59.33246 #point 4 latitude
x_2s=18.04422 #point 4 longitude
#
test = df1[(df1['Latitude'] <= y_1n) & (df1['Latitude'] >= y_2n) &
(df1['Latitude'] <= y_1s) & (df1['Latitude'] >= y_2s) &
(df1['Longitude'] >= x_1n) & (df1['Longitude'] <= x_2n) &
(df1['Longitude'] >= x_1s) & (df1['Longitude'] <= x_2s)
]
因此,我们的想法是,新数据框中仅包含这些预定义的2个北点和2个南点(坐标点)内的数据。
使用该代码,我设法解析了数据,但是它离北和南点很远(仅包括街道的一半)。所以它确实解析了它,或者发生了奇怪的事情。
是否有更好或有效的方法来做到这一点?
答案 0 :(得分:0)
矩形未与经度和纬度对齐,因此您无法使用简单的经/纬度检查。 simple way为此将考虑从给定的经度/纬度开始的一条线,并将其沿随机方向(为方便起见,可能是基数方向)延伸数英里(比矩形长一些)。 / p>
然后,编写一个intersect function intersect(Point1, Point2, Point3, Point4)
,如果Line(P1,P2)与Line(P1,P2)相交,则返回true。然后,用您的延长线检查边界框相交的边缘。如果答案是一个,那您就很好,您就在盒子里。
答案 1 :(得分:0)
我确实按照以下方式解决了。
首先,我创建了Geopandas Dataframe,并使用Shapely创建了多边形。然后我将多边形添加到数据框。还添加了与多边形对应的位置。
import geopandas as gpd
from shapely.geometry import Point, Polygon, LineString
polygon = gpd.GeoDataFrame()
coord = [(18.02649,59.33551),(18.04500,59.33327),(18.02645,59.33478),
(18.04422,59.33246)]
polygon.loc[0, 'geometry'] = Polygon(coord)
polygon.loc[0, 'Location'] = 'Fleminggatan'
然后我从Pandas DataFrame复制到Geopandas Dataframe。
df2 = gpd.GeoDataFrame(df1)
之后,我为结合了经度和纬度的DataFrame制作了新系列 系列。
df2['geometry'] = [Point(xy) for xy in zip(df2.Longitude, df2.Latitude)]
然后我使用了Geopandas Spatial Join。 (op)无关紧要,因为我将点连接到多边形。如果这些是台词,那将会有所作为。
df3 = gpd.sjoin(df2,polygon, how='inner', op='intersects')
此后,我离开了DataFrame,并在想要的位置放置了数据。