Thanks to everyone who responded. I adapted Russell Jarvis’ solution from Set centre of geopandas map. I am sharing because the previous answer was using networkx and I used geopandas DataFrame and updated the geometry directly, returning the updated dataframe. I apologize for overlooking these, it seems that when I created the question, I typed “contextily” instead of “geopandas” and missed them!
def shift_geom(self,shift, gdataframe, gdf1, gdf2, 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()
geom1 = gdf1.geometry.values
geom2 = gdf2.geometry.values
moved_map_points1 = []
moved_map_points2 = []
lines = []
for element in geom1:
if float(element.x) >= shift:
moved_map_points1.append(translate(element, xoff=-180-shift))
else:
moved_map_points1.append(translate(element, xoff=180-shift))
for element in geom2:
if float(element.x) >= shift:
moved_map_points2.append(translate(element, xoff=-180-shift))
else:
moved_map_points2.append(translate(element, xoff=180-shift))
gdf1 = gdf1.set_geometry(moved_map_points1)
gdf2 = gdf2.set_geometry(moved_map_points2)
for el in range(len(moved_map_points1)):
lines.append(LineString([(moved_map_points1[el].x, moved_map_points1[el].y),
(moved_map_points2[el].x, moved_map_points2[el].y)]))
gdfl = gdfl.set_geometry(lines)
return moved_geom_gdf,gdf1,gdf2,gdfl
CLICK HERE to find out more related problems solutions.