Geokodiranje za podatkovne znanstvenike - KDnuggets

Geokodiranje za podatkovne znanstvenike – KDnuggets

Izvorno vozlišče: 2713218

Ko morajo podatkovni znanstveniki vedeti vse, kar je treba vedeti o tem, kje so njihovi podatki, se pogosto obrnejo na geografske informacijske sisteme (GIS). GIS je zapleten nabor tehnologij in programov, ki služijo najrazličnejšim namenom, vendar Univerza v Washingtonu ponuja dokaj celovito definicijo, ki pravi, da je "geografski informacijski sistem kompleksna ureditev povezanih ali povezanih stvari ali predmetov, katerih namen je posredujejo znanje o značilnostih na površini zemlje« (Lawler et al). GIS zajema široko paleto tehnik za obdelavo prostorskih podatkov od zajema do vizualizacije, od katerih so mnoge dragocena orodja, tudi če niste strokovnjak za GIS. Ta članek nudi celovit pregled geokodiranja z demonstracijami več praktičnih aplikacij v Pythonu. Natančneje, določili boste točno lokacijo picerije v New Yorku, New York, z uporabo naslova in jo povezali s podatki o bližnjih parkih. Medtem ko predstavitve uporabljajo kodo Python, je mogoče osnovne koncepte uporabiti v številnih programskih okoljih za integracijo geokodiranja v vaš potek dela. Ta orodja zagotavljajo osnovo za pretvorbo podatkov v prostorske podatke in odpirajo vrata za kompleksnejšo geografsko analizo. 

 

XXXXX

Geokodiranje je najpogosteje definirano kot preoblikovanje naslovnih podatkov v kartografske koordinate. Običajno to vključuje odkrivanje imena ulice v naslovu, ujemanje te ulice z mejami njene resnične protipostavke v zbirki podatkov, nato pa oceno, kje na ulici naj se naslov postavi z uporabo ulične številke. Kot primer pojdimo skozi postopek preprostega ročnega geokodiranja za naslov picerije v New Yorku na Broadwayu: 2709 Broadway, New York, NY 10025. Prva naloga je iskanje ustreznih datotek oblike za cestni sistem lokacije. vašega naslova. Upoštevajte, da sta v tem primeru mesto in država naslova »New York, NY«. Na srečo mesto New York objavlja podrobne informacije o cestah Odprti podatki NYC stran (CSCL PUB). Drugič, preglejte ime ulice »Broadway«. Zdaj veste, da lahko naslov leži na kateri koli ulici z imenom »Broadway« v mestu New York, zato lahko izvedete naslednjo kodo Python za poizvedbo API-ja NYC Open Data SODA za vse ulice z imenom »Broadway«.

import geopandas as gpd
import requests
from io import BytesIO # Request the data from the SODA API
req = requests.get( "https://data.cityofnewyork.us/resource/gdww-crzy.geojson?stname_lab=BROADWAY"
)
# Convert to a stream of bytes
reqstrm = BytesIO(req.content)
# Read the stream as a GeoDataFrame
ny_streets = gpd.read_file(reqstrm)

 

Obstaja več kot 700 rezultatov te poizvedbe, vendar to ne pomeni, da morate preveriti 700 ulic, da bi našli svojo pico. Če vizualizirate podatke, lahko vidite, da obstajajo 3 glavne ulice Broadwaya in nekaj manjših.

 

XXXXX
 

Razlog za to je, da je vsaka ulica razdeljena na odseke, ki približno ustrezajo bloku, kar omogoča bolj podroben pogled na podatke. Naslednji korak postopka je natančno določanje, na katerem od teh razdelkov je naslov, z uporabo poštne številke in ulične številke. Vsak segment ulice v naboru podatkov vsebuje obsege naslovov za naslove stavb na levi in ​​desni strani ulice. Podobno vsak segment vsebuje poštno številko za levo in desno stran ulice. Za iskanje pravilnega segmenta naslednja koda uporabi filtre za iskanje segmenta ulice, katerega poštna številka se ujema s poštno številko naslova in katerega obseg naslovov vsebuje številko ulice naslova.

# Address to be geocoded
address = "2709 Broadway, New York, NY 10025"
zipcode = address.split(" ")[-1]
street_num = address.split(" ")[0] # Find street segments whose left side address ranges contain the street number
potentials = ny_streets.loc[ny_streets["l_low_hn"] street_num]
potentials = potentials.loc[potentials["l_high_hn"] > street_num]
# Find street segments whose zipcode matches the address'
potentials = potentials.loc[potentials["l_zip"] == zipcode]

 

