Comments (5)
This is a bit tricky to do in a true and correct fashion, as leaflet-arrowheads calculates arrowheads based on latlng
s, and leaflet.curve creates its curved from svg bezier functions.
However, after toying around for a bit with it, I see that leaflet.curve offers a .trace
function, which returns latlng
values at specified intervals along the bezier curves. Using this, you can create a ghost polyline, apply arrowheads to it, extract the arrowheads, and remove the ghost:
const latlngs = pathThree.trace([0,0.1,0.2,0.3,0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1])
const ghost = L.polyline(latlngs).arrowheads({color:'orange'}).addTo(map)
const arrowheads = ghost.getArrowheads()
ghost.remove()
arrowheads.addTo(map)
Working codesandbox
This is not.a perfect solution, as .trace
applies the trace equally to all segments of your shape, which probably will not give you evenly spaced arrowheads. Also, using a frequency
other than the default (every vertex), will place arrowheads not on the line itself. It works, but you have limitations.
I'm not clear on what you mean when you say:
The problem with straight lines is that if you have two polylines
A -> B B -> A
One of the path would be overlapped
Trying to make leaflet-arrowheads work properly with leaflet.curve would require a total rewrite based on svg, which I don't think I'm going to do. However, depending on your needs, using the .trace
method to create a ghost polyline and keeping just its arrowheads may work just fine.
from leaflet-arrowheads.
Great thank you for this, it works like a charm!
The problem with straight lines is that if you have two polylines
A -> B B -> A
One of the path would be overlapped
what i meant was that having two straight polyline A -> B and B <- A would results in complete overlapping of the two.
I used svg to creates a curve to avoid that! That's something reasonable for example in flight path to simulate travel.
again thank you!
from leaflet-arrowheads.
Ah, I see what you're saying. You're using bezier curves to differentiate between the coming and going vectors. And you want the arrowheads in opposite directions along each curve for a nice visual. Makes sense. Well for a relatively simple curve like a flight path, I think the .trace
method will work well for you. Glad I could help.
from leaflet-arrowheads.
This is a bit tricky to do in a true and correct fashion, as leaflet-arrowheads calculates arrowheads based on
latlng
s, and leaflet.curve creates its curved from svg bezier functions.However, after toying around for a bit with it, I see that leaflet.curve offers a
.trace
function, which returnslatlng
values at specified intervals along the bezier curves. Using this, you can create a ghost polyline, apply arrowheads to it, extract the arrowheads, and remove the ghost:const latlngs = pathThree.trace([0,0.1,0.2,0.3,0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]) const ghost = L.polyline(latlngs).arrowheads({color:'orange'}).addTo(map) const arrowheads = ghost.getArrowheads() ghost.remove() arrowheads.addTo(map)Working codesandbox
This is not.a perfect solution, as
.trace
applies the trace equally to all segments of your shape, which probably will not give you evenly spaced arrowheads. Also, using afrequency
other than the default (every vertex), will place arrowheads not on the line itself. It works, but you have limitations.I'm not clear on what you mean when you say:
The problem with straight lines is that if you have two polylines
A -> B B -> A
One of the path would be overlappedTrying to make leaflet-arrowheads work properly with leaflet.curve would require a total rewrite based on svg, which I don't think I'm going to do. However, depending on your needs, using the
.trace
method to create a ghost polyline and keeping just its arrowheads may work just fine.
This is a bit tricky to do in a true and correct fashion, as leaflet-arrowheads calculates arrowheads based on
latlng
s, and leaflet.curve creates its curved from svg bezier functions.However, after toying around for a bit with it, I see that leaflet.curve offers a
.trace
function, which returnslatlng
values at specified intervals along the bezier curves. Using this, you can create a ghost polyline, apply arrowheads to it, extract the arrowheads, and remove the ghost:const latlngs = pathThree.trace([0,0.1,0.2,0.3,0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]) const ghost = L.polyline(latlngs).arrowheads({color:'orange'}).addTo(map) const arrowheads = ghost.getArrowheads() ghost.remove() arrowheads.addTo(map)Working codesandbox
This is not.a perfect solution, as
.trace
applies the trace equally to all segments of your shape, which probably will not give you evenly spaced arrowheads. Also, using afrequency
other than the default (every vertex), will place arrowheads not on the line itself. It works, but you have limitations.I'm not clear on what you mean when you say:
The problem with straight lines is that if you have two polylines
A -> B B -> A
One of the path would be overlappedTrying to make leaflet-arrowheads work properly with leaflet.curve would require a total rewrite based on svg, which I don't think I'm going to do. However, depending on your needs, using the
.trace
method to create a ghost polyline and keeping just its arrowheads may work just fine.
Not a perfect solution as the arrowheads do not resize on zoom. Also, their positions go wrong on zoom.
from leaflet-arrowheads.
This is a bit tricky to do in a true and correct fashion, as leaflet-arrowheads calculates arrowheads based on
latlng
s, and leaflet.curve creates its curved from svg bezier functions.
However, after toying around for a bit with it, I see that leaflet.curve offers a.trace
function, which returnslatlng
values at specified intervals along the bezier curves. Using this, you can create a ghost polyline, apply arrowheads to it, extract the arrowheads, and remove the ghost:const latlngs = pathThree.trace([0,0.1,0.2,0.3,0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]) const ghost = L.polyline(latlngs).arrowheads({color:'orange'}).addTo(map) const arrowheads = ghost.getArrowheads() ghost.remove() arrowheads.addTo(map)Working codesandbox
This is not.a perfect solution, as
.trace
applies the trace equally to all segments of your shape, which probably will not give you evenly spaced arrowheads. Also, using afrequency
other than the default (every vertex), will place arrowheads not on the line itself. It works, but you have limitations.
I'm not clear on what you mean when you say:The problem with straight lines is that if you have two polylines
A -> B B -> A
One of the path would be overlappedTrying to make leaflet-arrowheads work properly with leaflet.curve would require a total rewrite based on svg, which I don't think I'm going to do. However, depending on your needs, using the
.trace
method to create a ghost polyline and keeping just its arrowheads may work just fine.This is a bit tricky to do in a true and correct fashion, as leaflet-arrowheads calculates arrowheads based on
latlng
s, and leaflet.curve creates its curved from svg bezier functions.
However, after toying around for a bit with it, I see that leaflet.curve offers a.trace
function, which returnslatlng
values at specified intervals along the bezier curves. Using this, you can create a ghost polyline, apply arrowheads to it, extract the arrowheads, and remove the ghost:const latlngs = pathThree.trace([0,0.1,0.2,0.3,0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]) const ghost = L.polyline(latlngs).arrowheads({color:'orange'}).addTo(map) const arrowheads = ghost.getArrowheads() ghost.remove() arrowheads.addTo(map)Working codesandbox
This is not.a perfect solution, as
.trace
applies the trace equally to all segments of your shape, which probably will not give you evenly spaced arrowheads. Also, using afrequency
other than the default (every vertex), will place arrowheads not on the line itself. It works, but you have limitations.
I'm not clear on what you mean when you say:The problem with straight lines is that if you have two polylines
A -> B B -> A
One of the path would be overlappedTrying to make leaflet-arrowheads work properly with leaflet.curve would require a total rewrite based on svg, which I don't think I'm going to do. However, depending on your needs, using the
.trace
method to create a ghost polyline and keeping just its arrowheads may work just fine.![]()
Not a perfect solution as the arrowheads do not resize on zoom. Also, their positions go wrong on zoom.
I adjusted the sandbox so that the arrowheads are redrawn on moveend, so it looks nice now. Here's the crucial code:
let arrowheads;
const drawArrowheads = () => {
if (arrowheads) {
arrowheads.remove();
}
const ghost = L.polyline(latlngs)
.arrowheads({ color: "orange", size: "15000m" })
.addTo(map);
arrowheads = ghost.getArrowheads();
ghost.remove();
arrowheads.addTo(map);
};
drawArrowheads();
map.on("moveend", drawArrowheads);
Working Sandbox
from leaflet-arrowheads.
Related Issues (20)
- Compatibility with vue 3? HOT 2
- Incompatibility with some versions of Terser HOT 1
- Just one `<path>` element HOT 2
- Previous arrow disappears when the polyline is updated HOT 6
- Leaflet 1.9.1 does not include L.GeometryUtil HOT 3
- Performance issue with LineString containig 10k+ coordinates HOT 4
- Add arrowheads to both ends of a polyline HOT 4
- Mouse event for the arrow HOT 3
- Unable to remove arrowheads from polyline HOT 1
- Unable to remove polyline with arrows from map using .remove() HOT 1
- Doesn't work with webpack 5 HOT 1
- Typings Error in leaflet-arrowheads HOT 1
- Using arrowheads with react-leaflet GeoJSON component HOT 3
- arrowhead at start? opposite direction? HOT 1
- arrowheads in draw/edit mode? HOT 1
- update existing arrowhead? HOT 3
- [Question] compatibility with leaflet geoman? HOT 2
- Arrowhead base at end of line option? HOT 1
- Midline offsetfor arrowhead HOT 1
- Add high zoom level program is crashing HOT 6
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 leaflet-arrowheads.