【问题标题】:Interactive R Map with Search Functionality具有搜索功能的交互式 R 地图
【发布时间】:2021-11-22 08:17:35
【问题描述】:

尝试在 R 中构建一个非常基本的交互式地图。总的来说,我想做以下事情:

从 ArcGIS 导出 shapefile -> 在 R 中绘制为交互式地图 -> 根据属性(例如名称)搜索 shapefile

我一直在使用tmap:

shapefile = st_read("C:/Projects/_SANDBOX/R/Shapefiles/XXX.shp")
map = tm_shape(shapefile)+tm_fill(col="blue",alpha=0.3) +tm_borders(col="black")
tmap_mode("view")
map

但我被困在尝试添加搜索功能的地步。在R中使用传单做这种事情会更好/更容易吗?如果是这样,那会怎样?

非常感谢任何帮助。谢谢!

【问题讨论】:

  • 我不知道leaflettmap 中的内置搜索框功能。我最初的想法可能涉及制作一个shiny 应用程序 - 并在应用程序中有一个搜索框(文本输入),您可以在其中搜索或从数据/地图中的特征名称列表中选择(下拉框)。然后,地图可以重新以该特征(的质心)为中心。该地图将开始偏离“非常基本的交互式地图”状态,但肯定是可以实现的,并且应该相对简单地构建。在用户看来,它仍然是“非常基本的”。

标签: r leaflet mapping shapefile tmap


【解决方案1】:

就像我在评论中所说的,我不知道 leaflettmap 中的内置搜索功能,所以我的第一个想法是使用 shiny 作为搜索组件和地图显示。

这是一个非常基本的示例,但允许您从下拉列表中选择要放大的国家/地区。所选国家在世界地图中以红色显示,并使用tm_shape()bbox 参数打开时显示在地图的初始帧/位置。使用filter()将该国家与world的其余部分分开,并保存为my_country;这用于将所选国家绘制为红色图层,并通过使用sf::st_bbox() 检索其坐标作为缩放位置。

library(shiny)
library(tidyverse)
library(tmap)
library(spData)
library(sf)
tmap_mode('view')

# Define UI for application that draws a histogram
ui <- fluidPage(

    # Application title
    titlePanel('Search the world'),

    # Sidebar with a drop down boxz for country names
    sidebarLayout(
        sidebarPanel(
            selectInput(inputId = 'country',
                        label = 'Country to zoom in on:',
                        choices = world$name_long)
        ),

        # Show the map
        mainPanel(
           tmapOutput('map')
        )
    )
)

# Define server logic required to make the map
server <- function(input, output) {
    
    # build the map
    output$map <- renderTmap({

        my_country <- world %>% 
            filter(
                name_long == input$country
            )
        
        tm_shape(world, bbox = st_bbox(my_country))+
            tm_polygons()+
            tm_shape(my_country)+
            tm_polygons(col = 'red')

    })
    
}

# Run the application 
shinyApp(ui = ui, server = server)

当然,您可以随意修改输入和输出。我选择了一个下拉框,因为这意味着您不会拼错国家名称;不像谷歌地图这样可能能够处理拼写错误的地名,filter() 要求名称完全匹配。

虽然它是一个下拉框,但其中似乎有一些有限的搜索功能;如果您删除框中的名称并开始输入,匹配的国家/地区名称将出现:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    相关资源
    最近更新 更多