googleway icon indicating copy to clipboard operation
googleway copied to clipboard

Street view not updating with map using split view

Open rtaylor741 opened this issue 7 years ago • 18 comments

Hi,

I'm trying to build an app where inputting a new address moves to that address in google maps and shows the map and street view using your split_view functionality. When a new address is chosen, the map changes, but the location of the street view point doesn't. I've put some basic code below that shows my problem. Is there a way to input a location for street view? Ideally I would use a postcode centre lat/lon for when the postcode is selected and then the address lat/lon for when the address is selected.

Thanks for your help!

library(shiny)
library(DT)
library(googleway)


ui <- fluidPage(
  fluidRow(
    box(width=12,
        column(width=3,
               selectInput(inputId = "postcodes", label = NULL, choices=c('','SW17 8PB','E1 3DY'), multiple=FALSE, selected='')
        ),
        column(width=3,
               selectInput(inputId = "addresses", label = NULL, choices=NULL, multiple=FALSE)
               )
        ) #box
    ), #row
  div(
    fluidRow(
      box(width = 6,
          google_mapOutput(outputId = "map")
          ),
      box(width = 6,
          google_mapOutput(outputId = "pano")
          )
      ) #row
    ) #div
  )

server <- function(input, output, session) {
  
  temp_data <- data.frame('postcode'=c('E1 3DY','E1 3DY','E1 3DY','SW17 8PB','SW17 8PB','SW17 8PB'),
                     'building_number'=c('1','2','3','21','12','17'),'lat'=c(51.5170971,51.5171136,51.5171037,51.4310593,51.4309847,51.4311056),
                     'lon'=c(-0.0544549,-0.0543677,-0.0543105,-0.162327,-0.1627329,-0.1624115))
  #Base map
  
  set_key("xxx")
  
  output$map <- renderGoogle_map({
    google_map(location = c(51.5074,0.1278),zoom = 16, split_view = "pano"
               )
  })
  
  #-------------------------------------------------------------------------------------------------------
  #Search Postcode button
  observeEvent(input$postcodes, {
    
    pc_data <- subset(temp_data,postcode==input$postcodes)
    
    #Create Address list
    address_list <- c('', as.character(pc_data$building_number)) #add empty address for starting value
    
    updateSelectInput(session,"addresses",choices = address_list, selected = "")
    
      google_map_update("map",data = pc_data) %>%
        clear_bounds() %>%
        clear_markers() %>%
        add_markers(lat = "lat", lon = "lon", update_map_view=TRUE, mouse_over = "building_number")

  })
  
  #-------------------------------------------------------------------------------------------------------
  #What to do when address is selected
  observeEvent(input$addresses, {
    
    if(input$addresses != "") {
      
      address_row <- subset(temp_data,postcode==input$postcodes & building_number==input$addresses) #select address row
      
      google_map_update("map",data = address_row) %>%
        clear_bounds() %>%
        clear_markers() %>%
        add_markers(lat = "lat", lon = "lon", update_map_view=FALSE, mouse_over = "building_number")
      
    }
    
  })
  #-------------------------------------------------------------------------------------------------------
  
  
} #server

#This allows the ui and server code to be in one file
shinyApp(ui, server)  

rtaylor741 avatar Jan 04 '19 10:01 rtaylor741

I can't run your code, the UI errors with

