[Git][debian-gis-team/osgearth][upstream] New upstream version 2.9~rc2+dfsg
Sebastiaan Couwenberg
gitlab at salsa.debian.org
Thu Jan 25 08:50:43 UTC 2018
Sebastiaan Couwenberg pushed to branch upstream at Debian GIS Project / osgearth
Commits:
a78a7116 by Bas Couwenberg at 2018-01-25T07:32:15+01:00
New upstream version 2.9~rc2+dfsg
- - - - -
20 changed files:
- + docs/source/references/drivers/feature/mapnikvectortiles.rst
- docs/source/references/drivers/terrain/mp.rst
- docs/source/references/drivers/terrain/terrain_options_shared.rst
- docs/source/references/earthfile.rst
- src/applications/osgearth_tilesource/osgearth_tilesource.cpp
- src/osgEarth/ElevationPool.cpp
- src/osgEarth/TerrainLayer.cpp
- src/osgEarth/Units
- src/osgEarth/Version
- src/osgEarth/catch.hpp
- src/osgEarthDrivers/agglite/AGGLiteRasterizerTileSource.cpp
- src/osgEarthDrivers/engine_mp/MPEngine.NormalMap.vert.glsl
- src/osgEarthDrivers/engine_mp/MPEngine.vert.model.glsl
- src/osgEarthDrivers/engine_rex/RexEngine.NormalMap.vert.glsl
- src/osgEarthDrivers/fastdxt/CMakeLists.txt
- src/osgEarthSymbology/Color.cpp
- src/osgEarthSymbology/StyleSheet
- src/osgEarthSymbology/StyleSheet.cpp
- src/osgEarthUtil/MouseCoordsTool.cpp
- + tests/feature_mapnikvectortiles.earth
Changes:
=====================================
docs/source/references/drivers/feature/mapnikvectortiles.rst
=====================================
--- /dev/null
+++ b/docs/source/references/drivers/feature/mapnikvectortiles.rst
@@ -0,0 +1,22 @@
+Mapnik Vector Tiles
+===========================
+This plugin reads vector data from an `MBTiles`_ file which contains `vector tiles<https://github.com/mapbox/vector-tile-spec>`_.
+
+Note: This driver does not currently support multi-level mbtiles files. It will only load the maximum level in the database. This will change in the future when
+osgEarth has better support for non-additive feature datasources.
+
+This driver requires that you build osgEarth with SQLite3 support and Protobuf support.
+
+Example usage::
+
+ <model driver="feature_geom">
+ <features name="osm" driver="mapnikvectortiles">
+ <url>../data/osm.mbtiles</url>
+ </features>
+ ...
+
+Properties:
+
+ :url: Location of the mbtiles file.
+
+.. _MBTiles: https://www.mapbox.com/developers/mbtiles/
=====================================
docs/source/references/drivers/terrain/mp.rst
=====================================
--- a/docs/source/references/drivers/terrain/mp.rst
+++ b/docs/source/references/drivers/terrain/mp.rst
@@ -13,7 +13,7 @@ Example usage::
normalize_edges = "false"
incremental_update = "false"
quick_release_gl_objects = "true"
- min_tile_range_factor = "6.0"
+ min_tile_range_factor = "7.0"
cluster_culling = "true" />
Properties:
=====================================
docs/source/references/drivers/terrain/terrain_options_shared.rst
=====================================
--- a/docs/source/references/drivers/terrain/terrain_options_shared.rst
+++ b/docs/source/references/drivers/terrain/terrain_options_shared.rst
@@ -2,7 +2,7 @@ Common Properties:
:min_tile_range_factor: The "maximum visible distance" ratio for all tiles. The
maximum visible distance is computed as tile radius *
- this value. (default = 6.0)
+ this value. (default = 7.0)
:cluster_culling: Cluster culling discards back-facing tiles by default. You
can disable it be setting this to ``false``, for example if
you want to go underground and look up at the surface.
=====================================
docs/source/references/earthfile.rst
=====================================
--- a/docs/source/references/earthfile.rst
+++ b/docs/source/references/earthfile.rst
@@ -117,8 +117,8 @@ These options control the rendering of the terrain surface.
+-----------------------+--------------------------------------------------------------------+
| min_tile_range_factor | Determines how close you need to be to a terrain tile for it to |
| | display. The value is the ratio of a tile's extent to its |
-| | For example, if a tile has a 10km radius, and the MTRF=6, then the |
-| | tile will become visible at a range of about 60km. |
+| | For example, if a tile has a 10km radius, and the MTRF=7, then the |
+| | tile will become visible at a range of about 70km. |
+-----------------------+--------------------------------------------------------------------+
| min_lod | The lowest level of detail that the terrain is guaranteed to |
| | display, even if no source data is available at that LOD. The |
=====================================
src/applications/osgearth_tilesource/osgearth_tilesource.cpp
=====================================
--- a/src/applications/osgearth_tilesource/osgearth_tilesource.cpp
+++ b/src/applications/osgearth_tilesource/osgearth_tilesource.cpp
@@ -56,6 +56,7 @@ public:
// Constructor that takes the user-provided options.
CustomTileSource() : TileSource(TileSourceOptions())
{
+ // Create a shape that we will use to render tile images.
_geom = new Ring();
_geom->push_back( osg::Vec3(5, 5, 0) );
_geom->push_back( osg::Vec3(250, 5, 0) );
@@ -68,12 +69,25 @@ public:
{
if ( !getProfile() )
{
+ // Set the profile for this tile source. The profile defines the
+ // tiling scheme native to this tile source. The terrain engine will
+ // call createImage or createHeightField with TileKeys according to
+ // the profile you set here.
setProfile( Registry::instance()->getGlobalGeodeticProfile() );
+
+ // Create custom data extents. This is optional, but giving the terrain
+ // engine information about the extents of your dataset will improve
+ // performance in most cases. In this case, the data covers the
+ // entire profile, but we want to tell the terrain engine that this
+ // tile source only has data up to LOD 15:
+ getDataExtents().push_back(DataExtent(getProfile()->getExtent(), 0u, 15u));
}
return STATUS_OK;
}
// Tells the layer not to cache data from this tile source.
+ // Overriding this function is optional - by default it will inherit the
+ // caching policy from the Layer.
CachePolicy getCachePolicyHint(const Profile* profile) const
{
return CachePolicy::NO_CACHE;
@@ -94,18 +108,26 @@ public:
int main(int argc, char** argv)
{
osg::ArgumentParser arguments(&argc,argv);
-
osgViewer::Viewer viewer(arguments);
- // Start by creating the map:
- MapOptions mapOptions;
- mapOptions.cachePolicy() = CachePolicy::NO_CACHE;
- Map* map = new Map( mapOptions );
+ // Start by creating an empty map:
+ Map* map = new Map();
// Create out image layer with a custom tile source.
- ImageLayerOptions options( "custom" );
CustomTileSource* tileSource = new CustomTileSource();
- tileSource->open();
+
+ // Open the tile source. If you don't do this, the Map will automatically try to
+ // open it when you add the Layer later on. But doing so here allows us to check
+ // for any errors beforehand.
+ Status status = tileSource->open();
+ if (status.isError())
+ {
+ OE_WARN << "Error opening the tile source; message = " << status.message() << std::endl;
+ return -1;
+ }
+
+ // Add a new ImageLayer to the map with our custom tile source.
+ ImageLayerOptions options( "My custom ImageLayer" );
map->addLayer( new ImageLayer(options, tileSource) );
// That's it, the map is ready; now create a MapNode to render the Map:
=====================================
src/osgEarth/ElevationPool.cpp
=====================================
--- a/src/osgEarth/ElevationPool.cpp
+++ b/src/osgEarth/ElevationPool.cpp
@@ -307,7 +307,7 @@ ElevationPool::getTile(const TileKey& key, MapFrame& frame, osg::ref_ptr<Elevati
if ( !tile.valid() && OE_GET_TIMER(get) >= timeout )
{
// this means we timed out trying to fetch the map tile.
- OE_TEST << LC << "Timout fetching tile " << key.str() << std::endl;
+ OE_TEST << LC << "Timeout fetching tile " << key.str() << std::endl;
}
if ( tile.valid() )
=====================================
src/osgEarth/TerrainLayer.cpp
=====================================
--- a/src/osgEarth/TerrainLayer.cpp
+++ b/src/osgEarth/TerrainLayer.cpp
@@ -380,12 +380,8 @@ TerrainLayer::open()
}
else
{
- // User supplied the tile source, so attempt to get its profile:
- setProfile(_tileSource->getProfile() );
- if (!_profile.valid())
- {
- setStatus( Status::Error(getName(), "Cannot establish profile") );
- }
+ // User supplied the tile source, so attempt to initialize it:
+ _tileSource = createAndOpenTileSource();
}
// Finally, open and activate a caching bin for this layer if it
=====================================
src/osgEarth/Units
=====================================
--- a/src/osgEarth/Units
+++ b/src/osgEarth/Units
@@ -23,14 +23,6 @@
#include <osgEarth/Config>
#include <ostream>
-#define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
-
-#if GCC_VERSION >= 50300
-#define OPTIMIZE __attribute__((optimize("no-ipa-sra")))
-#else
-#define OPTIMIZE
-#endif
-
namespace osgEarth
{
class Registry;
@@ -113,7 +105,7 @@ namespace osgEarth
return false;
}
- static OPTIMIZE double convert( const Units& from, const Units& to, double input ) {
+ static double convert( const Units& from, const Units& to, double input ) {
double output = input;
convert( from, to, input, output );
return output;
=====================================
src/osgEarth/Version
=====================================
--- a/src/osgEarth/Version
+++ b/src/osgEarth/Version
@@ -31,7 +31,7 @@ extern "C" {
#define OSGEARTH_MINOR_VERSION 9
#define OSGEARTH_PATCH_VERSION 0
#define OSGEARTH_SOVERSION 0
-#define OSGEARTH_RC_VERSION 1
+#define OSGEARTH_RC_VERSION 2
#define OSGEARTH_DEVEL_VERSION 0 // 0 = release; >0 = interim devel version
/* Convenience macro that can be used to decide whether a feature is present or not i.e.
=====================================
src/osgEarth/catch.hpp
=====================================
--- a/src/osgEarth/catch.hpp
+++ b/src/osgEarth/catch.hpp
@@ -4751,7 +4751,7 @@ namespace Catch {
ss << seed;
ss >> config.rngSeed;
if( ss.fail() )
- throw std::runtime_error( "Argment to --rng-seed should be the word 'time' or a number" );
+ throw std::runtime_error( "Argument to --rng-seed should be the word 'time' or a number" );
}
}
inline void setVerbosity( ConfigData& config, int level ) {
=====================================
src/osgEarthDrivers/agglite/AGGLiteRasterizerTileSource.cpp
=====================================
--- a/src/osgEarthDrivers/agglite/AGGLiteRasterizerTileSource.cpp
+++ b/src/osgEarthDrivers/agglite/AGGLiteRasterizerTileSource.cpp
@@ -189,13 +189,21 @@ public:
if ( masterLine || f->get()->style()->has<LineSymbol>() )
{
- Feature* newFeature = new Feature( *f->get() );
- if ( !newFeature->getGeometry()->isLinear() )
+ // Use the GeometryIterator to get all the geometries so we can clone them as rings
+ GeometryIterator gi(f->get()->getGeometry());
+ while (gi.hasMore())
{
- newFeature->setGeometry( newFeature->getGeometry()->cloneAs(Geometry::TYPE_RING) );
+ Geometry* geom = gi.next();
+ // Create a new feature for each geometry
+ Feature* newFeature = new Feature(*f->get());
+ newFeature->setGeometry(geom);
+ if (!newFeature->getGeometry()->isLinear())
+ {
+ newFeature->setGeometry(newFeature->getGeometry()->cloneAs(Geometry::TYPE_RING));
+ }
+ lines.push_back( newFeature );
+ hasLine = true;
}
- lines.push_back( newFeature );
- hasLine = true;
}
// if there are no geometry symbols but there is a coverage symbol, default to polygons.
=====================================
src/osgEarthDrivers/engine_mp/MPEngine.NormalMap.vert.glsl
=====================================
--- a/src/osgEarthDrivers/engine_mp/MPEngine.NormalMap.vert.glsl
+++ b/src/osgEarthDrivers/engine_mp/MPEngine.NormalMap.vert.glsl
@@ -20,5 +20,5 @@ void oe_mp_NormalMap_vertex(inout vec4 unused)
oe_normalMapCoords = (oe_tile_normalTexMatrix * oe_layer_tilec).st;
// send the bi-normal vector to the fragment shader.
- oe_normalMapBinormal = gl_NormalMatrix * vec3(0,1,0);
+ oe_normalMapBinormal = normalize(gl_NormalMatrix * vec3(0,1,0));
}
=====================================
src/osgEarthDrivers/engine_mp/MPEngine.vert.model.glsl
=====================================
--- a/src/osgEarthDrivers/engine_mp/MPEngine.vert.model.glsl
+++ b/src/osgEarthDrivers/engine_mp/MPEngine.vert.model.glsl
@@ -17,7 +17,7 @@ void oe_mp_vertModel(inout vec4 vertexModel)
oe_layer_texc = gl_MultiTexCoord$MP_PRIMARY_UNIT;
oe_layer_tilec = gl_MultiTexCoord$MP_SECONDARY_UNIT;
- oe_UpVectorView = gl_NormalMatrix * oe_terrain_attr.xyz;
+ oe_UpVectorView = normalize(gl_NormalMatrix * oe_terrain_attr.xyz);
// internal variable to support the oe_terrain_getElevation() SDK method
// in the fragment shader stage
=====================================
src/osgEarthDrivers/engine_rex/RexEngine.NormalMap.vert.glsl
=====================================
--- a/src/osgEarthDrivers/engine_rex/RexEngine.NormalMap.vert.glsl
+++ b/src/osgEarthDrivers/engine_rex/RexEngine.NormalMap.vert.glsl
@@ -23,7 +23,7 @@ void oe_normalMapVertex(inout vec4 unused)
#endif
// calculate the sampling coordinates for the normal texture
-// oe_normalMapCoords = (oe_tile_normalTexMatrix * oe_layer_tilec).st;
+ //oe_normalMapCoords = (oe_tile_normalTexMatrix * oe_layer_tilec).st;
oe_normalMapCoords = oe_layer_tilec.st
* oe_tile_elevTexelCoeff.x * oe_tile_normalTexMatrix[0][0]
@@ -31,5 +31,5 @@ void oe_normalMapVertex(inout vec4 unused)
+ oe_tile_elevTexelCoeff.y;
// send the bi-normal to the fragment shader
- oe_normalMapBinormal = gl_NormalMatrix * vec3(0,1,0);
+ oe_normalMapBinormal = normalize(gl_NormalMatrix * vec3(0,1,0));
}
=====================================
src/osgEarthDrivers/fastdxt/CMakeLists.txt
=====================================
--- a/src/osgEarthDrivers/fastdxt/CMakeLists.txt
+++ b/src/osgEarthDrivers/fastdxt/CMakeLists.txt
@@ -1,4 +1,4 @@
-OPTION(OSGEARTH_ENABLE_FASTDXT "Set to ON to build optional FastDXT image compressor." ON)
+OPTION(OSGEARTH_ENABLE_FASTDXT "Set to ON to build optional FastDXT image compressor." OFF)
IF(OSGEARTH_ENABLE_FASTDXT)
OPTION(CURL_IS_STATIC "on if curl is a static lib " ON)
=====================================
src/osgEarthSymbology/Color.cpp
=====================================
--- a/src/osgEarthSymbology/Color.cpp
+++ b/src/osgEarthSymbology/Color.cpp
@@ -140,7 +140,7 @@ Color::Color( const std::string& input, Format format )
c.g() |= t[e+3]<='9' ? (t[e+3]-'0') : (10+(t[e+3]-'a'));
c.b() |= t[e+4]<='9' ? (t[e+4]-'0')<<4 : (10+(t[e+4]-'a'))<<4;
c.b() |= t[e+5]<='9' ? (t[e+5]-'0') : (10+(t[e+5]-'a'));
- if ( t.length() >= 8 ) {
+ if ( len >= 8 ) {
c.a() = 0;
c.a() |= t[e+6]<='9' ? (t[e+6]-'0')<<4 : (10+(t[e+6]-'a'))<<4;
c.a() |= t[e+7]<='9' ? (t[e+7]-'0') : (10+(t[e+7]-'a'));
=====================================
src/osgEarthSymbology/StyleSheet
=====================================
--- a/src/osgEarthSymbology/StyleSheet
+++ b/src/osgEarthSymbology/StyleSheet
@@ -56,6 +56,10 @@ namespace osgEarth { namespace Symbology
/** Constructs a new style sheet */
StyleSheet( const Config& conf );
+ /** Optional name of the style sheet */
+ optional<std::string>& name() { return _name; }
+ const optional<std::string>& name() const { return _name; }
+
/** Gets the context for relative path resolution */
const URIContext& uriContext() const { return _uriContext; }
@@ -103,6 +107,7 @@ namespace osgEarth { namespace Symbology
virtual void mergeConfig( const Config& conf );
protected:
+ optional<std::string> _name;
URIContext _uriContext;
osg::ref_ptr<ScriptDef> _script;
StyleSelectorList _selectors;
=====================================
src/osgEarthSymbology/StyleSheet.cpp
=====================================
--- a/src/osgEarthSymbology/StyleSheet.cpp
+++ b/src/osgEarthSymbology/StyleSheet.cpp
@@ -178,6 +178,7 @@ Config
StyleSheet::getConfig() const
{
Config conf;
+ conf.set("name", _name);
for( StyleSelectorList::const_iterator i = _selectors.begin(); i != _selectors.end(); ++i )
{
@@ -226,6 +227,8 @@ StyleSheet::getConfig() const
void
StyleSheet::mergeConfig( const Config& conf )
{
+ conf.getIfSet("name", _name);
+
_uriContext = URIContext( conf.referrer() );
// read in any resource library references
=====================================
src/osgEarthUtil/MouseCoordsTool.cpp
=====================================
--- a/src/osgEarthUtil/MouseCoordsTool.cpp
+++ b/src/osgEarthUtil/MouseCoordsTool.cpp
@@ -67,25 +67,6 @@ MouseCoordsTool::handle( const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapt
for( Callbacks::iterator i = _callbacks.begin(); i != _callbacks.end(); ++i )
i->get()->reset( aa.asView(), _mapNode );
}
-
-#if 1 // testing AGL, Dist to Point
- osg::Vec3d eye, center, up;
- aa.asView()->getCamera()->getViewMatrixAsLookAt(eye, center, up);
- osgUtil::LineSegmentIntersector* lsi = new osgUtil::LineSegmentIntersector(eye, osg::Vec3d(0,0,0));
- osgUtil::IntersectionVisitor iv(lsi);
- lsi->setIntersectionLimit(lsi->LIMIT_NEAREST);
- //iv.setUserData( new Map() );
- _mapNode->accept(iv);
-
- if ( !lsi->getIntersections().empty() )
- {
- double agl = (eye - lsi->getFirstIntersection().getWorldIntersectPoint()).length();
- double dtp = (eye - world).length();
- //OE_NOTICE << "AGL = " << agl << "m; DPT = " << dtp << "m" << std::endl;
- Registry::instance()->startActivity("AGL", Stringify() << agl << " m");
- Registry::instance()->startActivity("Range", Stringify() << dtp << " m");
- }
-#endif
}
return false;
@@ -97,14 +78,7 @@ MouseCoordsLabelCallback::MouseCoordsLabelCallback( LabelControl* label, Formatt
_label ( label ),
_formatter( formatter )
{
-#if 0
- if ( !formatter )
- {
- LatLongFormatter* formatter = new LatLongFormatter( LatLongFormatter::FORMAT_DECIMAL_DEGREES );
- formatter->setPrecision( 5 );
- _formatter = formatter;
- }
-#endif
+ //nop
}
void
@@ -139,6 +113,7 @@ MouseCoordsLabelCallback::reset( osg::View* view, MapNode* mapNode )
if ( _label.valid() )
{
_label->setText( "" );
+ _label->setText(Stringify() << "No data | " << mapNode->getMapSRS()->getName() );
}
}
=====================================
tests/feature_mapnikvectortiles.earth
=====================================
--- /dev/null
+++ b/tests/feature_mapnikvectortiles.earth
@@ -0,0 +1,221 @@
+<!--
+osgEarth Sample - Feature Mapnik Vector Tiles
+
+This example shows how to load a local mbtiles file that contains vector tiles.
+
+You must have the mapnik vector tiles driver built by including the protobuf libraries in cmake.
+
+For reference, the honolulu.mbtiles file was generated using the extract at https://mapzen.com/data/metro-extracts/metro/honolulu_hawaii/
+
+This was the command line used:
+
+osmium export -f geojsonseq --config=config.json honolulu_hawaii.osm.pbf | tippecanoe -f -pf -pk -ps -Z14 -z14 -d12 --no-tile-stats -b0 -l osm -n honolulu -o honolulu.mbtiles
+
+config.json was:
+{
+ "attributes": {
+ "type": false,
+ "id": false,
+ "version": false,
+ "changeset": false,
+ "timestamp": false,
+ "uid": false,
+ "user": false,
+ "way_nodes": false
+ },
+ "linear_tags": ["highway", "barrier", "natural=coastline"],
+ "area_tags": ["aeroway", "amenity", "building", "landuse", "leisure", "man_made", "natural!=coastline"],
+ "exclude_tags": ["created_by", "source", "source:*"],
+ "include_tags": []
+}
+-->
+<map type="geocentric" version="2">
+
+ <feature_model name="osm">
+
+ <features name="osm" driver="mapnikvectortiles">
+ <url>../data/honolulu.mbtiles</url>
+ </features>
+
+ <instancing>true</instancing>
+
+ <feature_indexing enabled="false"></feature_indexing>
+
+ <styles>
+
+ <library name="us_resources">
+ <url>../data/resources/textures_us/catalog.xml</url>
+ </library>
+
+ <style type="text/css">
+ hospital {
+ icon: "../data/hospital.png";
+ icon-align: center-center;
+ icon-declutter: true;
+ text-content: getName();
+ altitude-clamping: terrain;
+ }
+
+ school {
+ icon: "../data/school.png";
+ icon-align: center-center;
+ icon-declutter: true;
+ text-content: getName();
+ altitude-clamping: terrain;
+ }
+
+ bank {
+ icon: "../data/bank.png";
+ icon-align: center-center;
+ icon-declutter: true;
+ text-content: getName();
+ altitude-clamping: terrain;
+ }
+
+ forest {
+ model: "../data/tree.ive";
+ model-placement: random;
+ model-density: 10000;
+ model-scale: 2.5;
+ model-random-seed: 1;
+ altitude-clamping: terrain;
+ }
+
+ grass {
+ model: "../data/tree.ive";
+ model-placement: random;
+ model-density: 10000;
+ model-scale: 2.5;
+ model-random-seed: 1;
+ altitude-clamping: terrain;
+ }
+
+ water {
+ fill: #6BA8FF;
+ render-depth-test: false;
+ altitude-clamping: terrain-drape;
+ }
+
+ buildings {
+ extrusion-height: getBuildingHeight();
+ extrusion-flatten: true;
+ extrusion-wall-style: building-wall;
+ extrusion-roof-style: building-rooftop;
+ altitude-clamping: terrain;
+ }
+
+ building-wall {
+ skin-library: us_resources;
+ skin-tags: building;
+ skin-random-seed: 1;
+ fill: #ffffff;
+ }
+ building-rooftop {
+ skin-library: us_resources;
+ skin-tags: rooftop;
+ skin-tiled: true;
+ skin-random-seed: 1;
+ fill: #ffffff;
+ }
+
+ </style>
+
+ <selector name="default" style_expr="selectStyle()"/>
+
+ <script language="javascript">
+ <![CDATA[
+
+ function selectStyle() {
+ if ("building" in feature.properties) {
+ return "buildings";
+ }
+ else if ("landuse" in feature.properties) {
+ var landuse = feature.properties["landuse"];
+ if ( landuse == "forest" ||
+ landuse == "grass" ||
+ landuse == "meadow"
+ ) {
+ return "forest";
+ }
+ else if (landuse == "reservoir") {
+ return "water";
+ }
+ }
+ else if ("natural" in feature.properties) {
+ var natural = feature.properties["natural"];
+ if (natural == "wood" || natural == "tree") {
+ return "forest"
+ }
+ else if (natural == "water") {
+ return "water";
+ }
+ }
+ else if ("surface" in feature.properties) {
+ var surface = feature.properties["surface"];
+ if (surface == "grass") {
+ return "grass";
+ }
+ }
+ else if ("amenity" in feature.properties) {
+ var amenity = feature.properties["amenity"];
+ if (amenity == "hospital") {
+ return "hospital";
+ }
+ else if (amenity == "school") {
+ return "school";
+ }
+ else if (amenity == "bank") {
+ return "bank";
+ }
+ }
+ return null;
+ }
+
+ function getName() {
+ if ("name" in feature.properties) {
+ return feature.properties["name"];
+ }
+ return "";
+ }
+
+ function getBuildingHeight() {
+ if ("height" in feature.properties) {
+ var h = feature.properties["height"].replace('m','');
+ return Math.max(h, 4.0);
+ } else if ("building:height" in feature.properties) {
+ var h = feature.properties["building:height"].replace('m','');
+ return Math.max(h, 4.0);
+ } else if ("building:levels" in feature.properties){
+ var l = feature.properties["building:levels"];
+ return Math.max(l * 4.0, 4.0);
+ }
+ return Math.floor((Math.random() * 5.0) + 4.0);
+ }
+ ]]>
+ </script>
+
+ </styles>
+ </feature_model>
+
+ <image name="esri imagery" driver="arcgis">
+ <url>http://server.arcgisonline.com/ArcGIS/rest/services/ESRI_Imagery_World_2D/MapServer</url>
+ <nodata_image>http://server.arcgisonline.com/ArcGIS/rest/services/ESRI_Imagery_World_2D/MapServer/tile/100/0/0.jpeg</nodata_image>
+ </image>
+
+ <elevation name="readymap_elevation" driver="tms">
+ <url>http://readymap.org/readymap/tiles/1.0.0/116/</url>
+ </elevation>
+
+ <viewpoints>
+ <viewpoint>
+ <name>Honolulu</name>
+ <heading>-22.7465</heading>
+ <pitch>-5.28948</pitch>
+ <range>7310.49m</range>
+ <long>-157.8255773676917</long>
+ <lat>21.28116313649227</lat>
+ <height>10.88873224053532</height>
+ </viewpoint>
+ </viewpoints>
+
+</map>
View it on GitLab: https://salsa.debian.org/debian-gis-team/osgearth/commit/a78a71164dc50200431f38849e532c8b5e780990
---
View it on GitLab: https://salsa.debian.org/debian-gis-team/osgearth/commit/a78a71164dc50200431f38849e532c8b5e780990
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.alioth.debian.org/pipermail/pkg-grass-devel/attachments/20180125/506dfa26/attachment-0001.html>
More information about the Pkg-grass-devel
mailing list