簡體   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