[PYTHON] Holen Sie sich die Adresse von Längen- und Breitengrad

Wir werden ein Programm veröffentlichen, das anhand der veröffentlichten Polygondaten nach Polygonen sucht, die bestimmte Koordinaten enthalten. Das Abrufen einer Adresse aus Längen- und Breitengrad wird als umgekehrte Geokodierung bezeichnet.

Wenn Sie keine Polygondaten haben, wird die umgekehrte Geokodierung auch von der Google Maps-API usw. bereitgestellt und ist einfach zu verwenden. Wenn Sie über Polygondaten verfügen und die umgekehrte Geokodierung durchführen möchten, können Sie auch die GIS-Funktion einer Datenbank wie MySQL verwenden.

Diesmal handelt es sich um ein Python-Programm, mit dem Sie bestimmen möchten, welche Stadt, Gemeinde, Stadt oder welches Dorf in Japan zu einer großen Anzahl von Koordinaten gehört. Selbst ein kleines Fischprogramm, das jedes Mal einen Index generiert, hat viele Koordinaten, sodass die Ausführung weniger Zeit in Anspruch nahm als bei Verwendung von MySQL 5.6.

Vorteile der Verwendung von MySQL:

Fehler:

――Sie benötigen Polygondaten, die der gewünschten Adressenebene entsprechen (Polygone auf Adressenebene sind möglicherweise nicht einfach verfügbar).

Grund für die Implementierung in Python:

――Sie müssen nicht so detailliert sein wie die Adressenebene

Erforderliche Bibliotheken

`Pip install rtree shapeely `allein funktioniert möglicherweise nicht, da abhängige Bibliotheken vorhanden sind. Lesen Sie daher bitte jedes Dokument zur Installation.

Übereinstimmende Adressen aus Längen- und Breitengrad

Sie können dies mit rtree und Shapely schreiben.

revgeocoder.py


# -*- coding: utf-8 -*-

import collections
from shapely.geometry import Polygon, Point
from rtree import index

Area = collections.namedtuple('Area', ['area_id', 'polygon'])


class ReverseGeocoder():
    def __init__(self):
        self.idx = index.Index()

    def insert_from_iterator(self, itr):
        '''(id, Polygon)Erstellen Sie einen Rtree aus einem Iterator, der zurückgibt

        Polygon.Rtree basierend auf gebundenen Holds ID und Polygon erstellt.

        Args:
            itr: (id, Polygon)Iterator, der zurückkehrt
        '''
        for i, (area_id, polygon) in enumerate(itr):
            obj = Area(area_id=area_id, polygon=polygon)
            self.idx.insert(i, polygon.bounds, obj)

    def contains(self, lat, lon):
        '''Point(lat, lon)Polygonbereich einschließlich_Gibt die ID zurück.

Wenn es mit zwei oder mehr Polygonen übereinstimmt, wird es sortiert und in aufsteigender Reihenfolge der Fläche zurückgegeben.
(Wenn es einen Bereich gibt, der eine Einschlussbeziehung hat, ist es besser, den mit dem kleineren Bereich auszuwählen.
In Wirklichkeit gibt es jedoch eine Überlappung zwischen Polygon und Polygon ... )
        '''
        result = []
        point = Point(lat, lon)
        for hit in self.idx.intersection(point.bounds, objects=True):
            if hit.object.polygon.contains(point):
                result.append(hit.object)
        if len(result) > 1:
            result.sort(key=lambda x: (x.polygon.area, x.area_id))
        return [r.area_id for r in result]

    def __repr__(self):
        return '<ReverseGeocoder contains {} polygons>'.format(self.idx.count(self.idx.bounds))

Wie benutzt man

Wenn Sie die Grenzdaten verwenden, die von e-stat heruntergeladen werden können, sieht dies folgendermaßen aus.

findcity.py


# -*- coding: utf-8 -*-

import glob
import fiona
from shapely.geometry import Polygon, shape
from revgeocoder import ReverseGeocoder


