Плагин поиска Python — Folium не выполняет поиск всплывающего текста в слое MarkerCluster Group

#python #search #folium

#python #Поиск #folium

Вопрос:

Моя карта фолиума, кластер маркеров, элемент управления слоем и панель поиска работают и отображаются правильно, за исключением фактического использования панели поиска. Слой, на который указывает плагин поиска при поиске, — это мой слой MarkerCluster, который, согласно документации folium, должен быть доступен для поиска. Все, что я набираю в строке поиска, возвращает «Местоположение не найдено», что заставляет меня думать, что он неправильно выполняет поиск по слою MarkerCluster или не знает, как выполнить поиск по тексту этого слоя, который включен во всплывающие окна маркеров.

Вот мой код, который у меня есть прямо сейчас:

 import os 
import folium
from folium import plugins
import pandas as pd
from folium.plugins import MarkerCluster
from folium.plugins import Search

#import data including lat/lon, name of service, address of service
df = pd.read_csv('data.csv')

#Create base map zoomed in to Indiana
map=folium.Map(location=[39.80, -86.12],  tiles=None, zoom_start=7)
folium.TileLayer('cartodbpositron', name='COVID-19 Services').add_to(map)

#Make Marker Cluster Group layer
mcg = folium.plugins.MarkerCluster(control=False)
map.add_child(mcg)

#Create layer of markers
#Set marker popups to display name and address of service
for row in df.iterrows():
    row_values=row[1]
    location=[row_values['latitude'], row_values['longitude']]
    popup=popup=(row_values['name'] '<br>' '<br>' row_values['address_1'] 
                 '<br>' '<br>' row_values['city'] ',' ' ' row_values['state'] 
                 '<br>' row_values['zip'])
    marker=folium.Marker(location=location, popup=popup, min_width=2000)
    marker.add_to(mcg)

#Add search bar
servicesearch = Search(
    layer=mcg,
    geom_type='Point',
    placeholder='Search for a service',
    collapsed=False,
).add_to(map)

#Add layer control
folium.LayerControl().add_to(map)

map
  

Как мне заставить плагин поиска выполнять поиск по всплывающим окнам маркера? Затем, как мне заставить карту выделить или увеличить те, которые были найдены для маркеров? Любая помощь приветствуется, спасибо!

Ответ №1:

Это мое решение:

 def visualize_locations_with_marker_cluster(df, zoom=4):
    f = folium.Figure(width=1000, height=500)

    center_lat=34.686567
    center_lon=135.52000

    m = folium.Map([center_lat,center_lon], zoom_start=zoom).add_to(f)
    marker_cluster = MarkerCluster().add_to(m)

    for d in df.iterrows():
        folium.Marker(location=[d[1]["y"], d[1]["x"]], popup=d[1]["company"], name=d[1]["company"]).add_to(marker_cluster)

    servicesearch = Search(
        layer=marker_cluster,
        search_label="name",
        placeholder='Search for a service',
        collapsed=False,
    ).add_to(m)


    return m

  

Сначала создайте карту, создайте кластер, зациклите значения в pd.dataframe и создайте Mareker s для кластера с name меткой.
Затем создайте Search объект и добавьте туда кластер с search_label="name", меткой. Наконец, добавьте все это обратно на карту

["x", "y"] — это длина и широта, company это значение поиска в моем случае

Ответ №2:

Если вы немного измените способ добавления данных на карту, вам будет проще использовать панель поиска. Вы можете преобразовать данные в вашем фрейме данных в объект GeoJSON. Сначала вам нужно создать словарь для вашего GeoJSON и использовать функцию folium.GeoJSON() :

 geo_json = {
  "type": "FeatureCollection",
  "features": [],
}
for d in df.iterrows():
    temp_dict = {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates":[d[1]["longitude"], d[1]["latitude"]],
        
      },"properties": {"name": d[1]["name"]}
    }
    geo_json["features"].append(temp_dict)
geojson_obj = folium.GeoJson(geo_json).add_to(map)
  

После этого вам просто нужно немного изменить свой код, чтобы добавить панель поиска :

 servicesearch = Search(
    layer=geojson_obj,
    search_label="name",
    placeholder='Search for a service',
    collapsed=False,
).add_to(map)
  

Комментарии:

1. Это решение все еще не решило проблему поиска, и теперь мои маркеры не кластеризованы и больше не имеют всплывающих окон. Похоже, что плагину поиска нравятся слои GeoJSON больше, чем слои MarkerCluster (несмотря на то, что в документации говорится, что плагин поиска работает на слоях MarkerCluster), так что это хорошее начало. Есть предложения о том, как теперь использовать этот файл данных GeoJSON и сохранить кластер маркеров и всплывающие окна?

2. @Pierre-Loic, я попробовал это в своем собственном наборе данных, и он отображает маркеры вне карты в странной строке после выбора искомого «имени», есть какие-либо мысли?

3. @onxx, вы можете проверить значение name, которое у вас есть в вашем geo_json, потому что панель поиска использует эту метку для работы

4. @Pierre-Loic, как мне привязать это обратно к маркеру?

5. Это хорошее решение для небольшого набора данных, но в моем случае, когда имеется более 10000 координат, оно очень медленное. Я должен использовать MarkerCluster

Ответ №3:

Я некоторое время боролся с тем же. Я верю, что это может это исправить: добавьте ‘name’ или что угодно, что вы хотите, чтобы искали в маркере, например:

 marker=folium.Marker(location=location, popup=popup, min_width=2000, name=name)
  

Немного поздно, но, возможно, лучше, чем никогда.