Note
This page was generated from examples/notebooks/split_antimeridian.ipynb.
Split Antimeridian#
[1]:
import geopandas
import pandas
import starepandas
import pystare
import shapely
import matplotlib.pyplot as plt
import numpy
[2]:
starepandas.__version__
[2]:
'0.6.0+3.gdc385b4.dirty'
[3]:
cities = {'name': ['midway', 'Fiji', 'Baker', 'honolulu'],
'lat': [28.2, -17.8, 0.2, 21.3282956],
'lon': [-177.35, 178.1, -176.7, -157.9]}
cities = starepandas.STAREDataFrame(cities)
sids = starepandas.sids_from_xy(cities.lon, cities.lat, level=1)
cities.set_sids(sids, inplace=True)
trixels = cities.make_trixels(wrap_lon=False)
cities.set_trixels(trixels, inplace=True)
[4]:
max(max(cities.trixels[0].exterior.xy))
[4]:
189.73560999313148
[5]:
split_geoms = cities.split_antimeridian(inplace=False)
max(max(split_geoms.trixels[1].geoms[0].exterior.xy))
[5]:
180.0
[6]:
fig, ax = plt.subplots(dpi=100)
ax.grid(True)
antimeridian = shapely.geometry.LineString([(180,-90), (180,90)])
ax.plot(*antimeridian.xy, color='red')
ax.set_ylim(-90,90)
ax.set_xlim(90,270)
cities.plot(ax=ax, column='name')
[6]:
<AxesSubplot:>
Multipolygon#
[7]:
combined = starepandas.STAREDataFrame(sids=[sids, sids])
trixels = combined.make_trixels(wrap_lon=False)
combined.set_trixels(trixels, inplace=True)
Algorithm#
[8]:
bbox = shapely.geometry.Polygon([(-180, -90), (180, -90), (180, 90), (-180, 90)])
[9]:
trixels = geopandas.GeoSeries(combined[combined._trixel_column_name])
[10]:
def split(trixels):
bbox = shapely.geometry.Polygon([(-180, -90), (180, -90), (180, 90), (-180, 90)])
trixels = geopandas.GeoSeries(trixels)
inside = trixels.explode(index_parts=True).reset_index(drop=True)
inside = inside.intersection(bbox)
inside = geopandas.tools.collect(inside)
outside = trixels.explode(index_parts=True).reset_index(drop=True)
outside = outside.difference(bbox)
outside = outside.apply(lambda x: shapely.affinity.translate(x, xoff=-360))
outside = geopandas.tools.collect(outside)
split = inside.union(outside)
return split
Usage#
[11]:
fig, ax = plt.subplots(dpi=100)
ax.grid(True)
ax.set_ylim(-90,90)
ax.set_xlim(-190,190)
cities.split_antimeridian(inplace=True)
cities.plot(ax=ax, column='name')
[11]:
<AxesSubplot:>
[12]:
fig, ax = plt.subplots(dpi=100)
ax.grid(True)
ax.set_ylim(-90, 90)
ax.set_xlim(-190, 190)
combined.split_antimeridian(inplace=True)
#combined.trixels.explode(index_parts=True).reset_index(drop=True)
combined.plot(ax=ax)
[12]:
<AxesSubplot:>
[13]:
cities.trixels[0].geoms[1].exterior.xy
[13]:
(array('d', [-170.26439000686852, -180.0, -180.0, -170.26439000686852]),
array('d', [29.999999603043193, 14.653891165651418, 32.667991191813314, 29.999999603043193]))
[14]:
cities = {'lat': [-50, 270, 80],
'lon': [60, -360, 270]}
cities = starepandas.STAREDataFrame(cities)
sids = starepandas.sids_from_xy(cities.lon, cities.lat, level=1)
cities.set_sids(sids, inplace=True)
#trixels = cities.make_trixels(wrap_lon=True, wrap_thresh=180)
trixels = cities.make_trixels(wrap_lon=False)
cities.set_trixels(trixels, inplace=True)
cities.split_antimeridian(inplace=True)
[15]:
fig, ax = plt.subplots(dpi=100)
ax.grid(True)
antimeridian = shapely.geometry.LineString([(180,-90), (180, 90)])
#ax.plot(*antimeridian.xy, color='red')
#ax.set_ylim(-90,90)
#ax.set_xlim(90,270)
cities.plot(ax=ax)
[15]:
<AxesSubplot:>
[ ]: