【问题标题】:Set centre of geopandas map设置 geopandas 地图的中心
【发布时间】:2020-03-04 03:47:57
【问题描述】:

我可以用 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))

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

【问题讨论】:

    标签: python-3.x matplotlib geopandas


    【解决方案1】:

    你可以这样做:

    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° 对齐。

    这给你例如:

    地图偏移了 120°

    【讨论】:

      【解决方案2】:

      就像在这个问题中一样,我需要重置地图的中心,但我还需要移动散点图网络节点位置,这些位置也绑定到 (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)
      

      【讨论】:

        猜你喜欢
        • 2021-06-24
        • 2019-09-05
        • 2011-07-27
        • 2021-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-16
        • 1970-01-01
        相关资源
        最近更新 更多