CRS 相同但几何形状不同的数字格式
CRS the same but geometry in different numeric formats
我有两个具有相同 CRS (4326) 的几何图形,但它们的 X-Y 轴格式完全不同。它们应该重叠。我对下面的这个几何有问题。它说它是 4326,但它的 X/Y 不在那个投影中。
import osmnx as ox
import networkx as nx
from shapely.geometry import Point, LineString, Polygon
import geopandas as gpd
from descartes import PolygonPatch
配置地点、网络类型、行程时间和行驶速度
place = 'Stockholm, Sweden'
network_type = 'drive'
trip_times = [15] #in minutes
travel_speed = 4.5 #walking speed in km/hour
G_4326 = ox.graph_from_place(place, network_type=network_type)
获取最近的节点
urban_intervention = ox.distance.get_nearest_node(G_4326, (59.33039855957031, 18.022981643676758))
G_4326 = ox.project_graph(G_4326)
为遍历每条边所需的时间添加边属性(以分钟为单位)
meters_per_minute = travel_speed * 1000 / 60 #km per hour to m per minute
for u, v, k, data in G_4326.edges(data=True, keys=True):
data['time'] = data['length'] / meters_per_minute
isochrone_polys = []
for trip_time in sorted(trip_times, reverse=True):
subgraph = nx.ego_graph(G_4326, urban_intervention, radius=trip_time, distance='time')
node_points = [Point((data['x'], data['y'])) for node, data in subgraph.nodes(data=True)]
bounding_poly = gpd.GeoSeries(node_points).unary_union.convex_hull
isochrone_polys.append(bounding_poly)
转换为 geopandas
treatment_radius = isochrone_polys[0]
treatment_radius_gdf = gpd.GeoDataFrame(index=[0], crs='epsg:4326', geometry=[treatment_radius])
print(treatment_radius_gdf.crs)
print(treatment_radius_gdf)
结果:
非常欢迎任何帮助!
您有一行代码从 EPSG:4326 投影到 UTM CRS。此外,您使用的变量命名非常糟糕。你调用了一个变量 G_4326 而不是在投影之后!
这已明确记录:https://osmnx.readthedocs.io/en/stable/osmnx.html#osmnx.projection.project_graph
# this line changes geometry from epsg:4326 to UTM CRS
G_4326 = ox.project_graph(G_4326)
考虑到您以米为单位计算,这是有道理的。然而,这意味着生成的几何 CRS 不是 EPSG:4326。正确设置CRS,则可以投影回EPSG:4326。显然,这意味着 G_4326
命名错误,尚未解决。
输出
+proj=utm +zone=33 +ellps=WGS84 +datum=WGS84 +units=m +no_defs +type=crs
geometry
0 POLYGON ((676968.606 6569863.360, 676868.881 6...
epsg:4326
geometry
0 POLYGON ((18.10176 59.23074, 18.10003 59.23086...
完整代码
import osmnx as ox
import networkx as nx
import geopandas as gpd
from shapely.geometry import Point
place = "Stockholm, Sweden"
network_type = "drive"
trip_times = [15] # in minutes
travel_speed = 4.5 # walking speed in km/hour
G_4326 = ox.graph_from_place(place, network_type=network_type)
gdf_nodes1, gdf_edges1 = ox.graph_to_gdfs(G_4326)
# this line changes geometry from epsg:4326 to UTM CRS
G_4326 = ox.project_graph(G_4326)
gdf_nodes, gdf_edges = ox.graph_to_gdfs(G_4326)
m = gdf_edges.explore()
urban_intervention = ox.distance.get_nearest_node(
G_4326, (59.33039855957031, 18.022981643676758)
)
meters_per_minute = travel_speed * 1000 / 60 # km per hour to m per minute
for u, v, k, data in G_4326.edges(data=True, keys=True):
data["time"] = data["length"] / meters_per_minute
isochrone_polys = []
for trip_time in sorted(trip_times, reverse=True):
subgraph = nx.ego_graph(
G_4326, urban_intervention, radius=trip_time, distance="time"
)
node_points = [
Point((data["x"], data["y"])) for node, data in subgraph.nodes(data=True)
]
bounding_poly = gpd.GeoSeries(node_points).unary_union.convex_hull
isochrone_polys.append(bounding_poly)
treatment_radius = isochrone_polys[0]
treatment_radius_gdf = gpd.GeoDataFrame(index=[0], crs=gdf_edges.crs, geometry=[treatment_radius])
print(treatment_radius_gdf.crs)
print(treatment_radius_gdf)
print(treatment_radius_gdf.to_crs("epsg:4326").crs)
print(treatment_radius_gdf.to_crs("epsg:4326"))
treatment_radius_gdf.explore(m=m, color="red")
我有两个具有相同 CRS (4326) 的几何图形,但它们的 X-Y 轴格式完全不同。它们应该重叠。我对下面的这个几何有问题。它说它是 4326,但它的 X/Y 不在那个投影中。
import osmnx as ox
import networkx as nx
from shapely.geometry import Point, LineString, Polygon
import geopandas as gpd
from descartes import PolygonPatch
配置地点、网络类型、行程时间和行驶速度
place = 'Stockholm, Sweden'
network_type = 'drive'
trip_times = [15] #in minutes
travel_speed = 4.5 #walking speed in km/hour
G_4326 = ox.graph_from_place(place, network_type=network_type)
获取最近的节点
urban_intervention = ox.distance.get_nearest_node(G_4326, (59.33039855957031, 18.022981643676758))
G_4326 = ox.project_graph(G_4326)
为遍历每条边所需的时间添加边属性(以分钟为单位)
meters_per_minute = travel_speed * 1000 / 60 #km per hour to m per minute
for u, v, k, data in G_4326.edges(data=True, keys=True):
data['time'] = data['length'] / meters_per_minute
isochrone_polys = []
for trip_time in sorted(trip_times, reverse=True):
subgraph = nx.ego_graph(G_4326, urban_intervention, radius=trip_time, distance='time')
node_points = [Point((data['x'], data['y'])) for node, data in subgraph.nodes(data=True)]
bounding_poly = gpd.GeoSeries(node_points).unary_union.convex_hull
isochrone_polys.append(bounding_poly)
转换为 geopandas
treatment_radius = isochrone_polys[0]
treatment_radius_gdf = gpd.GeoDataFrame(index=[0], crs='epsg:4326', geometry=[treatment_radius])
print(treatment_radius_gdf.crs)
print(treatment_radius_gdf)
结果:
非常欢迎任何帮助!
您有一行代码从 EPSG:4326 投影到 UTM CRS。此外,您使用的变量命名非常糟糕。你调用了一个变量 G_4326 而不是在投影之后!
这已明确记录:https://osmnx.readthedocs.io/en/stable/osmnx.html#osmnx.projection.project_graph
# this line changes geometry from epsg:4326 to UTM CRS
G_4326 = ox.project_graph(G_4326)
考虑到您以米为单位计算,这是有道理的。然而,这意味着生成的几何 CRS 不是 EPSG:4326。正确设置CRS,则可以投影回EPSG:4326。显然,这意味着 G_4326
命名错误,尚未解决。
输出
+proj=utm +zone=33 +ellps=WGS84 +datum=WGS84 +units=m +no_defs +type=crs
geometry
0 POLYGON ((676968.606 6569863.360, 676868.881 6...
epsg:4326
geometry
0 POLYGON ((18.10176 59.23074, 18.10003 59.23086...
完整代码
import osmnx as ox
import networkx as nx
import geopandas as gpd
from shapely.geometry import Point
place = "Stockholm, Sweden"
network_type = "drive"
trip_times = [15] # in minutes
travel_speed = 4.5 # walking speed in km/hour
G_4326 = ox.graph_from_place(place, network_type=network_type)
gdf_nodes1, gdf_edges1 = ox.graph_to_gdfs(G_4326)
# this line changes geometry from epsg:4326 to UTM CRS
G_4326 = ox.project_graph(G_4326)
gdf_nodes, gdf_edges = ox.graph_to_gdfs(G_4326)
m = gdf_edges.explore()
urban_intervention = ox.distance.get_nearest_node(
G_4326, (59.33039855957031, 18.022981643676758)
)
meters_per_minute = travel_speed * 1000 / 60 # km per hour to m per minute
for u, v, k, data in G_4326.edges(data=True, keys=True):
data["time"] = data["length"] / meters_per_minute
isochrone_polys = []
for trip_time in sorted(trip_times, reverse=True):
subgraph = nx.ego_graph(
G_4326, urban_intervention, radius=trip_time, distance="time"
)
node_points = [
Point((data["x"], data["y"])) for node, data in subgraph.nodes(data=True)
]
bounding_poly = gpd.GeoSeries(node_points).unary_union.convex_hull
isochrone_polys.append(bounding_poly)
treatment_radius = isochrone_polys[0]
treatment_radius_gdf = gpd.GeoDataFrame(index=[0], crs=gdf_edges.crs, geometry=[treatment_radius])
print(treatment_radius_gdf.crs)
print(treatment_radius_gdf)
print(treatment_radius_gdf.to_crs("epsg:4326").crs)
print(treatment_radius_gdf.to_crs("epsg:4326"))
treatment_radius_gdf.explore(m=m, color="red")