Create spheres at right location under the surface

151
2
Jump to solution
05-30-2019 02:52 PM
AdamThompson3
New Contributor III

Hello,

I have been trying to build something very similar to this WebMap https://developers.arcgis.com/javascript/latest/sample-code/sandbox/index.html?sample=scene-local  using my own data, I have gotten most of it to work for myself except extruding my points to the right location.. Here is what my code is producing;

The points are sort of half n half on the surface and below, where I would like them to be displayed is right at the bottom of the well.I cant use a general offset because all the bottom of the wells are different depths, if there is a way I could offset the points by grabbing the value in that depth column that would work, but I am still new to this JavaScript API. I have pretty much used the same code as the one in that scene just with different parameters. here is the code; 

Thank you for any help!

0 Kudos
1 Solution

Accepted Solutions
SaschaBrunnerCH
Esri Contributor

Hi Adam

Do your data have z-values?

If not you can set the elevation with an Arcade Expression see the help FeatureLayer-elevationInfo. Or see in the chapter "Feature Z" in arcade guide.

With the following codesnippet you can see the 3d-points below the ground with -1000 meters: 

          elevationInfo: {
mode: "relative-to-ground",
featureExpressionInfo: {
expression: "-1000"
}
},

full sample:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="initial-scale=1,maximum-scale=1,user-scalable=no"
/>
<title>Create a local scene - 4.11</title>
<style>
html,
body,
#viewDiv {
padding: 0;
margin: 0;
height: 100%;
width: 100%;
}

#homeDiv {
left: 15px;
top: 130px;
z-index: 35;
position: absolute;
}
</style>

<link
rel="stylesheet"
href="https://js.arcgis.com/4.11/esri/themes/light/main.css"
/>
<script src="https://js.arcgis.com/4.11/"></script>

<script>
require([
"esri/Map",
"esri/views/SceneView",
"esri/layers/FeatureLayer",
"esri/widgets/Home"
], function(Map, SceneView, FeatureLayer, Home) {
var quakesUrl =
"https://services.arcgis.com/V6ZHFr6zdgNZuVG0/arcgis/rest/services/ks_earthquakes_since_2000/FeatureServer/0";

// The clipping extent for the scene
var kansasExtent = {
// autocasts as new Extent()
xmax: -10834217,
xmin: -10932882,
ymax: 4493918,
ymin: 4432667,
spatialReference: {
// autocasts as new SpatialReference()
wkid: 3857
}
};

var quakesRenderer = {
type: "simple", // autocasts as new SimpleRenderer()
symbol: {
type: "point-3d", // autocasts as new PointSymbol3D()
symbolLayers: [
{
type: "object", // autocasts as new ObjectSymbol3DLayer()
resource: {
primitive: "sphere"
}
}
]
},
visualVariables: [
{
type: "size",
field: "mag",
axis: "all",
stops: [
{
value: 2,
size: 100
},
{
value: 5,
size: 2000
}
]
}
]
};

// Defines a layer for drawing the exact location of quakes below the surface
var quakesDepthLayer = new FeatureLayer({
url: quakesUrl,
// Show only quakes of magnitude 2.0 or higher
definitionExpression: "mag >= 2",
outFields: ["*"],
renderer: quakesRenderer,
returnZ: false,
elevationInfo: {
mode: "relative-to-ground",
featureExpressionInfo: {
expression: "-1000"
}
},

});

var map = new Map({
basemap: "topo",
layers: [
quakesDepthLayer
],
ground: {
navigationConstraint: {
type: "none"
}
}
});

var view = new SceneView({
container: "viewDiv",
map: map,
// Indicates to create a local scene
viewingMode: "local",
// Use the exent defined in clippingArea to define the bounds of the scene
clippingArea: kansasExtent,
extent: kansasExtent,
// Turns off atmosphere and stars settings
environment: {
atmosphere: null,
starsEnabled: false
}
});

});
</script>
</head>

<body>
<div id="viewDiv"></div>
</body>
</html>

View solution in original post

2 Replies
SaschaBrunnerCH
Esri Contributor

Hi Adam

Do your data have z-values?

If not you can set the elevation with an Arcade Expression see the help FeatureLayer-elevationInfo. Or see in the chapter "Feature Z" in arcade guide.

With the following codesnippet you can see the 3d-points below the ground with -1000 meters: 

          elevationInfo: {
mode: "relative-to-ground",
featureExpressionInfo: {
expression: "-1000"
}
},

full sample:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="initial-scale=1,maximum-scale=1,user-scalable=no"
/>
<title>Create a local scene - 4.11</title>
<style>
html,
body,
#viewDiv {
padding: 0;
margin: 0;
height: 100%;
width: 100%;
}

#homeDiv {
left: 15px;
top: 130px;
z-index: 35;
position: absolute;
}
</style>

<link
rel="stylesheet"
href="https://js.arcgis.com/4.11/esri/themes/light/main.css"
/>
<script src="https://js.arcgis.com/4.11/"></script>

<script>
require([
"esri/Map",
"esri/views/SceneView",
"esri/layers/FeatureLayer",
"esri/widgets/Home"
], function(Map, SceneView, FeatureLayer, Home) {
var quakesUrl =
"https://services.arcgis.com/V6ZHFr6zdgNZuVG0/arcgis/rest/services/ks_earthquakes_since_2000/FeatureServer/0";

// The clipping extent for the scene
var kansasExtent = {
// autocasts as new Extent()
xmax: -10834217,
xmin: -10932882,
ymax: 4493918,
ymin: 4432667,
spatialReference: {
// autocasts as new SpatialReference()
wkid: 3857
}
};

var quakesRenderer = {
type: "simple", // autocasts as new SimpleRenderer()
symbol: {
type: "point-3d", // autocasts as new PointSymbol3D()
symbolLayers: [
{
type: "object", // autocasts as new ObjectSymbol3DLayer()
resource: {
primitive: "sphere"
}
}
]
},
visualVariables: [
{
type: "size",
field: "mag",
axis: "all",
stops: [
{
value: 2,
size: 100
},
{
value: 5,
size: 2000
}
]
}
]
};

// Defines a layer for drawing the exact location of quakes below the surface
var quakesDepthLayer = new FeatureLayer({
url: quakesUrl,
// Show only quakes of magnitude 2.0 or higher
definitionExpression: "mag >= 2",
outFields: ["*"],
renderer: quakesRenderer,
returnZ: false,
elevationInfo: {
mode: "relative-to-ground",
featureExpressionInfo: {
expression: "-1000"
}
},

});

var map = new Map({
basemap: "topo",
layers: [
quakesDepthLayer
],
ground: {
navigationConstraint: {
type: "none"
}
}
});

var view = new SceneView({
container: "viewDiv",
map: map,
// Indicates to create a local scene
viewingMode: "local",
// Use the exent defined in clippingArea to define the bounds of the scene
clippingArea: kansasExtent,
extent: kansasExtent,
// Turns off atmosphere and stars settings
environment: {
atmosphere: null,
starsEnabled: false
}
});

});
</script>
</head>

<body>
<div id="viewDiv"></div>
</body>
</html>

View solution in original post

AdamThompson3
New Contributor III

Hey Sascha,

Thanks for the reply! That was exactly it with the "HasZ" property on my shapefile, bit of a silly mistake but when I displayed the points through arcmap in "Add XY Data" I had forget to include that z field, all is working well now

I just have a problem with authorization now, I have created a thread for this also https://community.esri.com/thread/234792-authentication-of-agol-layers-from-webmap 

should you have the time to take a look into the issue that would be greatly appreciated!

Thank you

0 Kudos