Dichtstbijzijnde faciliteit zoeken met Origin-Destination Matrix (QGIS3)

In de vorige handleiding, Basis netwerk visualisatie en routeren (QGIS3), leerden we hoe een netwerk te bouwen en het kortste pad tussen 2 punten te berekenen. We kunnen die techniek ook toepassen voor verschillende typen op netwerken gebaseerde analyses. Een van die toepassingen is om de Origin-Destination Matrix of OD Matrix te berekenen. Gegeven een set van punten van origine en een andere set voor bestemmingspunten kunnen we het kortste pad berekenen tussen elke paar van origine-bestemming en de reisafstand/tijd daartussen berekenen. Een dergelijke analyse is nuttig om de dichtstbijzijnde faciliteit tot een bepaald punt te lokaliseren. Een logistiek bedrijf zou, bijvoorbeeld, deze analyse kunnen gebruiken om de dichtstbijzijnde opslagplaats voor hun klanten te zoeken om bestelroutes te optimaliseren. Hier gebruiken we het algoritme Distance Matrix uit de plug-in QGIS Network Analysis Toolbox (QNEAT3) om de dichtstbijzijnde gezondheidsfaciliteit voor elk adres in de stad te zoeken.

Notitie

Deze handleiding laat zien hoe uw eigen gegevens voor een netwerk te gebruiken om een origin-destination matrix te berekenen. Als u geen gegevens heeft voor een eigen netwerk kunt u de ORS Tools Plugin en het algoritme ORS Tools ‣ Matrix ‣ Matrix from Layers gebruiken om een soortgelijke analyse uit te voeren met behulp van gegevens van OpenStreetMap. Bekijk Analyse Servicegebied met Openrouteservice (QGIS3) om te leren hoe de plug-in ORS Tools te gebruiken.

Overzicht van de taak

We zullen 2 lagen nemen voor Washington DC - een met punten die adressen weergeven en een andere met punten die faciliteiten voor geestelijke gezondheid weergeven - en de faciliteit zoeken met de minste reisafstand vanaf elk adres.

Andere vaardigheden die u zult leren

  • Een laagsgewijze willekeurig monster uit een puntenlaag uitnemen.

  • Virtuele lagen gebruiken om een query van SQL uit te voeren op een laag van QGIS.

  • De Python Console Editor gebruiken om een script voor PyQGIS uit te voeren.

De gegevens ophalen

De overheid van het district of Columbia deelt gratis honderden gegevenssets in de Open Data Catalog.

Download de volgende gegevenslagen als Shapefiles.

Voor het gemak kunt u direct een kopie van de gegevensset downloaden vanaf de links hieronder:

Street_Centerlines.zip

Address_Points.zip

Adult_Mental_Health_Providers.zip

Gegevensbron: [DCOPENDATA]

Instellen

Ga naar Plug-ins ‣ Plug-ins beheren en installeren. Zoek naar de plug-in QNEAT3 en installeer die. Klik op Close.

../../_images/setup11.png

Procedure

  1. Zoek in het paneel Browser naar het bestand Street_Centerlines.zip. Vergroot het en sleep het bestand Street_Centerlines.shp naar het kaartvenster. Zoek op dezelfde wijze naar het bestand Adult_Mental_Health_Providers.zip, vergroot het en voeg Adult_Mental_Health_Providers.shp toe aan het kaartvenster.

../../_images/170.png
  1. Zoek vervolgens naar het bestand Address_Points.zip, vergroot het en voeg het bestand Address_Points.shp toe. U zult heel veel punten zien in de stad. Elke punt geeft een geldig adres weer. We zullen nu willekeurig 1 punt in elke wijk selecteren om als punt van origine te gebruiken. Deze techniek wordt stratified sampling (laagsgewijze monsterneming) genoemd. Ga naar Processing ‣ Toolbox.

../../_images/237.png
  1. Zoek en lokaliseer het algoritme Vector selectie ‣ Willekeurige selectie binnen subsets.

../../_images/328.png
  1. Selecteer Address_Points als de Invoerlaag. Elk punt voor een adres bevat een attribuut genaamd WARD_2012 waarin het nummer voor de wijk is gekoppeld aan het adres. We gebruiken dat attribuut als het Veld ID omdat we slechts 1 punt per wijk willen. Stel Aantal/percentage geselecteerde objecten in op 1. Klik op Uitvoeren.

../../_images/414.png
  1. Een nieuwe laag Uitgenomen (willekeurig gestratificeerd) zal worden toegevoegd aan het paneel Lagen.

../../_images/514.png
  1. Schakel de zichtbaarheid van de laag Address_Points uit. Klik met rechts op de laag Uitgenomen (willekeurig gestratificeerd) en selecteer Laag hernoemen.

../../_images/614.png
  1. Laten we deze laag hernoemen naar origin_points. Hernoem op soortgelijke wijze de laag Adult_Mental_Health_Providers die de faciliteiten voor geestelijke gezondheid weergeeft als destination_points. Het op deze manier hernoemen van de lagen maakt het eenvoudiger om ze te identificeren in de aansluitende verwerking. Ga naar Processing ‣ Toolbox.

