Search code examples
pythonleafletfolium

Is it possible to make a elipse on folium?


i saw on the internet images that folium generate a elipse form on map, is it possible, i tried creating manually but is inviable point per point, is there any way to do that ? elipse on folium


Solution

  • Yes, by using folium's Polygon (and some other stuff)

    I copied this answer for the polygon construction

    import math
    from shapely.geometry import Point
    from shapely.affinity import scale, rotate
    
    #input parameters
    A = Point(-95.5, 41.25)
    B = Point(-96.5, 41.25)
    R = .25
    
    d = A.distance(B)
    
    #first, rotate B to B' around A so that |AB'| = |AB| and B'.y = A.y
    #and then take S as midpoint of AB'
    S = Point(A.x + d/2, A.y)
    
    #alpha represents the angle of this rotation
    alpha = math.atan2(B.y - A.y, B.x - A.x)
    
    #create a circle with center at S passing through A and B'
    C = S.buffer(d/2)
    
    #rescale this circle in y-direction so that the corresponding
    #axis is R units long
    C = scale(C, 1, R/(d/2))
    
    #rotate the ellipse obtained in previous step around A into the
    #original position (positive angles represent counter-clockwise rotation)
    C = rotate(C, alpha, origin = A, use_radians = True)
    

    Where C is a shapely polygon

    print(type(C))
    <class 'shapely.geometry.polygon.Polygon'>
    

    I flip the coordinates from X,Y to Y,X to make it folium friendly

    folium_poly = [[y,x] for x,y in C.exterior.coords]

    then folium for the rest

    import folium
    
    m = folium.Map([C.centroid.y, C.centroid.x])
    folium.Polygon(folium_poly).add_to(m)
    m
    

    enter image description here