William_DYQ 2020-02-27 23:33 采纳率: 0%
浏览 639

folium 画图做Circle标记时更换地址出现完全不同的效果

关于folium的实例代码,目的是对一区域划分不同区域并使用folium.Circle在地图上显示出来。
在我更换地址后地图显示和实例代码出现了很大差别。

from geopy.geocoders import Nominatim 
import shapely
import pyproj
import math

#经纬度获取
def get_coordinates(address, verbose=False):
    try:       
        geolocator = Nominatim(user_agent="bl_explorer") 
        location = geolocator.geocode(address,timeout=10)
        if verbose:
            print('Google Maps API JSON result =>', location)
        lat = location.latitude
        lon = location.longitude
        return [lat, lon]
    except Exception as e:
        print('error:',e)
        return [None, None]

#地址:Alexanderplatz, Berlin, Germany
address = 'Alexanderplatz, Berlin, Germany'
berlin_center = get_coordinates(address)

#经纬度转换为原始地图投影 X,Y
def lonlat_to_xy(lon, lat):
    proj_latlon = pyproj.Proj(proj='latlong',datum='WGS84') 
    proj_xy = pyproj.Proj(proj="utm", zone=33, datum='WGS84')
    xy = pyproj.transform(proj_latlon, proj_xy, lon, lat)
    return xy[0], xy[1]

#地图投影转换为经纬度
def xy_to_lonlat(x, y):
    proj_latlon = pyproj.Proj(proj='latlong',datum='WGS84')
    proj_xy = pyproj.Proj(proj="utm", zone=33, datum='WGS84')
    lonlat = pyproj.transform(proj_xy, proj_latlon, x, y)
    return lonlat[0], lonlat[1]

#距离计算函数
def calc_xy_distance(x1, y1, x2, y2):
    dx = x2 - x1
    dy = y2 - y1
    return math.sqrt(dx*dx + dy*dy)

#坐标转换
x, y = lonlat_to_xy(berlin_center[1], berlin_center[0])
berlin_center_x, berlin_center_y = lonlat_to_xy(berlin_center[1], berlin_center[0]) 

#设置六边形区域分割网格,分别设置X,Y值的偏移量
k = math.sqrt(3) / 2 # Vertical offset for hexagonal grid cells
x_min = berlin_center_x - 6000
x_step = 600
y_min = berlin_center_y - 6000 - (int(21/k)*k*600 - 12000)/2
y_step = 600 * k 


latitudes = []
longitudes = []
distances_from_center = []
xs = []
ys = []

for i in range(0, int(21/k)):
    y = y_min + i * y_step
    x_offset = 300 if i%2==0 else 0
    for j in range(0, 21):
        x = x_min + j * x_step + x_offset
        distance_from_center = calc_xy_distance(berlin_center_x, berlin_center_y, x, y)
        if (distance_from_center <= 6001):
            lon, lat = xy_to_lonlat(x, y)
            latitudes.append(lat)
            longitudes.append(lon)
            distances_from_center.append(distance_from_center)
            xs.append(x)
            ys.append(y)

#生成地图
map_berlin = folium.Map(location=berlin_center, zoom_start=13)
folium.Marker(berlin_center, popup='Alexanderplatz').add_to(map_berlin)
for lat, lon in zip(latitudes, longitudes):
        folium.Circle([lat, lon], radius=300, color='blue', fill=Fal![图片说明](https://img-ask.csdn.net/upload/202002/27/1582817463_465272.png)
se).add_to(map_berlin)
map_berlin

最终生成的地图:
此时图片很正常

但是,当我更改地址address后(其他地方不做任何更改),比如更改为:'昆明市政府,昆明,中国", 最终生成的地图中Circle 标记就出现了重叠的情况:
图片说明

我检查了X,Y的偏移量和Circle半径都没问题,到底是哪里不对呢?


我来自问自答了。这个问题卡了我一晚上,结果问题发出来10分钟后我意识到问题了。。。。。。
在使用 pyproj.Proj()进行经纬度和坐标转换时,位置address需要和zone值对对应,否则会出现地图生产不匹配的现象。
对于北半球:

zone=int(longitude/6)+31
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-09 18:31
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥35 平滑拟合曲线该如何生成
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站