[R-sig-Geo] Adding colour to polylines in Leaflet

Dhiraj Khanna dhir@jkh@nn@ @ending from gm@il@com
Tue Sep 25 07:50:19 CEST 2018


@Kent Johnson <kent3737 using gmail.com> thank you so much for this. It does take
a bit of time to compute, but works nonetheless. Thanks again, appreciate!
Regards

Dhiraj Khanna
Mob:09873263331


On Sun, Sep 23, 2018 at 7:12 PM Kent Johnson <kent3737 using gmail.com> wrote:

> 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