#!/usr/bin/env python # coding: utf-8 # In[1]: get_ipython().run_line_magic('matplotlib', 'inline') import requests import pandas as pd import numpy as np import json # In[2]: import time # In[3]: r = requests.get('http://api.gios.gov.pl/pjp-api/rest/station/findAll') allStations = pd.io.json.json_normalize(r.json()) # In[4]: pollutants = ["PM2.5", "PM10", "C6H6", "NO2", "SO2", "O3", "CO"] # In[5]: def get_sensors(Id): stationId = Id r = requests.get('http://api.gios.gov.pl/pjp-api/rest/station/sensors/' + str(stationId)) sensors = pd.io.json.json_normalize(r.json()) return sensors[["param.paramCode","id"]].set_index("param.paramCode").to_dict(orient = "index") # In[6]: allStations["gegrLat"] = allStations["gegrLat"].astype("float") allStations["gegrLon"] = allStations["gegrLon"].astype("float") # In[7]: get_ipython().run_cell_magic('time', '', 'allStations["sensors"] = allStations["id"].apply(get_sensors)\n') # In[8]: allStations2 = pd.concat([allStations, allStations['sensors'].str.join('|').str.get_dummies()], axis=1, sort=False) allStations2[pollutants].sum() # In[9]: #points = allStations2[allStations2["PM2.5"] == 1][["gegrLat","gegrLon"]].values #points = allStations2[allStations2["PM10"] == 1][["gegrLat","gegrLon"]].values #points = allStations2[allStations2["C6H6"] == 1][["gegrLat","gegrLon"]].values #points = allStations2[allStations2["NO2"] == 1][["gegrLat","gegrLon"]].values #points = allStations2[allStations2["SO2"] == 1][["gegrLat","gegrLon"]].values #points = allStations2[allStations2["O3"] == 1][["gegrLat","gegrLon"]].values points = allStations2[allStations2["CO"] == 1][["gegrLat","gegrLon"]].values # In[10]: points # In[11]: lat_max = points[:,0].max() lat_min = points[:,0].min() lon_max = points[:,1].max() lon_min = points[:,1].min() lat_max, lat_min, lon_max, lon_min # In[12]: from scipy.spatial import voronoi_plot_2d from scipy.spatial import Voronoi vor = Voronoi(points) # In[13]: vertices = pd.DataFrame(vor.vertices, columns = ["Lat", "Lon"]) # In[14]: import matplotlib.pyplot as plt voronoi_plot_2d(vor) plt.show() # In[15]: vertices[(vertices["Lat"] < lat_max) & (vertices["Lat"] > lat_min)] # In[16]: proper_vertices = pd.DataFrame(vertices[(vertices["Lon"] < lon_max) & (vertices["Lon"] > lon_min) & (vertices["Lat"] < lat_max) & (vertices["Lat"] > lat_min)], copy = True) # In[17]: import geopy.distance # In[18]: for index, row in proper_vertices.iterrows(): list_of_dists = [] for point in points: #list_of_dists.append(np.sqrt(np.square(row["Lat"] - point[0]) + np.square(row["Lon"] - point[0]))) coords_1 = (row["Lat"], row["Lon"]) coords_2 = (point[0], point[1]) #print(coords_1,coords_2) list_of_dists.append(geopy.distance.vincenty(coords_1, coords_2).km) #print(list_of_dists) proper_vertices.at[index, 'dist'] = min(list_of_dists) # In[19]: proper_vertices.sort_values("dist").tail(n=1) # In[20]: import folium from folium.plugins import MarkerCluster # In[21]: boulder_coords = [lat_min + (lat_max - lat_min)/2, lon_min + (lon_max - lon_min)/2] # In[22]: my_map = folium.Map(location = boulder_coords) my_map.fit_bounds(bounds=[(lat_min, lon_min), (lat_max, lon_max)]) # In[23]: for point in points: folium.Marker(point).add_to(my_map) # In[24]: from geopy.geocoders import Nominatim geolocator = Nominatim(user_agent="jakbadacdane.pl") # In[25]: for index, row in proper_vertices.sort_values("dist", ascending=False).iterrows(): location = geolocator.reverse("{}, {}".format(row["Lat"], row["Lon"]), timeout = 30) #print(location.raw) #print(row["Lat"], row["Lon"]) if location.raw == {'error': 'Unable to geocode'}: print("Out of space") continue try: is_poland = location.raw["address"]["country"] == "RP" except KeyError: print(location) break if is_poland: print(location) folium.Circle(radius=row["dist"]*1000, location=[row["Lat"], row["Lon"]], fill = True).add_to(my_map) break else: print(location.raw["address"]["country"]) # In[26]: #for index, row in proper_vertices.sort_values("dist").tail(n=1).iterrows(): # #print(row["dist"]*1000) # folium.Circle(radius=row["dist"]*1000, location=[row["Lat"], row["Lon"]], fill = True).add_to(my_map) # In[27]: my_map # In[ ]: # In[ ]: