Comments (2)
@FrissAnalytics thanks for your suggestion.
I think it's a nice addition in any case. So I've added a new method that facilitates this: getScreenCoords
.
It receives spherical coordinates (lat, lng, ?alt)
and returns the viewport coordinates of where that location is rendered on the screen.
The method is quite similar to the one you use above. It first converts to cartesian coordinates and then projects them via the camera to retrieve the screen position.
Thanks again for the nice idea. 😉
from globe.gl.
hi again!
my bad, I now realize that to use the camera one needs to say: myGlobe.camera()
, instead of myGlobe.camera
!
For those still interested in x
, y
screen coordinates for e.g. a label that gets clicked, you can get the coordinates as follows (assuming we have setup a globe myGlobe
, and have some label data stored in places
, that holds the lat, long data etc.) (see examples in this repo):
// get the globe and setup some label data
myGlobe
.labelsData(places)
.labelLat(d => d.properties.latitude)
.labelLng(d => d.properties.longitude)
.labelText(d => d.properties.name)
.onLabelClick(d => {
// on label click, extract the __threeObj object from `d`, clone it (otherwise the original data gets overwritten!), and get the position
const position = d.__threeObj.__data.__threeObj.clone().position;
// use the project method and pass it the camera to get the device independent coordinates i.e. x,y,z coordinates between -1 and 1;
// note that if the camera position changes, these coordinates change as well!
const coordinates = position.project(myGlobe.camera())
// next, scale these coordinates in relation to the available canvas size
// grab the canvas that holds the globe e.g. using d3
const canvas = d3.select("#globeViz").select("canvas");
// get the width and height
const width = canvas.attr("width");
const height = canvas.attr("height");
// scale the x, y coordinates from range -1,1 to the available width and height
const x = Math.round((0.5 + coordinates.x / 2) * (width / window.devicePixelRatio));
const y = Math.round((0.5 - coordinates.y / 2) * (height / window.devicePixelRatio));
// the actual x,y coordinates in relation to the canvas
// these can be used to e.g. create annotations via an overlay div
// note we need these x,y coordinates to attach the annotation in the overlay div
// to the data point on the globe e.g. via a line (see screenshot above)
console.log("screen coordinates - x:", x, " y:", y);
})
@vasturiano I guess it would still be handy for others to add a method that makes it easier to get these coordinates, assuming some would like to create annotations as I did. Anyways, great library, really loving it! :-)
from globe.gl.
Related Issues (20)
- THREE.WebGLRenderer : useLegacyLights depreciated HOT 5
- Polygons are not filling the shape of the Antarctic continent HOT 1
- Trigger polygon hover event for one of the polygons programmatically HOT 2
- Atmosphere renders above globe every 2nd rotation
- How to make only the earth rotate without the background rotating? HOT 4
- onZoom method is called even without touching the globe and triggers all events on htmlElement elements HOT 1
- How to align custom layer objects on arcs and paths? HOT 1
- Ability to adjust the map on window resize event HOT 4
- Update points dynamically HOT 2
- Attempted Import Error HOT 2
- resumeAnimation causes globe to spin very fast (catch up with missed autoRotation) HOT 2
- Is there a way to get a political map on the globe?
- Is there a way to set .scene-container to width/height of 100vw/100vh? HOT 4
- use html element click event will trigger onPolygonClick event
- Overlapping marker spiderfier for globes
- Screen scroll while scrolling on map.
- how to use objectThreeObject to render different glb model?
- Hex Bin Layer unable to access properties HOT 1
- Hexed polygon layer miscalculates antarctica
- Callback function to invoke after all globe elements are initialized and visible on the scene? HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from globe.gl.