[PYTHON] Ich habe versucht, die Punktgruppendaten-DB der Präfektur Shizuoka mit Vue + Leaflet anzuzeigen

Was ich diesmal gemacht habe

Datenkarte der Präfekturpunktgruppe Shizuoka GitHub - shizokaPCDB スクリーンショット 2020-01-16 1.35.33.png

Hinweis

Dieser Artikel ist kein Artikel, der LIDAR-Daten in der Broschüre anzeigt. Es zeigt die Informationen der Punktgruppendatenbank an (Datenerfassungsort, Erstellungsdatum usw.).

Einführung

スクリーンショット 2020-01-16 1.49.59.png Das Rock Shizuoka Prefectural Office verfügt über eine große Anzahl von LIDAR-Daten von Bauprodukten als offene Daten auf seiner eigenen Website Shizuoka Point Cloud DB (im Folgenden als "Shizuoka PCDB" bezeichnet). Es ist für die Öffentlichkeit zugänglich. Als ich die Quelle aus einer interessenorientierten Perspektive betrachtete, wurde mir klar, dass es möglich sein würde, Daten von außen zu erhalten (da JavaScript direkt in HTML geschrieben wurde). Wie Sie jedoch auf dieser Site und im obigen Bild sehen können, (1) ist die Anzahl der Markierungen groß und die Leistung wird beeinträchtigt, und (2) jedes Mal, wenn sich der Kartenbereich ändert, werden die in diesem Bereich enthaltenen Daten vom Server erfasst und die Leistung verschlechtert sich weiter. Ich dachte, es gibt zwei Probleme: Was ich tat. Ich dachte, dass es Raum für Verbesserungen geben könnte, wenn die Daten von außen bezogen werden könnten, und beschloss, sie weiterzuentwickeln.

Aus diesem Grund senden wir es auf zwei Arten: Zugriff und Formatierung der Datenbank und Anzeige an der Rezeption.

Technologie verwendet

Zugriff und Formatierung der Datenbank

Zugriff

Mit Blick auf die Quelle der Shizuoka-PCDB wurden der Zugriff auf den Server und die Anzeige in Leaflet in etwa 100 Zeilen implementiert. Der Teil, der Daten vom Server abruft, wird unten gezeigt.