../../_images/713.png
  1. Zoek naar het algoritme QNEAT3 ‣ Distance matrices ‣ OD Matrix from Layers as Table (m:n). Als u dit algoritme niet ziet in de Toolbox, overtuig u er dan van dat u de plug-in QNEAT3 hebt geïnstalleerd.

../../_images/813.png
  1. Dit algoritme helpt bij het zoeken naar de afstanden langs het netwerk tussen geselecteerde lagen voor origine en bestemming. Selecteer Street_Centerlines als de Network layer. Selecteer origin_points als de From-Points layer en OBJECTID als de Unique Point ID field. Stel op soortgelijke wijze destination_points in als de To-Points Layer en OBJECTID als het Unique Point ID field. Stel Optimization Criterion in op Shortest Path.

../../_images/913.png
  1. Omdat veel straten in het netwerk een-richting zijn, moeten we de Advanced parameters instellen om de richting te specificeren. Bekijk Basis netwerk visualisatie en routeren (QGIS3) voor meer details over hoe deze attributen zijn gestructureerd. Kies DIRECTIONA als het Direction field. Voer One Way (Digitizing direction) als de waarde voor Value for forward direction en One way (Against digitizing direction) als die voor Value for backward direction. Laat de andere waarden op hun standaard waarde staan en klik op Uitvoeren.

../../_images/1013.png
  1. Een nieuwe tabellaag, genaamd Output OD Matrix, zal worden toegevoegd aan het paneel Lagen. Klik met rechts en selecteer Attributentabel openen. U zult zien dat de tabel 117 rijen bevat. We hadden 9 punten van origine en 13 bestemmingspunten - dus de uitvoer bevat 9x13 = 117 paren voor origine en bestemming. De kolom total_cost bevat de afstand in meters tussen elk punt van origine tot elke bestemmingspunt.

../../_images/1117.png
  1. Voor deze handleiding zijn we alleen geïnteresseerd in het bestemmingspunt met de kortste afstand. We kunnen een query voor SQL maken om de bestemming met de minste total_cost uit alle bestemmingen te kiezen. Ga naar Database ‣ DB Manager..

../../_images/1214.png
  1. Selecteer, in het dialoogvenster DB Manager, de optie Virtuele lagen ‣ Project-lagen ‣ Output OD Matrix uit het paneel aan de linkerkant. Bekijk de documentatie Virtuele lagen om meer te leren. Klik op de knop SQL-venster.

../../_images/1314.png
  1. Voer de volgende query in en klik op Uitvoeren. De resultaten zullen worden weergegeven in het paneel eronder. Zoals verwacht hebben we nu 9 rijen in het resultaat - de bestemming via het kortste pad naar elk punt van origine. Selecteer Als nieuwe laag laden en selecteer origin_id als Kolom met unieke waarden. Voer``nearest_destinations`` in als de Laagnaam (prefix). Klik op Laden.

select origin_id, destination_id, min(total_cost) as shortest_distance
from 'Output OD Matrix' group by origin_id
../../_images/1412.png
  1. Een nieuwe virtuele laag nearest_destinations zal worden toegevoegd aan het paneel Lagen. Deze tabel bevat de resultaten van onze analyse. Het dichtstbijzijnde centrum voor geestelijke gezondheid voor elk van de 9 punten van origine. Laten we eens een paar verschillende manieren proberen om deze resultaten te visualiseren en te valideren. Ga naar Processing ‣ Toolbox. Zoek en lokaliseer het algoritme Attributen koppelen op veldwaarde. Dubbelklik erop om het te openen.

../../_images/1512.png
  1. Selecteer origin_points als de Invoerlaag en OBJECTID als het Tabelveld. Stel nearest_destinations in als de Invoerlaag 2 en origin_id als het Tabelveld 2. Klik op de knop naast Velden van laag 2 om te kopiëren en selecteer destination_id en shortest_distance. Klik op Uitvoeren.

../../_images/1610.png
  1. Een nieuwe Samengevoegde laag zal worden toegevoegd aan het paneel Lagen. Deze laag heeft het attribuut ID van de nearest destination voor elk punt van origine. We kunnen nu een naaf-spaak visualisatie met deze laag maken. Zoek naar het algoritme Vector analyse ‣ Samenvoegen op lijnen (naaflijnen). Klik er met rechts op om het te openen.