To zoži seznam na segment ene ulice, prikazan spodaj.

 

XXXXX
 

Zadnja naloga je ugotoviti, kje na tej vrstici leži naslov. To naredite tako, da ulično številko postavite znotraj obsega naslovov za segment, normalizirate, da določite, kako daleč vzdolž črte mora biti naslov, in uporabite to konstanto za koordinate končnih točk črte, da dobite koordinate naslova. Naslednja koda opisuje ta postopek.

import numpy as np
from shapely.geometry import Point # Calculate how far along the street to place the point
denom = ( potentials["l_high_hn"].astype(float) - potentials["l_low_hn"].astype(float)
).values[0]
normalized_street_num = ( float(street_num) - potentials["l_low_hn"].astype(float).values[0]
) / denom # Define a point that far along the street
# Move the line to start at (0,0)
pizza = np.array(potentials["geometry"].values[0].coords[1]) - np.array( potentials["geometry"].values[0].coords[0]
)
# Multiply by normalized street number to get coordinates on line
pizza = pizza * normalized_street_num
# Add starting segment to place line back on the map
pizza = pizza + np.array(potentials["geometry"].values[0].coords[0])
# Convert to geometry array for geopandas
pizza = gpd.GeoDataFrame( {"address": , "geometry": [Point(pizza[0], pizza[1])]}, crs=ny_streets.crs, geometry="geometry",
)

 

Po končanem geokodiranju naslova je zdaj mogoče lokacijo te picerije narisati na zemljevid, da boste razumeli njeno lokacijo. Ker je zgornja koda obravnavala informacije, ki se nanašajo na levo stran odseka ulice, bo dejanska lokacija nekoliko levo od izrisane točke v stavbi na levi strani ceste. Končno veste, kje lahko dobite pico.

 

XXXXX
 

Ta postopek zajema tisto, kar se najpogosteje imenuje geokodiranje, vendar to ni edini način uporabe izraza. Morda boste videli tudi, da se geokodiranje nanaša na postopek prenosa imen mejnikov v koordinate, poštnih številk v koordinate ali koordinat v vektorje GIS. Morda boste celo slišali obratno geokodiranje (o katerem bomo govorili pozneje), imenovano geokodiranje. Prizanesljivejša definicija geokodiranja, ki bi to zajemala, bi bila »prenos med približnimi opisi lokacij v naravnem jeziku in geografskimi koordinatami«. Torej, vsakič, ko se morate premikati med tema dvema vrstama podatkov, razmislite o geokodiranju kot rešitvi.

Namesto ponavljanja tega postopka, kadar koli morate geokodirati naslove, lahko uporabite različne končne točke API-ja, kot je Geokoder ameriškega urada za popis prebivalstva in Google Geocoding API, nudijo brezplačno storitev natančnega geokodiranja. Nekatere plačljive možnosti, kot npr Esrijev ArcGIS, Geocodioin Smarty ponuja celo strešno natančnost za izbrane naslove, kar pomeni, da vrnjena koordinata pristane točno na strehi stavbe namesto na bližnji ulici. V naslednjih razdelkih je opisano, kako uporabiti te storitve za prilagajanje geokodiranja vašemu podatkovnemu cevovodu z uporabo geokoderja US Census Bureau Geocoder.

Da bi dosegli najvišjo možno natančnost pri geokodiranju, morate vedno začeti z zagotavljanjem, da so vaši naslovi oblikovani tako, da ustrezajo standardom vaše izbrane storitve. To se bo nekoliko razlikovalo med posameznimi storitvami, vendar je običajna oblika zapisa USPS »PRIMARY# STREET, CITY, STATE, ZIP«, kjer je STATE koda okrajšave, PRIMARY# je ulična številka in vse omembe številk stanovanj, stavb številke in poštni predali so odstranjeni. 

Ko je vaš naslov oblikovan, ga morate poslati API-ju za geokodiranje. V primeru geokoderja ameriškega urada za popis prebivalstva lahko ročno oddate naslov prek zavihka One Line Address Processing ali uporabite podan REST API oddati naslov programsko. Geokoder Urada za popis prebivalstva ZDA omogoča tudi geokodiranje celotnih datotek z uporabo paketnega geokoderja in določanje vira podatkov s parametrom primerjalne vrednosti. Če želite geokodirati picerijo od prej, ta povezava lahko uporabite za posredovanje naslova API-ju REST, kar lahko storite v Pythonu z naslednjo kodo.

