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:>
../../_images/examples_notebooks_split_antimeridian_6_1.png

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:>
../../_images/examples_notebooks_split_antimeridian_14_1.png
[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:>
../../_images/examples_notebooks_split_antimeridian_15_1.png
[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:>
../../_images/examples_notebooks_split_antimeridian_18_1.png
[ ]: