设置Geopandas地图的中心

时间:2019-11-07 14:26:16

标签: python-3.x matplotlib 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))

,它工作正常,但我想将地图的中心定在与本初子午线不同的经度上。我该怎么做?

2 个答案:

答案 0 :(得分:0)

这是您可以执行的操作:

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()
   

第一步,创建您的世界并将其分割在您的预定义边界上。 然后,您将获得所有元素的边界,并检查边界是否与所需的平移相匹配。然后,将比边界大的每个元素平移到地图的左侧,然后将所有其他元素移到右侧,以使它们以+ 180°倾斜。

例如,这为您提供: Shifted map by 120°

地图移动了120°

答案 1 :(得分:0)

enter image description here就像在这个问题中一样,我需要重置地图的中心,但我还需要移动绑定到(long,lat)坐标的散点图网络节点位置。 我希望为某人节省一些时间,因为最初可能并不明显,要解决此问题,您必须与一些不熟悉的类型争论不休。

这是一种移动底层地图和一些附加点的方法:

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)