var data = { request : "MarkerSet",
                Xmax : map.getBounds().getNorthEast().lng,
                Xmin : map.getBounds().getSouthWest().lng ,
                Ymax : map.getBounds().getNorthEast().lat,
                Ymin : map.getBounds().getSouthWest().lat };
    $.ajax("ankenmapsrc",{
        type: "GET",
        data: data,
        success: function(data, dataType){
            var myIcon = L.icon({
                iconUrl: 'http://cdn.leafletjs.com/leaflet-0.5/images/[email protected]',
                iconSize: [15,25],
                iconAnchor: [5, 5],
            });
//Die folgende Verarbeitung wird fortgesetzt

Wenn Sie mit den Abfragedaten auf ankenmapsrc zugreifen, können Sie die Daten abrufen. Hier haben Daten den Anforderungsnamen "MarkerSet" und Xmax, Xmin, Ymax, Ymin, die den zu erfassenden Bereich angeben. Der von Leaflet angezeigte Bereich wird in den vier Variablen des Bereichs gespeichert. Dieser Vorgang wird jedes Mal aufgerufen, wenn der Anzeigebereich der Broschüre aktualisiert wird. Mit anderen Worten, die Daten werden jedes Mal vom Server erfasst.

Schauen wir uns nun den Rückgabewert dieser Anfrage an.

30XXX01010001:2018 Nagiyama Reflex Furnace Measurement Business:138.96214537214:35.03962001009?
28XXX00030007:Wartungsprojekt für das Gebiet Shiraito no Taki Takimi Bridge Nr. 7:138.58870495572:35.312506370532?
28XXX00030008:Wartungsprojekt für das Gebiet Shiraito no Taki Takimi Bridge Nr. 8:138.58881502806:35.312596432406?
28XXX00030009:Wartungsprojekt für das Gebiet Shiraito no Taki Takimi Bridge Nr. 9:138.58892510063:35.312686494178?
29C2001011361:2017 [29-C2001-Nr. 01] Ausgelagerte Übersicht über Außenwerbung auf der Izu-Halbinsel (Kannan Town Road)_1-Zeile 2):138.93794860595:35.083520492945
...

Ursprünglich gibt es keinen Zeilenumbruch, aber er wird zur Erklärung hinzugefügt. Wenn Sie sich diese Daten ansehen, sehen Sie, dass das Trennzeichen für jede Konstruktion "?" Und das Trennzeichen für jedes Datenelement ":" ist.

Gestaltung

Greifen Sie mit Flask auf Shizuoka PCDB zu und erstellen Sie einen API-Server, der auf die formatierten Daten reagiert.

import urllib.request, urllib.parse
import json
@app.route('/markers')
def getMarkers():
    #Legen Sie den Breiten- und Längengrad einschließlich der gesamten Präfektur Shizuoka als ganzzahligen Wert fest, um alle Fälle zu erfassen.
    xMax = 140
    xMin = 137
    yMax = 36
    yMin = 33

    params = {
        'request':'MarkerSet',
        'Xmax':xMax,
        'Xmin':xMin,
        'Ymax':yMax,
        'Ymin':yMin
    }
    p = urllib.parse.urlencode(params)
    url = "https://pointcloud.pref.shizuoka.jp/lasmap/ankenmapsrc?" + p

    #Fordern Sie mit dem oben generierten URL-Parameter eine Anfrage an SIZUOKA POINT CLOUD DB an und rufen Sie die Zeichenfolge der Materialliste ab
    allAnkenStr = ""
    with urllib.request.urlopen(url) as res:
        allAnkenStr = res.read().decode()

    #Erstellen Sie json, um zurückzukehren
    ankensObj = {
        "ankenList":[]
    }

    ankenList = allAnkenStr.split('?')
    for anken in ankenList:
        ankenInfo = anken.split(':')
        #Wenn unangemessene Daten vorhanden sind, überspringen Sie diese
        if len(ankenInfo) != 4:
            continue

        #Konvertieren Sie den japanischen Kalender in den westlichen Kalender
        yy = int(ankenInfo[0][:2])
        #Reiwa
        if yy < 24:
            yyyy = 2018 + yy
        else:
            yyyy = 1988 + yy

        ankenObj = {
            "no":ankenInfo[0],
            "name":ankenInfo[1],
            "lon":ankenInfo[2],
            "lat":ankenInfo[3],
            "year":yyyy
        }
        ankensObj['ankenList'].append(ankenObj)
    return jsonify(ankensObj)

Zu Beginn erläuterte Probleme (2) Jedes Mal, wenn sich der Kartenbereich ändert, werden die in diesem Bereich enthaltenen Daten vom Server erfasst und die Leistung weiter verringert. Es wurde gelöst von. Das liegt daran, dass die Gesamtzahl der Fälle etwa 1400 betrug und es nicht zu spät war, alle tatsächlich zu bekommen. Deshalb kamen wir zu dem Schluss, dass wir alle zuerst bekommen sollten.

Wir haben uns entschlossen, die erfassten Ankendaten zu analysieren und die Konstruktionsnummer, den Konstruktionsnamen, den Längen- / Breitengrad und das Baujahr als json zurückzugeben.

Anzeige vorne

Verbleibende Probleme (1) Die Anzahl der Marker ist groß und die Leistung wird beeinträchtigt, aber ich dachte, dass dies gelöst werden würde, wenn es mit Mapbox GL JS angezeigt würde, das schnell arbeitet. Als ich es implementierte, wurde die Markierungsanzeige jedoch langsamer als die Broschüre. Also habe ich dieses Problem gelöst, indem ich Leaflet's Marker Cluster übernommen habe.

In Bezug auf die Umgebungskonstruktion von Leaflet und Vue Try # 027 - Ich habe versucht, die Entwicklungsumgebung von Leaflet und Mapbox GL JS mit Vue.js zu erstellen Ich werde es weglassen, weil es detailliert ist. Installieren Sie außerdem vue2-leaflet-markercluster.

npm install vue2-leaflet-markercluster

Asynchrone Kommunikation zum API-Server mit Vue

Verwenden Sie die Fetch-API. Holen Sie sich die Daten mit App.vue und übergeben Sie sie an MapPane.vue.

App.vue


<MapPane :ankens="ankens"/>

App.vue


  data() {
    return {
      ankens:[],
    }
  },
  created() {
    let vm = this
    fetch("/markers")
    .then(response => {
        return response.json()
    })
    .then(data => {
        //Nach dem Sortieren übergebe ich Daten
        vm.ankens = data.ankenList.sort(function (a, b) {
            if (a.no < b.no) {
                return 1
            }
            if (a.no > b.no) {
                return -1
            }
            return 0 
        }).sort(function (a, b) {
            if (a.year < b.year) {
                return 1
            }
            if (a.year > b.year) {
                return -1
            }
            return 0 
        })
    })
    .catch(error => {
        console.log(error)
        alert("Ein Fehler ist aufgetreten.")
    });
  }

MapPane.vue


<template>
    <div class="mapPane">
        <l-map
            :zoom="zoom"
            :center="center"
            :preferCanvas="true"
        >
            <l-control-scale
                position="bottomleft"
                :imperial="false"
                :metric="true"
            ></l-control-scale>

            <l-tile-layer
                :name="tileProvider.name"
                :visible="tileProvider.visible"
                :url="tileProvider.url"
                :attribution="tileProvider.attribution"
            ></l-tile-layer>

            <Vue2LeafletMarkerCluster :options="clusterOptions" >
                <LMarker v-for="anken in ankens" :key="anken.no" :lat-lng="makeLatLng(anken)" @click="onMarkerClick(anken.no)">
                    <LPopup :content="makeMarkerContent(anken)" ></LPopup>
                </LMarker>
            </Vue2LeafletMarkerCluster>
        </l-map>
    </div>
</template>

MapPane.vue



props: {
    ankens:Array
},

MapPane.vue


<style scoped>
    @import "~leaflet.markercluster/dist/MarkerCluster.css";
    @import "~leaflet.markercluster/dist/MarkerCluster.Default.css";

</style>

Wickeln Sie LMarker in Vue2LeafletMarkerCluster ein und es wird funktionieren. Infolgedessen bilden die engen Markierungen Cluster und werden zusammen als ein Merkmal angezeigt, bis sie vergrößert werden. Infolgedessen wurde auch Problem (1) gelöst.

abschließend

In Zukunft möchte ich in der Lage sein, die Liste der Daten zu sortieren, zu durchsuchen und die zu ladende Animation anzuzeigen. Als ich die LIDAR-Daten nachgeschlagen habe, bin ich bei Shizuoka PCDB angekommen, aber es war eine unerwartet große Entgleisung. Herr Shizuoka, der eine so große Menge wertvoller Daten als offene Daten verwendet, ist wirklich Rock, und in letzter Zeit scheint sich die Präfektur Hyogo den Reihen der Rocker angeschlossen zu haben. ](Https://qiita.com/Yfuruchin/items/2a9b017d840c46c37f3e) Ich bin der Meinung, dass sich dieses Projekt ein wenig vom Mainstream der offenen Datennutzung unterscheidet, aber zumindest denke ich, dass es sich selbst verbessert hat. Ich möchte weiterhin eine Antenne im offenen Datenbereich aufstellen.

Recommended Posts

Ich habe versucht, die Punktgruppendaten-DB der Präfektur Shizuoka mit Vue + Leaflet anzuzeigen
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich habe versucht, die Laufdaten des Rennspiels (Assetto Corsa) mit Plotly zu visualisieren
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe versucht, die Daten des Fußballturniers der FIFA Fussball-Weltmeisterschaft Russland mit Fußball zu analysieren
Ich habe versucht, die Bewässerung des Pflanzgefäßes mit Raspberry Pi zu automatisieren
Ich habe versucht, die Größe des logischen Volumes mit LVM zu erweitern
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Ich habe versucht, die Bewegungen von Wiire-Playern automatisch mit Software zu extrahieren
Ich habe versucht, die Negativität von Nono Morikubo zu analysieren. [Vergleiche mit Posipa]
Ich habe versucht, die Standardrolle neuer Mitarbeiter mit Python zu optimieren
Ich habe versucht, den Text des Romans "Wetterkind" mit Word Cloud zu visualisieren
Ich habe versucht, die Filminformationen der TMDb-API mit Python abzurufen
Ich habe versucht, den Höhenwert von DTM in einem Diagramm anzuzeigen
Ich habe versucht, das Verhalten des neuen Koronavirus mit dem SEIR-Modell vorherzusagen.
Ich habe versucht, die statistischen Daten der neuen Corona mit Python abzurufen und zu analysieren: Daten der Johns Hopkins University
Da es der 20. Jahrestag der Gründung ist, habe ich versucht, die Texte von Parfüm mit Word Cloud zu visualisieren
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Ich habe versucht, die Tweets von JAWS DAYS 2017 mit Python + ELK einfach zu visualisieren
[IBM Cloud] Ich habe versucht, über Cloud Funtions (Python) auf die Tabelle Db2 on Cloud zuzugreifen.
Ich habe versucht, die Daten des Laptops durch Booten unter Ubuntu zu retten
[Überprüfung] Versuchen Sie, die Punktgruppe an der Optimierungsfunktion von Pytorch Part 1 auszurichten
Die Geschichte von soracom_exporter (Ich habe versucht, SORACOM Air mit Prometheus zu überwachen)
Ich habe versucht, den Grad der Koronavirusinfektion auf der Seekarten-Wärmekarte anzuzeigen
Ich habe versucht, ein Modell mit dem Beispiel von Amazon SageMaker Autopilot zu erstellen
Ich habe versucht, die Literatur des neuen Corona-Virus mit Python automatisch an LINE zu senden
Ich habe versucht, die Sündenfunktion mit Chainer zu trainieren
Ich habe versucht, Funktionen mit SIFT von OpenCV zu extrahieren
Ich habe versucht, die Grundform von GPLVM zusammenzufassen
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich habe versucht, das Spiel in der J League vorherzusagen (Datenanalyse)
Ich habe versucht, Soma Cube mit Python zu lösen
Ich habe versucht, eine ML-Pipeline mit Cloud Composer zu erstellen
Ich habe versucht, die API von Sakenowa Data Project zu verwenden
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
Ich habe versucht, den negativen Teil von Meros zu löschen
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe versucht, die Stimmen der Sprecher zu klassifizieren
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Ich habe versucht, mit dem Seq2Seq-Modell von TensorFlow so etwas wie einen Chatbot zu erstellen
Ich habe versucht, das Artikel-Update des Livedoor-Blogs mit Python und Selen zu automatisieren.
Ich habe versucht, die Eigenschaften der neuen Informationen über mit dem Corona-Virus infizierte Personen mit Wordcloud zu visualisieren
[Erste Datenwissenschaft ⑥] Ich habe versucht, den Marktpreis von Restaurants in Tokio zu visualisieren
Ich wollte nur die Daten des gewünschten Datums und der gewünschten Uhrzeit mit Django extrahieren
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit dplyr von R und pandas von Python zu vergleichen
Beim 15. Offline-Echtzeitversuch habe ich versucht, das Problem des Schreibens mit Python zu lösen
Ich habe Python satt, also habe ich versucht, die Daten mit nehan zu analysieren (ich möchte sogar mit Corona live gehen) - Teil 2)
Ich habe Python satt, also habe ich versucht, die Daten mit nehan zu analysieren (ich möchte sogar mit Corona live gehen) - Teil 1)
[Pferderennen] Ich habe versucht, die Stärke des Rennpferdes zu quantifizieren
Ich habe versucht zu simulieren, wie sich die Infektion mit Python ausbreitet
Ich habe versucht, die Emotionen des gesamten Romans "Wetterkind" zu analysieren
Ich habe versucht, die Standortinformationen des Odakyu-Busses zu erhalten