如何在特定的缩放级别显示标记?

8

我能够使用以下方法为美国数据的每个地理部分显示标记(以美国数据为例,因为无法显示工作数据结果):

import dload
from shapely.geometry import shape
import geopandas as gpd
import pandas as pd
import folium

json_string = 'https://raw.githubusercontent.com/datasets/geo-admin1-us/master/data/admin1-us.geojson'

j = dload.json(json_string)

gdf_usa = gpd.GeoDataFrame.from_features(j["features"])
gdf_usa.head()

gdf_usa_new = gpd.GeoDataFrame(gdf_usa, crs="EPSG:4326", geometry='geometry')

usa_map = gdf_usa_new.explore(tiles='CartoDB  positron')
usa_map

gdf_usa_new["long"] = gdf_usa_new.to_crs(epsg='4326').centroid.map(lambda p: p.x)
gdf_usa_new["lat"] = gdf_usa_new.to_crs(epsg='4326').centroid.map(lambda p: p.y)

for i in range(0,len(gdf_usa_new)):
    folium.Marker(
      location=[gdf_usa_new.iloc[i]['lat'], gdf_usa_new.iloc[i]['long']],
      popup=gdf_usa_new.iloc[i]['name'],
      icon=folium.DivIcon(html=f"""<div style="font-family: courier new; color: white">{gdf_usa_new.iloc[i]['name']}</div>""")
   ).add_to(usa_map)

usa_map

考虑到上述情况,我得到了下面的结果。可以看到,在美国东部地区,标记太靠近彼此,因此重叠在一起。

enter image description here

当我放大时,标记变得更清晰,因此不会重叠。

enter image description here

因此,我该如何修改代码,以便在缩放地图时出现标记?当地图缩小时,只有某些标记出现,而当我缩放时,其余标记出现。
我尝试按照下面的答案操作,但很难理解在上述代码中应该在哪里包含建议的答案:

https://gis.stackexchange.com/questions/216558/leaflet-resize-markers-in-layer-when-zoom-in

更新:我已添加了来自上面链接的代码(见下文),但地图的结果仍然保持不变。

usa_map.get_root().html.add_child(folium.Element("""
var ar_icon_1 = ...;
var ar_icon_2 = ...;
var ar_icon_1_double_size = ...;
var ar_icon_2_double_size = ...;


map.on('zoomend', function() {
    var currentZoom = map.getZoom();
    if (currentZoom > 5) {
        all_testptLayer.eachLayer(function(layer) {
            if (layer.feature.properties.num < 0.5)
                return layer.setIcon(ar_icon_1);
            else if (feature.properties.num < 1.0)
                return layer.setIcon(ar_icon_2);
        });
    } else {
        all_testptLayer.eachLayer(function(layer) {
            if (layer.feature.properties.num < 0.5)
                return layer.setIcon(ar_icon_1_double_size);
            else if (feature.properties.num < 1.0)
                return layer.setIcon(ar_icon_2_double_size);
        });
    }
});
""")).add_to(usa_map)

谢谢

编辑:我知道某些瓷砖会显示美国的州名。但是,对于我的工作,我正在处理安大略省的选区。这些瓷砖不会显示它们。因此,我使用上面的for循环来显示安大略省每个选区的选区名称。


你好!能否尝试构建一个 [mre] 以便我们可以理解你的代码?你的代码中有许多未定义的对象。另外,一个小建议是,你不应该使用保留关键字,包括内置函数如 map 作为变量名。这可能导致意想不到的行为,因为 map 是 Python 中的一个重要运算符。 - Michael Delgado
你好,感谢回复。已按照指示进行更新。 - Isaac A
所以,这个想法是这样的。为了简单起见,假设ont_dataset包含postal_code列。我能够绘制安大略省地图,并突出显示每个邮政编码和标记显示邮政编码名称。问题在于标记太过拥挤,因此重叠,从而隐藏了地图。我希望能够缩放地图,然后显示一些标记,使地图本身看起来更清晰,不那么拥挤。谢谢。 - Isaac A
1
是的!那完全有道理。如果您能分享创建原始地图的代码以及创建标记的示例数据集,那将非常有帮助。数据集不必是您的数据 - 您可以随机生成点或其他内容。但是,从您正在使用的内容开始工作非常有帮助,这样我们更有可能能够解决问题 :) - Michael Delgado
我没有太多可以建议你的,但你需要在 folium.DivIcon() 中添加类名。接下来是一个javascript,它通过链接设置图标大小。所描述的代码是javascript,因此您需要一个脚本标签。这就是我能帮助你的地方。这是基于这个页面的评论。 - r-beginners
显示剩余6条评论
1个回答

0

好的,既然你们都不知道,这是你要做的事情。

  1. 在Notepad++中打开地图的HTML文件。
  2. 对于感兴趣的区域,请查找map_...和u003e...,其中...是州名或选区ID。例如:u003e亚利桑那。
  3. 注意marker_...和div_icon_...
  4. 在记事本底部的 之前,为每个感兴趣的区域插入以下内容:
        var myIcon = L.divIcon({className: 'my-div-icon'});

            map_....on('zoomend', function() {  
            var currZoom = map_....getZoom();
            prevZoom = currZoom;                     
                    if (map_....getZoom() <9){                      
            marker_....setIcon(myIcon);
                    }
                    else {                        
            marker_....setIcon(div_icon_...);

                    }
                }
            );
  1. 保存
  2. 刷新已打开的HTML文件或打开HTML文件。 6.5 注意,如果要运行Python代码并每次创建新地图,则上述值还需要在代码中更新。
  3. 实现收益。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接