# Submit the address to the U.S. Census Bureau Geocoder REST API for processing
response = requests.get( "https://geocoding.geo.census.gov/geocoder/locations/onelineaddress?address=2709+Broadway%2C+New+York%2C+NY+10025&benchmark=Public_AR_Current&format=json"
).json()

 

Vrnjeni podatki so datoteka JSON, ki se zlahka dekodira v slovar Python. Vsebuje polje »tigerLineId«, ki ga lahko uporabite za ujemanje datoteke oblike za najbližjo ulico, polje »side«, ki ga lahko uporabite za določitev, na kateri strani te ulice je naslov, ter polji »fromAddress« in »toAddress«. ki vsebujejo obseg naslovov za segment ulice. Najpomembneje je, da vsebuje polje »koordinate«, ki ga je mogoče uporabiti za iskanje naslova na zemljevidu. Naslednja koda ekstrahira koordinate iz datoteke JSON in jih obdela v GeoDataFrame, da jih pripravi za prostorsko analizo.

# Extract coordinates from the JSON file
coords = response["result"]["addressMatches"][0]["coordinates"]
# Convert coordinates to a Shapely Point
coords = Point(coords["x"], coords["y"])
# Extract matched address
matched_address = response["result"]["addressMatches"][0]["matchedAddress"]
# Create a GeoDataFrame containing the results
pizza_point = gpd.GeoDataFrame( {"address": [matched_address], "geometry": coords}, crs=ny_streets.crs, geometry="geometry",
)

 

Vizualizacija te točke kaže, da je rahlo stran od ceste levo od točke, ki je bila geokodirana ročno.

 

XXXXX

Povratno geokodiranje je postopek zajemanja geografskih koordinat in njihovega ujemanja z opisi v naravnem jeziku geografske regije. Ob pravilni uporabi je to ena najmočnejših tehnik za pripenjanje zunanjih podatkov v kompletu orodij za podatkovno znanost. Prvi korak obratnega geokodiranja je določanje vaših ciljnih geografskih območij. To je regija, ki bo vsebovala vaše podatke o koordinatah. Nekateri pogosti primeri so popisni trakti, poštne številke in mesta. Drugi korak je ugotavljanje, v kateri, če sploh kateri, od teh regij je točka. Pri uporabi skupnih regij je Geokoder popisa prebivalstva ZDA lahko uporabite za obrnjeno geokodiranje z majhnimi spremembami v zahtevi REST API. Zahteva za določitev, katera območja popisa vsebujejo picerijo od prej, je povezana tukaj. Rezultat te poizvedbe je mogoče obdelati z enakimi metodami kot prej. Vendar kreativno definiranje regije, ki ustreza potrebi po analizi, in ročno obrnjeno geokodiranje vanjo odpira veliko možnosti. 

Če želite ročno obrniti geokodiranje, morate določiti lokacijo in obliko regije, nato pa ugotoviti, ali je točka v notranjosti te regije. Ugotavljanje, ali je točka znotraj poligona, je pravzaprav precej težaven problem, vendar algoritem oddajanja žarkov, kjer žarek, ki se začne v točki in potuje neskončno v smeri, seka mejo območja liho število krat, če je znotraj območja, in sodo število v nasprotnem primeru (Shimrat), se lahko uporabi za rešitev v večini primerih. Za matematično nagnjene je to pravzaprav neposredna uporaba Izrek Jordanove krivulje (Hosch). Opomba: če uporabljate podatke z vsega sveta, lahko algoritem oddajanja žarkov dejansko odpove, saj se bo žarek sčasoma ovil okoli Zemljine površine in postal krog. V tem primeru boste namesto tega morali poiskati številko navijanja (Weisstein) za regijo in točko. Točka je znotraj območja, če število navitja ni nič. Na srečo Pythonova knjižnica geopandas zagotavlja funkcionalnost, ki je potrebna tako za definiranje notranjosti poligonalne regije kot tudi za preizkušanje, ali je točka znotraj nje, brez vse zapletene matematike.

