繁体   English   中英

设置geopandas map的中心

[英]Set centre of geopandas map

我可以 plot 一个世界 map 与 geopandas:

world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))
fig, ax = plt.subplots()
world.plot(ax=ax, color=(0.8,0.5,0.5))

它工作正常,但我想将 map 放在与本初子午线不同的经度上。 我该怎么做呢?

您可以这样做:

from shapely.geometry import LineString
from shapely.ops import split
from shapely.affinity import translate
import geopandas

world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))

def shift_map(shift):
    shift -= 180
    moved_map = []
    splitted_map = []
    border = LineString([(shift,90),(shift,-90)])
    for row in world["geometry"]:
        splitted_map.append(split(row, border))
    for element in splitted_map:
        items = list(element)
        for item in items:
            minx, miny, maxx, maxy = item.bounds
            if minx >= shift:
                moved_map.append(translate(item, xoff=-180-shift))
            else:
                moved_map.append(translate(item, xoff=180-shift))
    gdf = geopandas.GeoDataFrame({"geometry":moved_map})
    fig, ax = plt.subplots()
    gdf.plot(ax=ax)
    plt.show()
   

第一步,您创建自己的世界并将其分割在您的预定义边界上。 然后你得到所有元素的边界并检查边界是否与你想要的转变相匹配。 之后,将每个大于边界的元素平移到 map 的左侧,并将所有其他元素移动到右侧,使它们与 +180° 对齐。

这给了你例如: 移动地图 120°

A map 偏移 120°

在此处输入图像描述 就像在这个问题中一样,我需要重置 map 的中心,但我还需要移动 scatter plot 网络节点位置,该位置也绑定到(long,lat)坐标。 我希望为某人节省一些时间,因为最初可能并不明显,要解决这个问题,您将不得不与一些不熟悉的类型争吵。

这是一种同时移动底层 map 和一些附加点的方法:

import geopandas
world = 
    geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))
import matplotlib.pyplot as plt
import geopandas as gpd
from shapely.geometry import LineString
from shapely.ops import split
from shapely.affinity import translate

def shift_geom(shift, gdataframe,pos_all, plotQ=True):
    # this code is adapted from answer found in SO
    # will be credited here: ???
    shift -= 180
    moved_geom = []
    splitted_geom = []
    border = LineString([(shift,90),(shift,-90)])

    for row in gdataframe["geometry"]:
        splitted_geom.append(split(row, border))
    for element in splitted_geom:
        items = list(element)
        for item in items:
            minx, miny, maxx, maxy = item.bounds
            if minx >= shift:
                moved_geom.append(translate(item, xoff=-180-shift))
            else:
                moved_geom.append(translate(item, xoff=180-shift))

    # got `moved_geom` as the moved geometry            
    moved_geom_gdf = gpd.GeoDataFrame({"geometry": moved_geom})

    # can change crs here
    if plotQ:
        fig1, ax1 = plt.subplots(figsize=[8,6])
        moved_geom_gdf.plot(ax=ax1)
        plt.show()
        
    df = pd.DataFrame({'Latitude': [xy[1] for xy in pos_all.values()],
    'Longitude': [xy[0] for xy in pos_all.values()]})
    gdf = geopandas.GeoDataFrame(df, geometry=geopandas.points_from_xy(df.Longitude, df.Latitude))
    border2 = LineString([(shift,90),(shift,-90)])
    geom = gdf.geometry.values    
    moved_map_points = []
    moved_map_dict = {}

    for element,key in zip(geom,list(pos_all.keys())):
        if float(element.x) >= shift:        
            moved_map_points.append(translate(element, xoff=-180-shift))
        else:
            moved_map_points.append(translate(element, xoff=180-shift))
        moved_map_dict[key] = (moved_map_points[-1].x,moved_map_points[-1].y)

    return moved_geom_gdf,moved_map_dict

在这种情况下,pos_all 是由 [(lat,long)] 组成的 networkx 节点位置

shifted_world,moved_map_points = shift_geom(300, world,pos_all,plotQ= False)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM