Examples¶
This section lists some examples using cesiumpy
and other packages. You
can find Jupyter Notebook
of these exampless under GitHub
repository
(maps are not rendered on GitHub
. Download an run them on local).
Use with pandas¶
Following example shows retrieving “US National Parks” data from Wikipedia, then plot number of visitors on the map.
First, load data from Wikipedia using pd.read_html
functionality. The data
contains latitude and longitude as text, thus some preprocessing is required.
>>> import pandas as pd
>>> url = "https://en.wikipedia.org/wiki/List_of_national_parks_of_the_United_States"
>>> df = pd.read_html(url, header=0)[0]
>>> locations = df['Location'].str.extract(u'(\D+) (\d+°\d+′[NS]) (\d+°\d+′[WE]).*')
>>> locations.columns = ['State', 'lat', 'lon']
>>> locations['lat'] = locations['lat'].str.replace(u'°', '.')
>>> locations['lon'] = locations['lon'].str.replace(u'°', '.')
>>> locations.loc[locations['lat'].str.endswith('S'), 'lat'] = '-' + locations['lat']
>>> locations.loc[locations['lon'].str.endswith('W'), 'lon'] = '-' + locations['lon']
>>> locations['lat'] = locations['lat'].str.slice_replace(start=-2)
>>> locations['lon'] = locations['lon'].str.slice_replace(start=-2)
>>> locations[['lat', 'lon']] = locations[['lat', 'lon']].astype(float)
>>> locations.head()
State lat lon
0 Maine 44.21 -68.13
1 American Samoa -14.15 -170.41
2 Utah 38.41 -109.34
3 South Dakota 43.45 -102.30
4 Texas 29.15 -103.15
>>> df = pd.concat([df, locations], axis=1)
Once prepared the data, iterate over rows and plot its values. The below script adds
cesiumpy.Cylinder
which height is corresponding to the number of visitors.
>>> import cesiumpy
>>> options = dict(animation=True, baseLayerPicker=False, fullscreenButton=False,
... geocoder=False, homeButton=False, infoBox=False, sceneModePicker=True,
... selectionIndicator=False, navigationHelpButton=False,
... timeline=False, navigationInstructionsInitiallyVisible=False)
>>> v = cesiumpy.Viewer(**options)
>>> for i, row in df.iterrows():
... l = row['Recreation Visitors (2014)[5]']
... cyl = cesiumpy.Cylinder(position=[row['lon'], row['lat'], l / 2.], length=l,
... topRadius=10e4, bottomRadius=10e4, material='aqua', alpha=0.5)
... v.entities.add(cyl)
>>> v
If you want bubble chart like output, use Point
entities.
>>> v = cesiumpy.Viewer(**options)
>>> for i, row in df.iterrows():
... l = row['Recreation Visitors (2014)[5]']
... p= cesiumpy.Point(position=[row['lon'], row['lat'], 0],
... pixelSize=np.sqrt(l / 10000), color='blue')
>>> v.entities.add(p)
>>> v
Using Billboard
with Pin
points the locations of National Parks.
>>> v = cesiumpy.Viewer(**options)
>>> pin = cesiumpy.Pin()
>>> for i, row in df.iterrows():
... b = cesiumpy.Billboard(position=[row['lon'], row['lat'], 0], image = pin, scale=0.4)
>>> v.entities.add(b)
>>> v
Use with shapely / geopandas¶
Following example shows how to handle geojson
files using shapely
, geopandas
and cesiumpy
.
First, read geojson
file of US, California using geopandas
function.
The content will be shapely
instance.
>>> import geopandas as gpd
>>> df = gpd.read_file('ca.json')
>>> df.head()
fips geometry id name
0 06 POLYGON ((-123.233256 42.006186, -122.378853 4... USA-CA California
>>> g = df.loc[0, "geometry"]
>>> type(g)
shapely.geometry.polygon.Polygon
We can use this shapely
instance to specify the shape of cesiumpy
instances.
The below script adds cesiumpy.Wall
which has the shape of California.
>>> import cesiumpy
>>> options = dict(animation=True, baseLayerPicker=False, fullscreenButton=False,
... geocoder=False, homeButton=False, infoBox=False, sceneModePicker=True,
... selectionIndicator=False, navigationHelpButton=False,
... timeline=False, navigationInstructionsInitiallyVisible=False)
>>> v = cesiumpy.Viewer(**options)
>>> v.entities.add(cesiumpy.Wall(positions=g,
... maximumHeights=10e5, minimumHeights=0,
... material=cesiumpy.color.RED))
>>> v
Use with scipy¶
cesiumpy
has spatial
submodule which offers functionality like scipy.spatial
. These function
requires scipy
and shapely
installed.
Following example shows Voronoi diagram using cesiumpy
. First, prepare a list contains the geolocations of Japanese Prefectual goverments.
>>> import cesiumpy
>>> options = dict(animation=True, baseLayerPicker=False, fullscreenButton=False,
... geocoder=False, homeButton=False, infoBox=False, sceneModePicker=True,
... selectionIndicator=False, navigationHelpButton=False,
... timeline=False, navigationInstructionsInitiallyVisible=False)
>>> points = [[140.446793, 36.341813],
... [139.883565, 36.565725],
... [139.060156, 36.391208],
... [139.648933, 35.857428],
... [140.123308, 35.605058],
... [139.691704, 35.689521],
... [139.642514, 35.447753]]
Then, you can create cesiumpy.spatial.Voronoi
instance passing points
. Using get_polygons
method returns the list
of cesiumpy.Polygon
instances. Each Polygon
represents the region corresponding to the point.
>>> vor = cesiumpy.spatial.Voronoi(points)
>>> polygons = vor.get_polygons()
>>> polygons[0]
Polygon([140.70970652380953, 35.78698294268851, 140.06610971077615, 36.06956523268194, 140.03367654609778, 36.1229878712242, 140.27531919409412, 36.730815523809525, 140.70970652380953, 36.730815523809525, 140.70970652380953, 35.78698294268851])
>>> v = cesiumpy.Viewer(**options)
>>> colors = [cesiumpy.color.RED, cesiumpy.color.BLUE, cesiumpy.color.GREEN,
... cesiumpy.color.ORANGE, cesiumpy.color.PURPLE, cesiumpy.color.AQUA,
... cesiumpy.color.YELLOW]
>>> for p, pol, c in zip(points, polygons, colors):
... b = cesiumpy.Point(position=(p[0], p[1], 0), color=c)
... v.entities.add(b)
... pol.material = c.set_alpha(0.5)
... pol.outline = True
... v.entities.add(pol)
>>> v.camera.flyTo((139.8, 36, 3e5))
>>> v
Next example shows to draw convex using cesiumpy
. You can use cesiumpy.spatial.ConvexHull
class, then use get_polyline
method to get the cesiumpy.Polyline
instances. Polyline
contains the coordinates of convex.
>>> conv = cesiumpy.spatial.ConvexHull(points)
>>> polyline = conv.get_polyline()
>>> polyline
Polyline([139.060156, 36.391208, 139.642514, 35.447753, 140.123308, 35.605058, 140.446793, 36.341813, 139.883565, 36.565725, 139.060156, 36.391208])
>>> v = cesiumpy.Viewer(**options)
>>> v.entities.add(polyline)
>>> v.camera.flyTo((139.8, 36, 3e5))
>>> v