[R-sig-Geo] Adding colour to polylines in Leaflet
Kent Johnson
kent3737 @ending from gm@il@com
Sun Sep 23 15:42:19 CEST 2018
Another approach is to draw individual line segments instead of polylines.
Here is one way; maybe there is a more elegant way to construct the
segments but this works...
library(tidyverse)
library(sf)
x = x %>% mutate(lat2=lead(lat, default=tail(lat, 1)),
lon2=lead(lon, default=tail(lon, 1))) %>%
mutate(segment = st_sfc(crs=4326,
pmap(.,
function(lat, lon, lat2, lon2, ...)
st_linestring(matrix(c(lon, lat, lon2, lat2),
byrow=TRUE, ncol=2)))))
leaflet(x$segment) %>%
addTiles() %>%
addPolylines(color=x$Color)
Kent
On Sat, Sep 22, 2018 at 2:00 PM Kent Johnson <kent3737 using gmail.com> wrote:
> Your problem is not really a leaflet problem, it is about identifying runs
> in your data. This should help: https://stackoverflow.com/q/43875716/80626
>
> Kent
>
> On Sat, Sep 22, 2018 at 12:22 PM Dhiraj Khanna <dhirajkhanna using gmail.com>
> wrote:
>
>> @Kent Johnson <kent3737 using gmail.com> guess I jumped the gun!
>>
>> Your code worked like a charm as long as the colours were all in order,
>> ie, none of them are repeating.
>> Like I mentioned, I am working with shipping data and the Color variable
>> is dependent on the ship’s speed. The code that you provided joins all the
>> line segments which have the same color.
>> So if red represents a speed less than 3 knots, then it will join all the
>> points irrespective of the timeline wherever the color is red.
>>
>> What I am looking for is one continuous path where the same color might
>> repeat. Here’s a reproducible example:
>>
>> library(leaflet)
>> x <- structure(list(lat = c(51.88783, 51.8878441, 51.887825, 51.88659, 51.8866959, 51.8874931, 51.89359, 51.8941269, 51.8977051, 51.8994331, 51.90773, 51.91324, 51.91604, 51.9216652, 51.93353, 51.9419365 ),
>> lon = c(4.28763342, 4.287635, 4.28765154, 4.29007339, 4.29562664, 4.29917, 4.30641174, 4.30561829, 4.29263353, 4.284498, 4.261132, 4.24711847, 4.241075, 4.23262, 4.21523666, 4.1927),
>> rateOfTurn = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L),
>> sogKts = c(0, 0, 0, 2.1, 3.4, 4.6, 3.5, 3.8, 7.4, 7.9, 8.8,9.1, 9.2, 9.2, 0.3, 0.4),
>> cog = c(15, 15, 15, 122.2, 70.4, 70, 323.2, 315.3, 289.3, 290.9, 303.8, 303.7, 308.9, 324.5, 304.9, 301.4),
>> heading = c(163, 162, 163, 106, 71, 71, 303, 298, 289, 294, 303, 303, 310, 324, 304, 302),
>> timestamp = c("2018-07-19T05:27:34","2018-07-19T05:39:35", "2018-07-19T05:45:34", "2018-07-19T05:57:37",
>> "2018-07-19T06:02:48", "2018-07-19T06:04:49", "2018-07-19T06:12:51", "2018-07-19T06:13:32",
>> "2018-07-19T06:19:08", "2018-07-19T06:21:41", "2018-07-19T06:28:42", "2018-07-19T06:32:50",
>> "2018-07-19T06:34:37", "2018-07-19T06:37:41", "2018-07-19T06:43:49", "2018-07-19T06:50:09"),
>> Color = c("red", "red", "red", "red", "orange", "orange","orange", "orange", "orange", "orange", "yellow", "yellow",
>> "yellow", "yellow", "red", "red")), row.names = 32:47, class = "data.frame")
>>
>> #Kent's code
>>
>> x$lastColor = dplyr::lag(x$Color)
>> map <- leaflet(x)
>> map <- addTiles(map)
>> for( Color in
>> levels(as.factor(x$Color))){
>> map <- addPolylines(map,lng=~lon,lat=~lat,data=x[x$Color==Color | x$lastColor==Color,], color=~Color) }
>> map
>>
>> As you can see, the last two observations are again in red color. But
>> when the map renders, it joins the last two observations with the first
>> three.
>>
>> I am not sure what to do here? Inserting a row of NAs would help? But I
>> am also using another javascript plugin (polylineDecorator) for adding
>> arrows to the direction of travel and that is intolerant to NAs.
>> Appreciate some help here.
>>
>>
>> Regards
>> Dhiraj Khanna
>> Mob:09873263331
>>
>> On Sat, Sep 1, 2018 at 8:06 PM Dhiraj Khanna <dhirajkhanna using gmail.com>
>> wrote:
>>
>>> Thank you Kent, that worked like a charm!
>>> Regards
>>>
>>> Dhiraj Khanna
>>> Mob:09873263331
>>>
>>>
>>> On Sat, Sep 1, 2018 at 7:59 PM Kent Johnson <kent3737 using gmail.com> wrote:
>>>
>>>> You have to include the points where the colors change in both
>>>> polylines. Here is one way:
>>>>
>>>> x$lastColor = dplyr::lag(x$Color)
>>>> map <- leaflet(x)
>>>> map <- addTiles(map)
>>>> for( Color in
>>>> levels(as.factor(x$Color))){
>>>> map <- addPolylines(map,lng=~lon,lat=~lat,data=x[x$Color==Color |
>>>> x$lastColor==Color,], color=~Color) }
>>>> map
>>>>
>>>> Kent
>>>>
>>>> On Sat, Sep 1, 2018 at 8:56 AM, Dhiraj Khanna <dhirajkhanna using gmail.com>
>>>> wrote:
>>>>
>>>>> @Kent they are appearing as three separate lines. I am hoping to see
>>>>> them joint with no gaps. The transition from row 4 to row 5 is where the
>>>>> speed has changed from 2.1 knots to 3.4 knots. I am hoping to see another
>>>>> line from row 4 to row 5 in red colour. Similarly for the other disjoint
>>>>> points.
>>>>> Regards
>>>>>
>>>>> Dhiraj Khanna
>>>>> Mob:09873263331
>>>>>
>>>>>
>>>>> On Sat, Sep 1, 2018 at 6:17 PM Kent Johnson <kent3737 using gmail.com>
>>>>> wrote:
>>>>>
>>>>>> Message: 5
>>>>>>> Date: Sat, 1 Sep 2018 08:28:24 +0530
>>>>>>> From: Dhiraj Khanna <dhirajkhanna using gmail.com>
>>>>>>> To: r-sig-geo using r-project.org
>>>>>>> Subject: [R-sig-Geo] Adding colour to polylines in Leaflet
>>>>>>> Message-ID:
>>>>>>> <
>>>>>>> CANHhK329-Y7hPJD9gSOs24mSqGkrjC481oQspNAgVisAw2JBoQ using mail.gmail.com>
>>>>>>> Content-Type: text/plain; charset="utf-8"
>>>>>>>
>>>>>>> I am working with shipping data where I get the dynamic parameters
>>>>>>> of a
>>>>>>> ship like its position, speed, heading and rate of turn. I am then
>>>>>>> trying
>>>>>>> to plot this on a leaflet map and trying to colour the polylines
>>>>>>> based on
>>>>>>> the speed, but it always shows up in the same colour. Here’s some
>>>>>>> sample
>>>>>>> data:
>>>>>>>
>>>>>>> <snip>
>>>>>>> This is the code I have tried which doesn’t work:-
>>>>>>>
>>>>>>> map <- leaflet(x) map <- addTiles(map) for( Color in
>>>>>>> levels(as.factor(x$Color))){ map <- addPolylines(map,
>>>>>>> lng=~lon,lat=~lat,data=x[x$Color==Color,], color=~Color) } map
>>>>>>>
>>>>>>> Regards
>>>>>>> Dhiraj Khanna
>>>>>>> Mob:09873263331
>>>>>>
>>>>>>
>>>>>> What are you expecting to see? When I run your code I get a map with
>>>>>> three lines, one red, one orange and one yellow.
>>>>>>
>>>>>> Kent
>>>>>>
>>>>>>
>>>>
[[alternative HTML version deleted]]
More information about the R-sig-Geo
mailing list