def test_district_map_limits_calculator(self): with self.assertRaises(TypeError): mu._district_map_limits_calculator(23)
def district_mapper(crimes, address_object, show_district_block=True): """Create and shows a Custom Heat map of a particular district of Chicago city. Heat will be based on crime density, and each individual crime will be a translucent blue point. Police station will be plotted as a violet point, and the particular address as a black point. Several parts of the code on how to create a Heat map, where inspired by the example found in http://bagrow.com/dsv/heatmap_basemap.html. However, they were highly customized and modified for our particular use case. :param crimes: list or tuple of lists or tuples of coordinates for crimes. :param address_object: Receives an instance of the Address class from the addressClass module """ # Validate input mu._district_mapper_input_validator(crimes, address_object) # Get the district number, longitude and latitude of the address of interest, and string representation of the street address. district_number, lat_address, lon_address, street_address = address_object.district, address_object.lat, address_object.lon, address_object.street_address # Get proper limits for the district and create limits for the map based on the maximum and minimum latitudes of the district plus a certain margin. min_lon, max_lon, min_lat, max_lat, district_limits_lon, district_limits_lat, vertices_list = mu._district_map_limits_calculator(district_number) # Filter the crimes database to keep only crimes inside the map space. filtered_crimes = gu.return_points_in_square(crimes, min_lat, max_lat, min_lon, max_lon) # Save the coordinates of the crimes to plot in two lists. lat_crimes_list, lon_crimes_list = mu._crimes_lon_lat_splitter(filtered_crimes) plt.close('all') # Create a basemap instance of the district with the limits that were established before. district_map = mu._basemap_district(min_lat, min_lon, max_lat, max_lon) # Generate bins for the Heatmap, calculate densities and smooth densities lat_bins_2d, lon_bins_2d, smoothed_density = mu._bin_densities_calculator(lat_crimes_list, lon_crimes_list) # Convert the bin mesh to map coordinates: xs, ys = district_map(lon_bins_2d, lat_bins_2d) # Add histogram squares and a corresponding colorbar to the map: plt.pcolormesh(xs, ys, smoothed_density, cmap=cm.OrRd) # Add colorbar into the map cbar = plt.colorbar(orientation='horizontal', shrink=0.625, aspect=20, fraction=0.2, pad=0.02) cbar.set_label('Number of crimes in district number ' + str(district_number), size=18) # Translucent blue scatter plot of Crimes above histogram: x_crimes, y_crimes = district_map(lon_crimes_list, lat_crimes_list) district_map.plot(x_crimes, y_crimes, 'o', markersize=1, zorder=6, markerfacecolor='#424FA4', markeredgecolor="none", alpha=0.33) # Get the coordinates of the Police Station of the District and plot it. police_coordinates = databases_utils.get_police_station_coordinates(district_number) x_police, y_police = district_map(police_coordinates[1], police_coordinates[0]) district_map.plot(x_police, y_police, marker='D', color='m') plt.annotate('Police Station', xy=(x_police, y_police), xycoords='data', xytext=(district_map(police_coordinates[1]+0.001, police_coordinates[0]+0.001)), textcoords='data', color='m') # Get the coordinates of the address and plot it x_address, y_address = district_map(lon_address, lat_address) district_map.plot(x_address, y_address, marker='D', color='#7FFF00') plt.annotate(street_address, xy=(x_address, y_address), xycoords='data', xytext=(district_map(lon_address + 0.001, lat_address + 0.001)), textcoords='data', color='k') # Plot the boundaries of the Districts district_map.readshapefile('./Databases/districts/geo_fthy-xz3r-1', 'district_m') # Highlight the boundaries of our District of interest with black. ds_1, ds_2 = district_map(district_limits_lon, district_limits_lat) district_map.plot(ds_1, ds_2, linewidth=2, color='#000000') # Set the size of the image and show the plot plt.gcf().set_size_inches(15, 15) plt.show(block=show_district_block)