无法使用GeoPandas正确旋转点

问题描述 投票:0回答:2

我的Python代码:

from geopandas import GeoSeries
from shapely.geometry import Point

WGS84 = {'init': 'epsg:4326'}
p1 = (41.8121843, 45.2178516,)
p2 = (41.8124878, 45.2177536,)

point2 = Point(p2)

s2 = GeoSeries(point2, crs=WGS84)
rotated = s2.rotate(90, p1)  # Try to rotate p2 around p1

print(rotated)  # 41.8122823 45.2181551

我的JS代码(Turf.js):

var p1 = [41.8121843, 45.2178516];
var p2 = [41.8124878, 45.2177536];

var l = turf.lineString( [p1, p2] );
L.geoJson(l, {style: {color: '#0000ff', fillOpacity: 1, fillColor: '#0000ff', opacity: 1}}).addTo(map);

// Rotate line around p1
var trufRotated = turf.transformRotate(l, -90, {pivot: p1});
L.geoJson(trufRotated, {style: {color: '#ff0000'}}).addTo(map);

插图。蓝色是原来的线。红色是使用 Turf.js 旋转的线(正常)。绿色是使用 GeoPandas 旋转的线(不行):

使用 geopandas 旋转的绿线偏移量错误。也许是投影问题,但我不知道如何解决它。

我的问题是如何使用 GeoPandas 正确旋转?

python rotation geo geopandas turfjs
2个回答
0
投票

解决了。感谢@PaulH。我需要在墨卡托中进行旋转并在经/纬度中再次翻译它:

WGS84 = {'init': 'epsg:4326'}
MERC = {'init': 'epsg:3857'}

p1 = (41.8121843, 45.2178516,)
p2 = (41.8124878, 45.2177536,)

point1 = Point(p1)
point2 = Point(p2)

s1 = GeoSeries(point1, crs=WGS84)
s2 = GeoSeries(point2, crs=WGS84)

s11 = s1.to_crs(MERC)
s22 = s2.to_crs(MERC)

rotated = s22.rotate(90, s11[0])
rotated = rotated.to_crs(WGS84)
print(rotated)

0
投票

出于某种原因,这对我不起作用。 geopandas.rotate() 根本不想与我的形状文件合作!如果其他人也遇到类似的问题,实现同样目标的肮脏方法是

import geopandas as gpd
import shapely.geometry as geom
import random

# Generate geodataframe with random coordinates
geo = [geom.Point(random.uniform(-180, 180), random.uniform(-90, 90)) for _ in range(10)]
points = points.GeoDataFrame(geometry=geo)

def rotate_points(point):
    x,y = point
    return(y,-x)

gdf['geometry'] = gdf['geometry'].apply(lambda geom: geom.coords[0]).apply(rotate_points).apply(Point)

这将使所有点相对于原点顺时针旋转 90 度。当然,这可以推广到任何其他旋转,最简单的是 90 的整数,通过替换

return(y,-x)

进行适当的变换。

逆时针90度:

return(-y,x)

对于 180 度:

return(-x,-y)
© www.soinside.com 2019 - 2024. All rights reserved.