Some panorama datasets don’t offer full georeference information. For example, datasets obtained from indoor sensors or small hand-held devices typically don’t have that information.
This how-to explains how you can load, process, and visualize such panoramas.
Even though you have no georeference information, most datasets share some properties that you can rely on.
The positions in the dataset are defined in a local 3D Cartesian reference, expressed in meters. Although the origin of the reference on the earth is unknown, the Z-axis nearly always aligns with the gravitational up direction.
To map this reference to the earth, you can use a topocentric reference: attach the origin of the reference to a longitude-latitude-altitude anchor point. Then apply a rotation, typically around the Z-axis.
You have two options for placing your dataset on the earth, also known as geolocating your data:
At the back end, in LuciadFusion
At the front end, on the LuciadRIA client
Consider your use case to decide what the best option is for you.
In this scenario, we add a georeference when we load the data in LuciadFusion. The advantage of this approach is that you don’t need extra configuration on the client. The downside is that the location becomes permanent. You can change it only by re-processing the data.
You can use a traditional projected reference, such as the closest UTM zone, in combination with false easting and false northing.
The easiest way, though, is to specify a topocentric reference, either in Java code, or by loading the reference as Well-Known
Text (WKT) from a
ILcdModelReference modelReference = new TLcdTopocentricReference(datum, new TLcdLonLatHeightPoint(21.310094, 50.7143019, 275.0));
ENGCRS["MyTopocentric", GEOGCS["WGS 84", DATUM["WGS 84", ELLIPSOID[“WGS 84”,6378137,298.2572236,LENGTHUNIT[“metre”,1.0]]]], DERIVINGCONVERSION["MyPosition", METHOD["Geographic/topocentric conversions",AUTHORITY["EPSG",9837]], PARAMETER["Latitude of topocentric origin",50.7143019,UNIT["DEGREE",0.017453292519943295]], PARAMETER["Longitude of topocentric origin",21.310094,UNIT["DEGREE",0.017453292519943295]], PARAMETER["Ellipsoidal height of topocentric origin",275.0,UNIT["METER",1.0]]], CS[Cartesian,3], AXIS["Topocentric East (E)",EAST], AXIS["Topocentric North (N)",NORTH], AXIS["Topocentric height (U)",UP], UNIT["METER",1.0]]
In this scenario, we load, process, and serve the dataset in LuciadFusion without a georeference. We position the panoramas on the earth only when we load them in LuciadRIA. You gain flexibility with this approach, because you don’t need to know the location up front. You can even position the panoramas interactively, if you create a UI controller for that purpose.
Use a generic 3D Cartesian reference as model reference for your data, either through code, or through WKT from a
ILcdModelReference modelReference = new TLcdCartesianReference(METRE_UNIT, METRE_UNIT, METRE_UNIT);
LOCAL_CS["Generic Cartesian 3D", LOCAL_DATUM["Unknown",0], UNIT["m",1.0], AXIS["x",EAST], AXIS["y",NORTH], AXIS["z",UP]]
Even without the georeference, LuciadFusion loads, processes, and serves the data. You won’t be able to visualize anything in the preview map, though.
When you load the data in LuciadRIA, you must position the panoramas on the earth. Use
Affine3DTransformation.createTransformationFromGeoLocation to get a transformation that you can apply to the position while loading. Use a custom
Store for that.
The panoramas in the Luciad Panorama Format are oriented relative to the local reference. Because you are rotating the entire
reference on the client, you also need to apply the orientation to each individual panorama, using
PanoramaStyle.orientation. See the article How to visualize non-georeferenced panoramas in the LuciadRIA documentation for more information.