Error in box(width = 12, column(width = 3, selectInput(inputId = "postcodes",  : 
  plot.new has not been called yet

SymbolixAU avatar Jan 04 '19 19:01 SymbolixAU

Hi, the code runs fine for me. Looking at that error online it seems to be something do with R itself. A lot of people saying that the error only appears when they run code in chunks instead of the whole script?

https://stackoverflow.com/questions/40938561/plot-new-has-not-been-called-yet-error-in-rmarkdown-rstudio-1-0-44

rtaylor741 avatar Jan 07 '19 09:01 rtaylor741

ah - I spotted the error - box is from shinydashboard, so you need that library loaded.

Can I clarify what your issue is:

When you enter a postcode you want both the map and the streetview to update their locations?

SymbolixAU avatar Jan 07 '19 10:01 SymbolixAU

ah sorry, yes that could have been loaded already from a separate script.

Yes, that is exactly right. I know you can drag the peg man onto the map and the streetview will update, but i would like to be able to have it update automatically.

Thanks for looking into it.

rtaylor741 avatar Jan 07 '19 10:01 rtaylor741

Ok I understand; that's a good question and would be a useful feature, but I'll have to look into it tomorrow (Australian time)

SymbolixAU avatar Jan 07 '19 10:01 SymbolixAU

I think as an interim solution you could not use the google_map_update and just re-draw the map each time. It will be a bit jerky but might get you a solution.


Notes for me

will need to grab a reference to map.setStreetView() and implement a update_pano() function.

SymbolixAU avatar Jan 07 '19 10:01 SymbolixAU

No problem, that would be great.

I did try redrawing the map again each time, but I was having issues with that too. Not sure if related to your package or not, but redrawing a map with the same ID didn't seem to work and I had to rename it to "map2" and update the UI to "map2" as well even though I've done this kind of thing loads of times for data frames etc. This worked, but then every time you selected a new address it would need a new ID and it was causing me problems. As I say, not sure that's related to your package.

Thanks again.

rtaylor741 avatar Jan 07 '19 10:01 rtaylor741

I've updated the github version with an update_pano() function which I think is along the right lines. You use it like

google_map_update( "map", data = pc_data ) %>%
  clear_bounds() %>%
  clear_markers() %>%
  add_markers(lat = "lat", lon = "lon", update_map_view = TRUE, mouse_over = "building_number") %>%
  update_pano( pano = "pano", lat = pc_data$lat[1], lon = pc_data$lon[1])

(In this example the lat & lon 's are incorrect, but you should get the idea.

SymbolixAU avatar Jan 08 '19 08:01 SymbolixAU

Thanks for getting this done so quickly!

I can't quite get it to work properly though. I've added columns called latc and lonc as a random place to see if it will move the streetview to there, but it doesn't seem to work. It doesn't update the streetview when you first select a postcode, but then it does every time you select from then on, but with one of the address points. Code below that hopefully shows what I mean better.

library(shiny)
library(shinydashboard)
library(DT)
library(googleway)


ui <- fluidPage(
  fluidRow(
    box(width=12,
        column(width=3,
               selectInput(inputId = "postcodes", label = NULL, choices=c('','SW17 8PB','E1 3DY'), multiple=FALSE, selected='')
        ),
        column(width=3,
               selectInput(inputId = "addresses", label = NULL, choices=NULL, multiple=FALSE)
        )
    ) #box
  ), #row
  div(
    fluidRow(
      box(width = 6,
          google_mapOutput(outputId = "map")
      ),
      box(width = 6,
          google_mapOutput(outputId = "pano")
      )
    ) #row
  ) #div
)

server <- function(input, output, session) {
  
  temp_data <- data.frame('postcode'=c('E1 3DY','E1 3DY','E1 3DY','SW17 8PB','SW17 8PB','SW17 8PB'),
                          'building_number'=c('1','2','3','21','12','17'),'lat'=c(51.5170971,51.5171136,51.5171037,51.4310593,51.4309847,51.4311056),
                          'lon'=c(-0.0544549,-0.0543677,-0.0543105,-0.162327,-0.1627329,-0.1624115),
                          'latc'=c(52.6287351,52.6287351,52.6287351,52.6287351,52.6287351,52.6287351),
                          'lonc'=c(1.3781001,1.3781001,1.3781001,-1.3781001,-1.3781001,-1.3781001)
                          )
  #Base map
  
  set_key("xxx")
  
  output$map <- renderGoogle_map({
    google_map(location = c(51.5074,0.1278),zoom = 16, split_view = "pano"
    )
  })
  
  #-------------------------------------------------------------------------------------------------------
  #Search Postcode button
  observeEvent(input$postcodes, {
    
    if(input$postcodes != "") {
    
    pc_data <- subset(temp_data,postcode==input$postcodes)
    
    #Create Address list
    address_list <- c('', as.character(pc_data$building_number)) #add empty address for starting value
    
    updateSelectInput(session,"addresses",choices = address_list, selected = "")
    
    google_map_update("map",data = pc_data) %>%
      clear_bounds() %>%
      clear_markers() %>%
      add_markers(lat = "lat", lon = "lon", update_map_view=TRUE, mouse_over = "building_number") %>%
      update_pano(pano = "pano", lat = pc_data$latc[1], lon = pc_data$lonc[1])
      
    }
    
  })
  
  #-------------------------------------------------------------------------------------------------------
  #What to do when address is selected
  observeEvent(input$addresses, {
    
    if(input$addresses != "") {
      
      address_row <- subset(temp_data,postcode==input$postcodes & building_number==input$addresses) #select address row
      
      google_map_update("map",data = address_row) %>%
        clear_bounds() %>%
        clear_markers() %>%
        add_markers(lat = "lat", lon = "lon", update_map_view=FALSE, mouse_over = "building_number") %>%
        update_pano(pano = "pano", lat = address_row$lat, lon = address_row$lon)
      
    }
    
  })
  #-------------------------------------------------------------------------------------------------------
  
  
} #server

#This allows the ui and server code to be in one file
shinyApp(ui, server)

rtaylor741 avatar Jan 08 '19 12:01 rtaylor741

Hi, I had another look at this and tweaked your javascript code slightly to fix it.

In google_maps.js, I changed the line below.

var center = map.getCenter();

to

var center = {lat: lat, lng: lon};

This then uses the variables that you input instead of moving it to the center.

Thanks.

rtaylor741 avatar Jan 24 '19 11:01 rtaylor741

I was also looking for that feature. Any idea on the timeline? thanks for a great package! Martin

maxlavoie avatar Oct 30 '19 21:10 maxlavoie

@maxlavoie I've made this suggested change, so it should be available in the github version now.

SymbolixAU avatar Oct 30 '19 21:10 SymbolixAU

Works perfectly. Thanks for doing this so quickly!

maxlavoie avatar Oct 31 '19 11:10 maxlavoie

cool - I'll close this now as I think it's working as intented.

SymbolixAU avatar Oct 31 '19 21:10 SymbolixAU

I am trying to use the update_pano function and I'm getting the "could not find function "update_pano" error". Is there a specific version of googleway I need to install? I currently have googlway 2.7.2 and googlepolylines 0.7.2.

meldataaa avatar Sep 17 '20 18:09 meldataaa

Can you try

remotes::install_github("SymbolixAU/googleway")

And see if it works from here directly?

(I may not have correctly updated the version numbers on github)

dcooley avatar Sep 17 '20 22:09 dcooley

Thank you for the quick response but I’m still having the same error after your suggested install.

meldataaa avatar Sep 17 '20 23:09 meldataaa

For some reason I didn't @export the function in the latest version, so you currently have to use googleway:::update_pano() - with the 3 :::

dcooley avatar Feb 01 '21 22:02 dcooley