with longitud latitud graficar google get_map examples error r ggplot2 shiny ggmap

longitud - Al hacer clic en un mapa de gg en ShinyApp, no se devuelven las coordenadas correctas



maps in r (1)

Si adjunto un evento de clic a un ggmap en una ShinyApp, y luego hago clic en el mapa, no recupero los puntos de coordenadas correctos.

La siguiente aplicación traza un mapa con algunos puntos y agrega un evento de clic al mapa. Mi objetivo es tenerlo así cuando haga clic en los puntos, sus datos (lon / lat en este caso) deberían aparecer en outputId = "coords" verbatimTextOutput.

app.R:

library(shiny); library(ggmap); # load data points <- data.frame(lon=c(-122,-121.9,-121.8,-121.7),lat=c(37.2,37.2,37.2,37.2)); map <- get_map(location = c(lon = mean(points$lon),lat = mean(points$lat)),maptype="roadmap",scale=2, zoom =11) ui <- fluidPage ( plotOutput(outputId="mapOut", width="100%", height="500px", click = "plot_click" ), verbatimTextOutput(outputId="info"), verbatimTextOutput(outputId="coords") ) server <- function(input,output) { output$mapOut <- renderPlot({ mapPoints <- ggmap(map) + geom_point(aes(x = lon, y = lat),size=8,colour="black", data=points);; mapPoints }) output$info <- renderPrint({ ptClicked <- nearPoints(points, coordinfo = input$plot_click, threshold = 10, maxpoints = 1, xvar="lon", yvar="lat"); data.frame(lon=ptClicked$lon,lat=ptClicked$lat); }) output$coords <- renderText({ paste0("x=", input$plot_click$x, "/ny=", input$plot_click$y) }) } shinyApp(server = server, ui = ui)

Cuando ejecuto esta aplicación, los puntos se muestran en las ubicaciones correctas. Si hago clic directamente en un punto, nearPoints () en la salida $ info <- ... no identifica correctamente el punto. Esto se debe a que la coordenada devuelta hizo clic es incorrecta. (Como se puede ver en la salida de texto literal de "coords")

Si hago clic a la DERECHA del punto, haciendo que la coordenada de clic devuelta "en el punto" en un sentido de datos, se devuelve el punto.

El problema es similar a obtener correcciones de clic correctas con el mapa de ggplot en brillante , excepto en ese caso las coordenadas se devolvieron como números en [0,1]; en mi caso, las coordenadas parecen coordenadas verdaderas pero están un poco equivocadas ... De esa pregunta también noté que incluso después de reescalar usando lon <- 400 * x - 200 y lat <- 200 * y - 100 las coordenadas eran todavía está apagado (p. ej., (lon, lat) = (0,0) parece estar mapeado (alrededor de 8.9,5.4)). Entonces ggplot parece enfrentar el mismo problema cuando se usa para mapear.

¿Hay alguna manera de hacer un clic de un ggmap / ggplot para obtener la coordenada correcta? Esto podría tener algo que ver con las proyecciones.

Si no, ¿hay alguna otra manera de arreglar las cosas para poder hacer clic correctamente en los puntos? (Por ejemplo, una solución podría ser capturar de alguna manera las ubicaciones "en cuanto a los clics" (x, y) de los puntos graficados, almacenarlos y usarlos en lugar de lon / lat para los propósitos de nearPoints () ...) .


ggmap() utiliza de forma predeterminada la proyección coord_map() en ggplot2 , que distorsiona la coordenada. Para obtener la coordenada de clic correcta en Brillante, debe volver a convertirla en coordenadas cartesianas. Esto se puede hacer simplemente agregando coord_cartesian() . Como coord_map() se ha eliminado, la relación de aspecto del mapa de salida puede ser cualquiera. Por lo tanto, debe cambiar el ancho y el alto en plotOutput() para que el mapa siga siendo un buen mapa.

A continuación se muestra el código con la pequeña modificación mencionada anteriormente. Produce un clic correcto y un bonito mapa.

library(shiny); library(ggmap); # load data points <- data.frame(lon=c(-122,-121.9,-121.8,-121.7),lat=c(37.2,37.2,37.2,37.2)) map <- get_map(location = c(lon = mean(points$lon),lat = mean(points$lat)), maptype="roadmap",scale=2, zoom =11) ui <- fluidPage ( plotOutput(outputId="mapOut", ########################################################## # force the ratio of the width and height so that the map # appears as square width=530, height=500, click = "plot_click" ), verbatimTextOutput(outputId="info"), verbatimTextOutput(outputId="coords") ) server <- function(input,output) { output$mapOut <- renderPlot({ mapPoints <- ggmap(map, extent = "normal") + geom_point(aes(x = lon, y = lat),size=8,colour="black", data=points) ######################################################### # add coord_cartesian() to strip coord_map() from ggmap() mapPoints + coord_cartesian() }) output$info <- renderPrint({ ptClicked <- nearPoints(points, coordinfo = input$plot_click, threshold = 10, maxpoints = 1, xvar="lon", yvar="lat"); data.frame(lon=ptClicked$lon,lat=ptClicked$lat); }) output$coords <- renderText({ paste0("x=", input$plot_click$x, "/ny=", input$plot_click$y) }) } shinyApp(server = server, ui = ui)