Öğretici: Azure Notebooks (Python) kullanarak elektrikli araçları yönlendirme
Azure Haritalar, Geliştiricilerin IoT, mobilite ve varlık izleme gibi çeşitli senaryolar için konum algılamalı uygulamalar oluşturmasına olanak tanıyan, Azure ile tümleştirilmiş jeo-uzamsal hizmet API'lerinden oluşan bir portföydür.
Azure Haritalar REST API'leri jeo-uzamsal veri analizi ve makine öğrenmesi için Python ve R gibi dilleri destekler ve araç türü veya ulaşılabilir alan gibi koşullara göre rotaları hesaplamak için sağlam yönlendirme API'leri sunar.
Bu öğretici, kullanıcılara vs Code ve Python'daki Jupyter Notebook'larla birlikte Azure Haritalar API'lerini kullanarak elektrikli araçları yönlendirme konusunda yol gösterir ve pil azaldığında en yakın şarj istasyonunu bulur.
Bu öğreticide şunları yapacaksınız:
- VS Code'da Jupyter Notebook oluşturun ve çalıştırın.
- Python'da Azure Haritalar REST API'lerini çağır.
- Elektrikli aracın tüketim modeline göre ulaşılabilir bir aralık arayın.
- Ulaşılabilen aralıktaki veya isochrone içindeki elektrikli araç şarj istasyonlarını arayın.
- Ulaşılabilir aralık sınırını ve şarj istasyonlarını harita üzerinde işleyin.
- Sürüş süresine göre en yakın elektrikli araç şarj istasyonuna giden bir rota bulun ve görselleştirin.
Önkoşullar
- Azure Haritalar hesabı
- Abonelik anahtarı
- Visual Studio Code
- VS Code'da Jupyter Notebook'lar hakkında çalışan bir bilgi
- Jupyter Notebooks'ta Python ile çalışacak şekilde ayarlanan ortam. Daha fazla bilgi için bkz . Ortamınızı ayarlama.
Not
Azure Haritalar kimlik doğrulaması hakkında daha fazla bilgi için bkz. Azure Haritalar kimlik doğrulamasını yönetme.
Proje düzeyi paketlerini yükleme
EV Yönlendirme ve Ulaşılabilir Aralık projesinin aiohttp ve IPython python kitaplıklarına bağımlılıkları vardır. Bunları Visual Studio terminalinde pip kullanarak yükleyebilirsiniz:
pip install aiohttp
pip install ipython
Visual Studio Code'da Jupyter Not Defteri'ni açma
İndirdikten sonra bu öğreticide kullanılan Not Defteri'ni açın:
GitHub'daki AzureMapsJupyterSamples deposunda EVrouting.ipynb dosyasını açın.
Dosyayı yerel olarak kaydetmek için ekranın sağ üst köşesindeki Ham dosyayı indir düğmesini seçin.
dosyaya sağ tıklayıp Visual Studio Code ile > Aç'ı seçerek veya VS Code Dosya Gezgini aracılığıyla indirilen Not Defterini Visual Studio Code'da açın.
Gerekli modülleri ve çerçeveleri yükleme
Kodunuz eklendikten sonra, hücrenin solundaki Çalıştır simgesini kullanarak bir hücreyi çalıştırabilirsiniz ve çıkış kod hücresinin altında görüntülenir.
Gerekli tüm modülleri ve çerçeveleri yüklemek için aşağıdaki betiği çalıştırın.
import time
import aiohttp
import urllib.parse
from IPython.display import Image, display
Ulaşılabilir aralık sınırını isteme
Bir paket teslimat şirketi, bazı elektrikli araçları içeren bir filo işletmektedir. Bu araçların depoya dönmeden gün içinde şarj edilmesi gerekiyor. Kalan ücret bir saatin altına düştüğünde, ulaşılabilir bir aralıktaki şarj istasyonlarını bulmak için bir arama yapılır. Bu şarj istasyonlarının aralığı için sınır bilgileri daha sonra elde edilir.
İstenen routeType
, ekonomiyi ve hızı dengelemek için ekodur . Aşağıdaki betik, aracın tüketim modeliyle ilgili parametreleri kullanarak Azure Haritalar yönlendirme hizmetinin Rota Aralığını Al API'sini çağırır. Betik daha sonra yanıtı ayrıştırarak GeoJSON biçiminde bir çokgen nesnesi oluşturur ve aracın maksimum ulaşılabilir aralığını temsil eder.
subscriptionKey = "Your Azure Maps key"
currentLocation = [34.028115,-118.5184279]
session = aiohttp.ClientSession()
# Parameters for the vehicle consumption model
travelMode = "car"
vehicleEngineType = "electric"
currentChargeInkWh=45
maxChargeInkWh=80
timeBudgetInSec=550
routeType="eco"
constantSpeedConsumptionInkWhPerHundredkm="50,8.2:130,21.3"
# Get boundaries for the electric vehicle's reachable range.
routeRangeResponse = await (await session.get("https://atlas.microsoft.com/route/range/json?subscription-key={}&api-version=1.0&query={}&travelMode={}&vehicleEngineType={}¤tChargeInkWh={}&maxChargeInkWh={}&timeBudgetInSec={}&routeType={}&constantSpeedConsumptionInkWhPerHundredkm={}"
.format(subscriptionKey,str(currentLocation[0])+","+str(currentLocation[1]),travelMode, vehicleEngineType, currentChargeInkWh, maxChargeInkWh, timeBudgetInSec, routeType, constantSpeedConsumptionInkWhPerHundredkm))).json()
polyBounds = routeRangeResponse["reachableRange"]["boundary"]
for i in range(len(polyBounds)):
coordList = list(polyBounds[i].values())
coordList[0], coordList[1] = coordList[1], coordList[0]
polyBounds[i] = coordList
polyBounds.pop()
polyBounds.append(polyBounds[0])
boundsData = {
"geometry": {
"type": "Polygon",
"coordinates":
[
polyBounds
]
}
}
Ulaşılabilen menzil içindeki elektrikli araç şarj istasyonlarını arayın
Elektrikli aracın ulaşılabilir menzilini (isochrone) belirledikten sonra, bu alandaki şarj istasyonlarını arayabilirsiniz.
Aşağıdaki betikte aracın maksimum ulaşılabilir aralığındaki şarj istasyonlarını bulmak için geometri api'sinde arama sonrası Azure Haritalar kullanılır. Ardından yanıtı ulaşılabilir konumlardan oluşan bir diziye ayrıştırıyor.
# Search for electric vehicle stations within reachable range.
searchPolyResponse = await (await session.post(url = "https://atlas.microsoft.com/search/geometry/json?subscription-key={}&api-version=1.0&query=electric vehicle station&idxSet=POI&limit=50".format(subscriptionKey), json = boundsData)).json()
reachableLocations = []
for loc in range(len(searchPolyResponse["results"])):
location = list(searchPolyResponse["results"][loc]["position"].values())
location[0], location[1] = location[1], location[0]
reachableLocations.append(location)
Şarj istasyonlarını ve ulaşılabilir aralığı harita üzerinde işleme
Aşağıdaki betiği çalıştırarak statik harita görüntüsünde şarj noktalarını ve ulaşılabilen maksimum sınırı işlemek için Azure Haritalar Harita Görüntüsü Al hizmetini çağırın:
# Get boundaries for the bounding box.
def getBounds(polyBounds):
maxLon = max(map(lambda x: x[0], polyBounds))
minLon = min(map(lambda x: x[0], polyBounds))
maxLat = max(map(lambda x: x[1], polyBounds))
minLat = min(map(lambda x: x[1], polyBounds))
# Buffer the bounding box by 10 percent to account for the pixel size of pins at the ends of the route.
lonBuffer = (maxLon-minLon)*0.1
minLon -= lonBuffer
maxLon += lonBuffer
latBuffer = (maxLat-minLat)*0.1
minLat -= latBuffer
maxLat += latBuffer
return [minLon, maxLon, minLat, maxLat]
minLon, maxLon, minLat, maxLat = getBounds(polyBounds)
polyBoundsFormatted = ('|'.join(map(str, polyBounds))).replace('[','').replace(']','').replace(',','')
reachableLocationsFormatted = ('|'.join(map(str, reachableLocations))).replace('[','').replace(']','').replace(',','')
path = "lcff3333|lw3|la0.80|fa0.35||{}".format(polyBoundsFormatted)
pins = "custom|an15 53||{}||https://raw.githubusercontent.com/Azure-Samples/AzureMapsCodeSamples/e3a684e7423075129a0857c63011e7cfdda213b7/Static/images/icons/ev_pin.png".format(reachableLocationsFormatted)
encodedPins = urllib.parse.quote(pins, safe='')
# Render the range and electric vehicle charging points on the map.
staticMapResponse = await session.get("https://atlas.microsoft.com/map/static/png?api-version=2022-08-01&subscription-key={}&pins={}&path={}&bbox={}&zoom=12".format(subscriptionKey,encodedPins,path,str(minLon)+", "+str(minLat)+", "+str(maxLon)+", "+str(maxLat)))
poiRangeMap = await staticMapResponse.content.read()
display(Image(poiRangeMap))
En uygun şarj istasyonunu bulma
İlk olarak, aracın ulaşılabilir menzili içindeki tüm olası şarj istasyonlarını belirleyin. Ardından, mümkün olan en kısa sürede bu istasyonlardan hangisine erişilebileceğini belirleyin.
Aşağıdaki betik Azure Haritalar Matris Yönlendirme API'sini çağırır. Aracın konumunu, seyahat süresini ve her şarj istasyonuna olan mesafesini döndürür. Sonraki betik, en kısa sürede ulaşabileceğiniz en yakın şarj istasyonunu belirlemek için bu yanıtı ayrıştırıyor.
locationData = {
"origins": {
"type": "MultiPoint",
"coordinates": [[currentLocation[1],currentLocation[0]]]
},
"destinations": {
"type": "MultiPoint",
"coordinates": reachableLocations
}
}
# Get the travel time and distance to each specified charging station.
searchPolyRes = await (await session.post(url = "https://atlas.microsoft.com/route/matrix/json?subscription-key={}&api-version=1.0&routeType=shortest&waitForResults=true".format(subscriptionKey), json = locationData)).json()
distances = []
for dist in range(len(reachableLocations)):
distances.append(searchPolyRes["matrix"][0][dist]["response"]["routeSummary"]["travelTimeInSeconds"])
minDistLoc = []
minDistIndex = distances.index(min(distances))
minDistLoc.extend([reachableLocations[minDistIndex][1], reachableLocations[minDistIndex][0]])
closestChargeLoc = ",".join(str(i) for i in minDistLoc)
En yakın şarj istasyonuna giden yolu hesaplama
En yakın şarj istasyonunu belirledikten sonra, araçların geçerli konumundan ayrıntılı yol tarifleri almak için Yol Tariflerini Al API'sini kullanın. Yolu temsil eden bir GeoJSON nesnesi oluşturmak ve ayrıştırmak için betiği bir sonraki hücrede çalıştırın.
# Get the route from the electric vehicle's current location to the closest charging station.
routeResponse = await (await session.get("https://atlas.microsoft.com/route/directions/json?subscription-key={}&api-version=1.0&query={}:{}".format(subscriptionKey, str(currentLocation[0])+","+str(currentLocation[1]), closestChargeLoc))).json()
route = []
for loc in range(len(routeResponse["routes"][0]["legs"][0]["points"])):
location = list(routeResponse["routes"][0]["legs"][0]["points"][loc].values())
location[0], location[1] = location[1], location[0]
route.append(location)
routeData = {
"type": "LineString",
"coordinates": route
}
Yolu görselleştirme
Yolu görselleştirmek için Harita Görüntüsü Al API'sini kullanarak harita üzerinde işleyin.
destination = route[-1]
#destination[1], destination[0] = destination[0], destination[1]
routeFormatted = ('|'.join(map(str, route))).replace('[','').replace(']','').replace(',','')
path = "lc0f6dd9|lw6||{}".format(routeFormatted)
pins = "default|codb1818||{} {}|{} {}".format(str(currentLocation[1]),str(currentLocation[0]),destination[0],destination[1])
# Get boundaries for the bounding box.
minLon, maxLon = (float(destination[0]),currentLocation[1]) if float(destination[0])<currentLocation[1] else (currentLocation[1], float(destination[0]))
minLat, maxLat = (float(destination[1]),currentLocation[0]) if float(destination[1])<currentLocation[0] else (currentLocation[0], float(destination[1]))
# Buffer the bounding box by 10 percent to account for the pixel size of pins at the ends of the route.
lonBuffer = (maxLon-minLon)*0.1
minLon -= lonBuffer
maxLon += lonBuffer
latBuffer = (maxLat-minLat)*0.1
minLat -= latBuffer
maxLat += latBuffer
# Render the route on the map.
staticMapResponse = await session.get("https://atlas.microsoft.com/map/static/png?api-version=2022-08-01&subscription-key={}&&path={}&pins={}&bbox={}&zoom=16".format(subscriptionKey,path,pins,str(minLon)+", "+str(minLat)+", "+str(maxLon)+", "+str(maxLat)))
staticMapImage = await staticMapResponse.content.read()
await session.close()
display(Image(staticMapImage))
Bu öğreticide, Azure Haritalar REST API'lerini doğrudan çağırmayı ve Python kullanarak Azure Haritalar verileri görselleştirmeyi öğrendiniz.
Bu öğreticide kullanılan Azure Haritalar API'leri hakkında daha fazla bilgi için bkz:
- Yol Tariflerini Alma
- Rota Aralığını Al
- Rota Sonrası Matrisi
- Geometri İçinde Arama Sonrası
- İşleme - Harita Görüntüsü Alma
Azure Haritalar REST API'lerinin tam listesi için bkz. AZURE HARITALAR REST API'leri.