def parse_shapefile(shapefile):
    '''(area_id, Polygon, name)Generator, der zurückgibt'''
    with fiona.open(shapefile, 'r') as source:
        for obj in source:
            #Polygondaten
            polygon = shape(obj['geometry'])

            #Adresse des Gebiets
            names = []
            for prop in ['KEN_NAME', 'GST_NAME', 'CSS_NAME', 'MOJI']:
                if obj['properties'][prop] is not None:
                    names.append(obj['properties'][prop])
            name = ''.join(names)

            #Generieren Sie eine eindeutige ID (KEN+ CITY + SEQ_NO2)
            area_id = int(''.join(map(str, (obj['properties']['KEN'], obj['properties']['CITY'], obj['properties']['SEQ_NO2']))))

            yield area_id, polygon, name


def main():
    shapefiles = glob.glob('data/japan-shape/A002005212010DDSWC3520*/*.shp')
    print('Shapefiles:', shapefiles)

    #Machen Sie einen Index
    rgeocoder = ReverseGeocoder()
    id2name = {}
    def gen(shapefile):
        for area_id, polygon, name in parse_shapefile(shapefile):
            id2name[area_id] = name
            yield area_id, polygon

    for shapefile in shapefiles:
        rgeocoder.insert_from_iterator(gen(shapefile))

    # test
    area_id = rgeocoder.contains(132.257269, 34.108815)[0]
    print(area_id, id2name[area_id])

    return rgeocoder


if __name__ == '__main__':
    rgeocoder = main()

Ausführungsbeispiel:

$ python findcity.py
Shapefiles: ['data/japan-shape/A002005212010DDSWC35208/h22ka35208.shp', 'data/japan-shape/A002005212010DDSWC35207/h22ka35207.shp', 'data/japan-shape/A002005212010DDSWC35201/h22ka35201.shp', 'data/japan-shape/A002005212010DDSWC35203/h22ka35203.shp', 'data/japan-shape/A002005212010DDSWC35206/h22ka35206.shp', 'data/japan-shape/A002005212010DDSWC35202/h22ka35202.shp', 'data/japan-shape/A002005212010DDSWC35204/h22ka35204.shp']
35208602 6-chome, Sofucho, Stadt Iwakuni, Präfektur Yamaguchi

Vergleich mit anderen ähnlichen Bibliotheken

Recommended Posts