Medtem ko je ročno geokodiranje lahko preveč zapleteno za številne aplikacije, je lahko ročno povratno geokodiranje praktičen dodatek k vašemu naboru spretnosti, saj vam omogoča preprosto ujemanje točk z zelo prilagojenimi regijami. Recimo, da želite svojo rezino pice odnesti v park in imeti piknik. Morda boste želeli vedeti, ali je picerija v bližini parka. New York City ponuja datoteke oblike za svoje parke kot del Nabor podatkov Parks Properties (NYC Parks Open Data Team), do njih pa je mogoče dostopati tudi prek njihovega API-ja SODA z uporabo naslednje kode.

# Pull NYC park shapefiles
parks = gpd.read_file( BytesIO( requests.get( "https://data.cityofnewyork.us/resource/enfh-gkve.geojson?$limit=5000" ).content )
)
# Limit to parks with green area for a picnic
parks = parks.loc[ parks["typecategory"].isin( [ "Garden", "Nature Area", "Community Park", "Neighborhood Park", "Flagship Park", ] )
]

 

Te parke lahko dodate vizualizaciji, da vidite, kateri parki so v bližini picerije.

 

XXXXX
 

Jasno je, da je v bližini nekaj možnosti, vendar je lahko ugotavljanje razdalje z uporabo datotek oblike in točke težko in računsko drago. Namesto tega je mogoče uporabiti obratno geokodiranje. Prvi korak, kot je omenjeno zgoraj, je določitev regije, na katero želite pritrditi točko. V tem primeru je regija "1/2 milje oddaljena od parka v New Yorku." Drugi korak je izračun, če točka leži znotraj regije, kar lahko naredimo matematično z uporabo prej omenjenih metod ali z uporabo funkcije »contains« v geopandah. Naslednja koda se uporablja za dodajanje 1/2-miljske varovalne meje mejam parkov pred testiranjem, da se vidi, katera varovana območja parkov zdaj vsebujejo točko.

# Project the coordinates from latitude and longitude into meters for distance calculations
buffered_parks = parks.to_crs(epsg=2263)
pizza_point = pizza_point.to_crs(epsg=2263)
# Add a buffer to the regions extending the border by 1/2 mile = 2640 feet
buffered_parks = buffered_parks.buffer(2640)
# Find all parks whose buffered region contains the pizza parlor
pizza_parks = parks.loc[buffered_parks.contains(pizza_point["geometry"].values[0])]

 

Ta medpomnilnik razkriva bližnje parke, ki so na spodnji sliki označeni z modro

 

XXXXX
 

Po uspešnem povratnem geokodiranju ste izvedeli, da je v krogu pol milje od picerije 8 parkov, v katerih bi lahko imeli piknik. Uživajte v tej rezini.
 

XXXXX
Pizza Slice avtorja j4p4n

Viri

  1. Lawler, Josh in Schiess, Peter. ESRM 250: Uvod v geografske informacijske sisteme v gozdnih virih. Definicije GIS, 12. februar 2009, Univerza Washington, Seattle. Predavanje v razredu. https://courses.washington.edu/gis250/lessons/introduction_gis/definitions.html
  2. CSCL PUB. New York OpenData. https://data.cityofnewyork.us/City-Government/road/svwp-sbcd
  3. Dokumentacija geokoderja ameriškega urada za popis prebivalstva. avgust 2022. https://geocoding.geo.census.gov/geocoder/Geocoding_Services_API.pdf 
  4. Shimrat, M., “Algoritem 112: Položaj točke glede na poligon” 1962, Sporočila ACM Zvezek 5, številka 8, avgust 1962. https://dl.acm.org/doi/10.1145/368637.368653 
  5. Hosch, William L.. “Izrek o Jordanovi krivulji”. Enciklopedija Britannica, 13. april 2018, https://www.britannica.com/science/Jordan-curve-theorem
  6. Weisstein, Eric W. "Številka konturnega navijanja." Od MathWorld– spletni vir Wolfram. https://mathworld.wolfram.com/ContourWindingNumber.html
  7. Ekipa za odprte podatke NYC Parks. Lastnosti parkov. 14. april 2023. https://nycopendata.socrata.com/Recreation/Parks-Properties/enfh-gkve
  8. j4p4n, "Pizza Slice." Od OpenClipArt. https://openclipart.org/detail/331718/pizza-slice

 
 
Evan Miller je sodelavec podatkovne znanosti pri Tech Impact, kjer uporablja podatke za podporo neprofitnim in vladnim agencijam s poslanstvom družbenega dobrega. Prej je Evan uporabljal strojno učenje za usposabljanje avtonomnih vozil na univerzi Central Michigan.
 

Časovni žig:

Več od KDnuggets