%matplotlib inline
import pandas as pd
import geopandas as gpd
import matplotlib.pyplot as plt
import numpy as np
import ogr, gdal
import os
import sqlite3
import json
import requests
import shapely
from shapely.geometry import shape
#config
data_folder = 'data/'
layertype = "multipolygons" #Type of features
sqlite_path = data_folder + 'sqlite.db' #location of SQLite file
csv_path = data_folder + 'csv/' #location of csv's on folder
shp_path = data_folder + 'shp/' #location of csv's on folder
geojson_path = data_folder + 'geojson/' #location of csv's on folder
pbf_path = data_folder + 'romania-latest.osm.pbf' #location of PBF file
osrm_server = 'http://192.168.0.5:5000' #osrm
#Define Input datasource
driver = ogr.GetDriverByName('PBF') # Format
data_source = ogr.Open(pbf_path, 0) #open Data
LayerCount = data_source.GetLayerCount()
layers = []
# get Required Layer
for i in range(LayerCount):
layers.append(data_source.GetLayer(i).GetName())
print ("Layers in PBF File : " , layers)
#GeoJSON Example
if os.path.exists(geojson_path):
print ( 'Using Already Converted Files in '+ geojson_path + ' Folder' )
else :
print( 'Converting File ' + pbf_path + " to " + geojson_path )
os.makedirs(geojson_path)
for layer in layers:
dir(os.system('ogr2ogr -f "GeoJSON" ' + geojson_path + layer + '.geojson ' + pbf_path + ' ' + layer))
print ('Done Converting File ' + pbf_path + " to " + geojson_path + layer + '.geojson ')
#spatialReference
WKT_SR = data_source.GetLayer(layertype).GetSpatialRef().ExportToWkt()
layer_file = geojson_path + layertype + '.geojson'
#get GeoDataFrame from geojson
gdf = gpd.read_file(layer_file)
gdf.crs = WKT_SR
gdf1 = gdf[gdf['admin_level'] == '6'].head(10)
gdf1['geometry'].apply(lambda x : direct_localities(x))
route = {
"type": "FeatureCollection",
"name": "route",
"crs": gdf.crs,
"features": [
{ "type": "Feature", "properties": { }, "geometry": "" }
]
}
def check_direct_localities(source, geometry):
centroid = str(geometry.centroid.x) + "," + str(geometry.centroid.y) #get centroid
url = '/route/v1/car/'+ source + ';' + centroid + '?alternatives=0&overview=full&steps=false&annotations=false&geometries=geojson'
response = requests.get(osrm_server + url) #Get Route
try :
response = response.json() # Route to Json
route["features"][0]["geometry"] = response['routes'][0]['geometry'] #convert to json
route_df = gpd.GeoDataFrame.from_features(route['features']) #convert to GeoDataFrame
route_df.crs = route['crs']
if (gpd.sjoin(gdf1, route_df, how="inner", op='intersects').shape[0] > 2): #check if more localities are on route
return 0
else :
return 1
except:
return 0
def direct_localities(polygon):
source = str(polygon.centroid.x) + "," + str(polygon.centroid.y)
gdf1['direct_route'] = gdf1['geometry'].apply(lambda row : check_direct_localities(source, geometry)) #localities are directly connected
return gdf1[gdf1['direct_route'] == 1]['osm_id'].values