Holen Sie sich die Adresse von Längen- und Breitengrad
Holen Sie sich eine Adresse aus einer Postleitzahl
Informationen zum Standort (Breiten- und Längengrad) erhalten Sie von der Adresse. Geocode in Python ~ Geocoder und Pydams ~
Finden Sie die Entfernung von Breite und Länge (unter Berücksichtigung der Rundheit der Erde).
Finden Sie den Wegpunkt aus dem Breiten- und Längengrad (unter Berücksichtigung der Rundheit der Erde).
Laden Sie die Kacheln des Geographical Institute von Längen- und Breitengrad herunter
So erhalten Sie den Pixelwert des Punkts aus dem Satellitenbild, indem Sie den Breiten- und Längengrad angeben
Geben Sie Breiten- und Längengradpunktsequenzdaten an und versuchen Sie, die Straße anhand von OpenStreetMap-Daten zu identifizieren
So erhalten Sie mithilfe der Mastodon-API Follower und Follower von Python
Holen Sie sich die IP-Adresse des Kunden mit Django
Holen Sie sich WordPress-Beiträge aus der letzten Woche
[Python] Holen Sie sich die Hauptfarbe aus dem Screenshot
Holen Sie sich nur den Text aus dem Django-Formular.
[GPS] Berechnen Sie Entfernung, Azimutwinkel und Höhenwinkel aus GPS-Breiten- und Längengrad mit pyproj
Holen Sie sich den Inhalt von Git Diff aus Python
Holen Sie sich das Modul selbst und fügen Sie Mitglieder dynamisch hinzu
Erhalten Sie mit QGIS Längen- und Breitengrade in Metern
Holen Sie sich nur den Adressteil der Netzwerkkarte (eth0)
Holen Sie sich beliebte Tweets von der Twitter-Timeline, listen Sie sie auf und absolvieren Sie Tsui Abolition
Übergeben Sie ein Array von PHP an PYTHON und führen Sie eine Numpy-Verarbeitung durch, um das Ergebnis zu erhalten
Holen Sie sich den Titel der Yahoo News und analysieren Sie die Stimmung
[Python] Ruft den Gesetzestext aus der e-GOV-Gesetz-API ab
Holen Sie sich den Rückkehrcode eines Python-Skripts von bat
[Version 2020] Scraping und Verarbeitung des Textes von Aozora Bunko
Holen Sie sich mit der Geoindex-Bibliothek von Python nahegelegene Längen- und Breitengrade
Ungefähr 200 Breiten- und Längengraddaten für Krankenhäuser in Tokio
Erhalten Sie Kommentare und Abonnenten mit der YouTube-Daten-API
Erhalten Sie E-Mails von Google Mail und beschriften Sie sie mit Python3
[Django 2.2] Sortieren und erhalten Sie den Wert des Beziehungsziels
Holen Sie sich Dateien von Linux mit paramiko und scp [Python]
YOLP: Extrahieren Sie Längen- und Breitengrade mit der Yahoo! Geocoder-API.
[Linux] [C / C ++] So ermitteln Sie den Wert der Rücksprungadresse einer Funktion und den Funktionsnamen des Aufrufers
Holen Sie sich die GNOME-Version
Holen Sie sich den MIME-Typ
Holen Sie sich ein Bild von einer Webseite und ändern Sie die Größe
DJango Hinweis: Von Anfang an (Vereinfachung und Aufteilung von URLConf)
Holen Sie sich Ihre Herzfrequenz von der Fitbit-API in Python!
Abrufen und Erstellen von Knoten, die in der neuen Version hinzugefügt und aktualisiert wurden
Anfänger erhalten Qiita-Tag-Informationen und visualisieren und betrachten das TOP10.
Holen Sie sich den MIME-Typ in Python und bestimmen Sie das Dateiformat
Implementieren Sie die Standortsuche nach Breiten- und Längengrad mit Redis und redis-py
Durchsuche den pandas.DataFrame mit einer Variablen und erhalte die entsprechende Zeile.
Rufen Sie den Wert ab, während Sie den Standardwert aus dict in Python angeben
So erhalten Sie alle Schlüssel und Werte im Wörterbuch
Ich habe versucht, verschiedene Informationen von der Codeforces-API abzurufen
Machen Sie ein BLE-Thermometer und ermitteln Sie die Temperatur mit Pythonista3
Holen Sie sich das Wetter mit API und lassen Sie Raspberry Pi sprechen!
Ich möchte Informationen von fstab am ssh-Verbindungsziel abrufen und den Befehl ausführen
[Kartenanzeige] Zeigen Sie eine Karte anhand der vom Benutzer registrierten Adresse mit der JavaScript-API und der Geokodierungs-API von Google Maps an!
Holen Sie sich Informationen von der Meteorological Agency und benachrichtigen Sie Slack über Wetterwarnungen in den 23 Bezirken von Tokio
Programmgesteuert eine lokale IP-Adresse abrufen
Holen Sie sich die IP-Adresse des Kunden mit Django
Holen Sie sich Ihre eigene IP-Adresse in Python
Konvertieren Sie die IP-Adresse in eine Dezimalzahl
Holen Sie sich eine Adresse aus einer Postleitzahl
Wie bekomme ich IP bei Tornado + Nginx
Holen Sie sich mit Docker eine lokale Umgebung für DynamoDB
Übersetzen Sie den IP-Adressbereich 1: 1 in ein anderes Subnetz
Holen Sie sich die Adresse von Längen- und Breitengrad