../../_images/1711.png
  1. Selecteer destination_points als de Naaf puntlaag en OBJECTID als het Naaf ID-veld. Selecteer Samengevoegde laag` als de :guilabel:`Spaak puntlaag` en ``destination_id als het Spaak ID-veld. Klik op Uitvoeren.

../../_images/1810.png
  1. Als de verwerking eenmaal is voltooid zal een nieuwe laag Naaflijnen worden toegevoegd aan het paneel Lagen. Deze laag geeft de lijnen weer die elk punt van origine verbinden met de dichtstbijzijnde bestemming.

../../_images/199.png
  1. Onthoud dat hoewel de lijnen het punt van origine en de bestemming verbinden met een rechte lijn, de bestemming werd gevonden met de afstand langs het netwerk. Het zal veel nuttiger zijn als de visualisatie het feitelijke kortste pad weergeeft tussen elk punt van origine en bestemming. Vanaf hier is er geen eenvoudige manier om het kortste pad te maken tussen meerdere paren origine-bestemming op de manier waarop we de afstandsmatrix hebben gemaakt. Maar ik zal een manier demonstreren om wat scripten voor Python te gebruiken om deze visualisatie te maken. Laten we eerst het algoritme voor het kortste pad uitvoeren op 1 paar. Zoek naar het algoritme QNEAT3 ‣ Routing ‣ Shortest path (point to point) en start het.

../../_images/207.png
  1. Selecteer, in het dialoogvenster Kortste pad (punt naar punt), Street_Centerlines als de Vectorlaag die netwerk weergeeft. Behoud het Te berekenen type pad als Kortste. Vervolgens dienen we een begin- en eindpunt te kiezen. U kunt op de knop klikken en op een willekeurig punt in het kaartvenster klikken. Vergroot het gedeelte Gevorderde parameters. Kies DIRECTIONA als het Richtingsveld. Voer One Way (Digitizing direction) in als de Waarde voor voorwaartse richting en One way (Against digitizing direction) als de Waarde voor achterwaartse richting. Laat de andere waarden op hun standaard waarden staan en klik op Uitvoeren.

../../_images/2113.png
  1. Een nieuwe laag Shortest Path Layer zal worden toegevoegd aan het paneel Lagen. U zult zien dat dit pad het netwerk volgt in plaats van het punt van origine en bestemming te verbinden met een rechte lijn. De reden dat we het algoritme uitvoerden op 1 paar is om eenvoudig de waarden voor de parameters te identificeren die we in ons script kunnen gebruiken. Selecteer zowel Naaflijnen als Shortest Path layer, klik met rechts en selecteer Laag verwijderen. Klik op de knop Geschiedenis in de Toolbox van Processing.

../../_images/2211.png
  1. Kies het bovenste algoritme en u zult de volledige opdracht zien weergegeven in het paneel eronder. Kopieer de opdracht en klik op Close.

../../_images/238.png
  1. Ga naar Plug-ins ‣ Python Console.

../../_images/246.png
  1. Klik op de knop Editor tonen in de Python Console.

../../_images/255.png
  1. Kopieer/plak het volgende script in het venster van de bewerker. Dit script gebruikt de waarden van de parameters uit de geschiedenis van Processing die we eerder zagen. Klik op de knop Script uitvoeren om de uitvoering te starten.

../../_images/265.png
origin_layer =  QgsProject.instance().mapLayersByName('origin_points')[0]
destination_layer =  QgsProject.instance().mapLayersByName('destination_points')[0]
matrix =  QgsProject.instance().mapLayersByName('nearest_destinations')[0]

for f in matrix.getFeatures():
    origin_expr = QgsExpression('OBJECTID={}'.format(f['origin_id']))
    destination_expr = QgsExpression('OBJECTID={}'.format(f['destination_id']))
    origin_feature = origin_layer.getFeatures(QgsFeatureRequest(origin_expr))
    origin_coords =  [(f.geometry().asPoint().x(), f.geometry().asPoint().y())
        for f in origin_feature]
    destination_feature = destination_layer.getFeatures(QgsFeatureRequest(destination_expr))
    destination_coords =  [(f.geometry().asPoint().x(), f.geometry().asPoint().y())
        for f in destination_feature]
    params = {
        'INPUT':'Street_Centerlines',
        'START_POINT':'{},{}'.format(origin_coords[0][0], origin_coords[0][1]),
        'END_POINT':'{},{}'.format(destination_coords[0][0], destination_coords[0][1]),
        'STRATEGY':0,
        'ENTRY_COST_CALCULATION_METHOD':0,
        'DIRECTION_FIELD':'DIRECTIONA',
        'VALUE_FORWARD':'One Way (Digitizing direction)\n',
        'VALUE_BACKWARD':'One way (Against digitizing direction)\n',
        'VALUE_BOTH':'',
        'DEFAULT_DIRECTION':2,
        'SPEED_FIELD':None,
        'DEFAULT_SPEED':5,
        'TOLERANCE':0,
        'OUTPUT':'memory:'}
    print('Executing analysis')
    processing.runAndLoadResults("qneat3:shortestpathpointtopoint", params)
  1. Het script zal enkele minuten duren om te worden uitgevoerd. Als het eenmaal is voltooid zult u 9 nieuwe lagen zien, genaamd Shortest Path layer. Laten we deze paden samenvoegen tot één enkele laag. Zoek naar het algoritme Vector algemeen ‣ Vectorlagen samenvoegen en start het.

../../_images/275.png
  1. Selecteer alle 9 Shortest Path layer als de Invoerlagen. Klik op Uitvoeren.

../../_images/285.png
  1. Een nieuwe laag Samengevoegd zal worden gemaakt die de kortste paden zal bevatten tussen onze punten van origine en bestemming.

../../_images/294.png
comments powered by Disqus

This work is licensed under a Creative Commons Attribution 4.0 International License