In [1]:
# Kod 1

import pandas as pd

znaczki = pd.read_excel("../input/wykaz-zt-polski.xls", skiprows = 4)

znaczki.rename(columns={"GPS":"lat", "Unnamed: 5":"lon"}, inplace=True)

znaczki["lat"] = znaczki["lat"].astype(float)
znaczki["lon"] = znaczki["lon"].astype(float)
In [2]:
# Kod 2

from sklearn.cluster import KMeans

n_clusters = 12

kmeans = KMeans(n_clusters = n_clusters, random_state = 42)

coordinates = znaczki[["lat", "lon"]]

kmeans.fit(coordinates)

znaczki["grupa"] = kmeans.labels_

znaczki.head()
Out[2]:
LP. Numer znaczka Nazwa znaczka Województwo lat lon grupa
0 1 No. 001 Rysy – najwyższy szczyt polskich Tatr małopolskie 49.179628 20.087987 1
1 2 No. 002 Schronisko "Murowaniec" na Hali Gąsienicowej małopolskie 49.244167 20.007222 1
2 3 No. 003 Babia Góra – najwyższy szczyt Beskidu Żywieckiego małopolskie 49.573055 19.529444 4
3 4 No. 004 Schronisko Morskie Oko małopolskie 49.201378 20.071276 1
4 5 No. 005 Schronisko Głodówka małopolskie 49.302124 20.116664 1
In [3]:
import folium
import folium.plugins
In [4]:
colours = ['red', 'blue', 'green', 'purple', 'orange', 'darkred',
           'lightred', 'beige', 'darkblue', 'darkgreen', 'cadetblue',
           'darkpurple', 'white', 'pink', 'lightblue', 'lightgreen',
           'gray', 'black', 'lightgray']
In [5]:
lat_max = coordinates["lat"].max()
lat_min = coordinates["lat"].min()
lon_max = coordinates["lon"].max()
lon_min = coordinates["lon"].min()

boulder_coords = [lat_min + (lat_max - lat_min)/2, lon_min + (lon_max - lon_min)/2]

my_map = folium.Map(location = boulder_coords)
my_map_int = folium.Map(location = boulder_coords)

my_map.fit_bounds(bounds=[(lat_min, lon_min), (lat_max, lon_max)])
my_map_int.fit_bounds(bounds=[(lat_min, lon_min), (lat_max, lon_max)])
In [6]:
from geopy.geocoders import Nominatim
from geopy.exc import GeocoderTimedOut
geolocator = Nominatim(user_agent="jakbadacdane.pl")
In [7]:
feature_groups = []
for feature_group in range(n_clusters):
    coords_tmp = kmeans.cluster_centers_[feature_group]
    location = geolocator.reverse("{}, {}".format(coords_tmp[0],coords_tmp[1]), timeout = 64)
    feature_groups.append(folium.FeatureGroup(name=str(location)))
In [8]:
marker_groups = []
for cluster in range(n_clusters):
    punkty = znaczki[znaczki["grupa"] == cluster]
    color = colours[cluster]
    print(cluster, len(punkty), color)
    
    marker_groups.append(folium.plugins.MarkerCluster())
    
    for index,punkt in punkty.iterrows():
        first_marker = folium.Marker([punkt["lat"], punkt["lon"]], 
                      icon=folium.Icon(color=color), 
                      popup= punkt["Numer znaczka"]+ " " + punkt["Nazwa znaczka"])
        
        second_marker = folium.Marker([punkt["lat"], punkt["lon"]], 
                      icon=folium.Icon(color=color), 
                      popup= punkt["Numer znaczka"]+ " " + punkt["Nazwa znaczka"])
        
        first_marker.add_to(marker_groups[cluster])
        
        second_marker.add_to(my_map)
    
    marker_groups[cluster].add_to(feature_groups[cluster])
0 46 red
1 67 blue
2 92 green
3 47 purple
4 110 orange
5 121 darkred
6 95 lightred
7 30 beige
8 39 darkblue
9 37 darkgreen
10 34 cadetblue
11 30 darkpurple
In [9]:
my_map
Out[9]: