One interesting feature of the globe is that you can add 3D extrusions. In particular, we will show you how to add a sphere to your globe.
We’ll add another new fragment, HelloSphereFragment.java.
Inside of insertSpheres, we are going to add four spheres, each with a different location and size.
package com.mousebirdconsulting.helloearth;
import com.mousebird.maply.BaseController;
import com.mousebird.maply.ComponentObject;
import com.mousebird.maply.Point2d;
import com.mousebird.maply.Shape;
import com.mousebird.maply.ShapeInfo;
import com.mousebird.maply.ShapeSphere;
import java.util.ArrayList;
import java.util.List;
public class HelloSphereFragment extends HelloGlobeFragment {
@Override
protected void controlHasStarted() {
super.controlHasStarted();
insertSpheres();
}
private void insertSpheres() {
List<Shape> shapes = new ArrayList<>();
// Kansas City
ShapeSphere shape = new ShapeSphere();
shape.setLoc(Point2d.FromDegrees(-94.58, 39.1));
shape.setRadius(0.04f); // 1.0 is the radius of the Earth
shapes.add(shape);
// Washington D.C.
shape = new ShapeSphere();
shape.setLoc(Point2d.FromDegrees(-77.036667, 38.895111));
shape.setRadius(0.1f);
shapes.add(shape);
// McMurdo Station
shape = new ShapeSphere();
shape.setLoc(Point2d.FromDegrees(166.666667, -77.85));
shape.setRadius(0.2f);
shapes.add(shape);
// Windhoek
shape = new ShapeSphere();
shape.setLoc(Point2d.FromDegrees(17.083611, -22.57));
shape.setRadius(0.08f);
shapes.add(shape);
ShapeInfo shapeInfo = new ShapeInfo();
shapeInfo.setColor(0.7f, 0.2f, 0.7f, 0.8f); // R,G,B,A - values [0.0 => 1.0]
shapeInfo.setDrawPriority(1000000);
ComponentObject co = globeControl.addShapes(shapes, shapeInfo, BaseController.ThreadMode.ThreadAny);
double latitude = 40 * Math.PI / 180;
double longitude = -100 * Math.PI / 180;
double zoom_earth_radius = 1.0;
globeControl.animatePositionGeo(longitude, latitude, zoom_earth_radius, 1.0);
}
}
Once again, reference the new fragment:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/relativeLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<fragment
android:id="@+id/fragment"
android:name="com.mousebirdconsulting.helloearth.HelloSphereFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toTopOf="parent"
app:layout_constraintEnd_toStartOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Now you will see that these spheres are placed on the globe and extrude above the surface of the globe.

The radius is a floating point value whose units are Earth radii. That is, 1.0 is the radius of the Earth.
The location of the sphere is determined by setLoc, and this takes a Point2d object. You can easily convert a WGS84 (longitude, latitude) coordinate with the convenice function Point2d.FromDegrees.
The styling of the the shape is done with the ShapeInfo object. This works similarly to MarkerInfo and LabelInfo. The color is set by 4 floating point values [0.0 => 1.0]. These are your red, green, blue, and alpha (transparency) values, respectively.
As before, when you add a sphere to your controller, you are given a ComponentObject from which you can enable, disable, and remove your sphere from the globe.
Tutorial by Nicholas Hallahan, Steve Gifford, Tim Sylvester.