Geocodare pentru oamenii de știință ai datelor - KDnuggets

Geocodare pentru oamenii de știință ai datelor – KDnuggets

Nodul sursă: 2713218

Atunci când oamenii de știință din date trebuie să știe tot ce este de știut despre „unde” datelor lor, ei apelează adesea la Sistemele de Informații Geografice (GIS). GIS este un set complicat de tehnologii și programe care servesc o mare varietate de scopuri, dar Universitatea din Washington oferă o definiție destul de cuprinzătoare, spunând că „un sistem de informații geografice este un aranjament complex de lucruri sau obiecte asociate sau conectate, al căror scop este de a să comunice cunoștințe despre caracteristicile de pe suprafața pământului” (Lawler și colab.). GIS cuprinde o gamă largă de tehnici de procesare a datelor spațiale de la achiziție până la vizualizare, multe dintre acestea fiind instrumente valoroase chiar dacă nu sunteți un specialist GIS. Acest articol oferă o prezentare cuprinzătoare a geocodării cu demonstrații în Python a mai multor aplicații practice. Mai exact, veți determina locația exactă a unei pizzerii din New York City, New York folosind adresa sa și o veți conecta la datele despre parcurile din apropiere. În timp ce demonstrațiile folosesc cod Python, conceptele de bază pot fi aplicate în multe medii de programare pentru a integra geocodarea în fluxul de lucru. Aceste instrumente oferă baza pentru transformarea datelor în date spațiale și deschid ușa pentru o analiză geografică mai complexă. 

 

XXXXX

Geocodarea este definită cel mai frecvent ca transformarea datelor de adrese în coordonate de cartografiere. De obicei, aceasta implică detectarea unui nume de stradă într-o adresă, potrivirea acelei străzi cu granițele omologul său din lumea reală într-o bază de date, apoi estimarea unde pe stradă să plaseze adresa folosind numărul străzii. De exemplu, să trecem prin procesul unui geocod manual simplu pentru adresa unei pizzerie din New York pe Broadway: 2709 Broadway, New York, NY 10025. Prima sarcină este găsirea fișierelor de formă adecvate pentru sistemul rutier al locației. a adresei dvs. Rețineți că, în acest caz, orașul și statul adresei sunt „New York, NY”. Din fericire, orașul New York publică informații rutiere detaliate despre Date deschise NYC pagina (CSCL PUB). În al doilea rând, examinează numele străzii „Broadway”. Acum știți că adresa se poate afla pe orice stradă numită „Broadway” din orașul New York, așa că puteți executa următorul cod Python pentru a interoga API-ul NYC Open Data SODA pentru toate străzile numite „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)

 

Există peste 700 de rezultate ale acestei interogări, dar asta nu înseamnă că trebuie să verificați 700 de străzi pentru a vă găsi pizza. Vizualând datele, puteți vedea că există 3 străzi principale Broadway și câteva mai mici.

 

XXXXX
 

Motivul pentru aceasta este că fiecare stradă este împărțită în secțiuni care corespund aproximativ unui bloc, permițând o privire mai granulară a datelor. Următorul pas al procesului este determinarea exactă în care dintre aceste secțiuni se află adresa folosind codul poștal și numărul străzii. Fiecare segment de stradă din setul de date conține intervale de adrese pentru adresele clădirilor de pe partea stângă și din dreapta a străzii. În mod similar, fiecare segment conține codul poștal atât pentru partea stângă, cât și pentru partea dreaptă a străzii. Pentru a localiza segmentul corect, următorul cod aplică filtre pentru a găsi segmentul de stradă al cărui cod poștal se potrivește cu codul poștal al adresei și al cărui interval de adrese conține numărul străzii al adresei.

# 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]

 

Aceasta restrânge lista la un singur segment de stradă văzut mai jos.

 

XXXXX
 

Sarcina finală este de a determina unde se află adresa pe această linie. Acest lucru se face prin plasarea numărului străzii în interiorul intervalului de adrese pentru segment, normalizând pentru a determina cât de departe ar trebui să fie adresa de-a lungul liniei și aplicând acea constantă la coordonatele punctelor de capăt ale liniei pentru a obține coordonatele adresei. Următorul cod subliniază acest proces.

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",
)

 

După ce ați terminat geocodarea adresei, acum este posibil să reprezentați locația acestei pizzerii pe o hartă pentru a înțelege locația sa. Deoarece codul de mai sus a analizat informații referitoare la partea stângă a unui segment de stradă, locația reală va fi ușor la stânga punctului trasat într-o clădire de pe partea stângă a drumului. În sfârșit știi de unde poți lua pizza.

 

XXXXX
 

Acest proces acoperă ceea ce este cel mai frecvent denumit geocodare, dar nu este singurul mod în care termenul este utilizat. De asemenea, este posibil să vedeți că geocodificarea se referă la procesul de transfer al numelor reperelor în coordonate, codurilor poștale în coordonate sau coordonatelor către vectori GIS. Este posibil să auziți chiar și geocodare inversă (care va fi tratată mai târziu) denumită geocodare. O definiție mai indulgentă pentru geocodificare care le cuprinde ar fi „transferul între descrierile aproximative, în limbaj natural, ale locațiilor și coordonatele geografice”. Deci, de fiecare dată când trebuie să treceți între aceste două tipuri de date, luați în considerare geocodarea ca o soluție.

Ca o alternativă la repetarea acestui proces ori de câte ori trebuie să geocodați adrese, o varietate de puncte finale API, cum ar fi Geocoder al Biroului de Recensământ al SUA si Google Geocoding API, oferiți gratuit un serviciu de geocodare precis. Unele opțiuni plătite, cum ar fi Esri’s ArcGIS, Geocodio, și Smarty oferă chiar și precizie pe acoperiș pentru anumite adrese, ceea ce înseamnă că coordonatele returnate aterizează exact pe acoperișul clădirii, nu pe o stradă din apropiere. Următoarele secțiuni descriu cum să utilizați aceste servicii pentru a încadra geocodarea în conducta dvs. de date, folosind geocoderul Biroului de Recensământ din S.U.A. ca exemplu.

Pentru a obține cea mai mare precizie posibilă la geocodare, ar trebui să începeți întotdeauna prin a vă asigura că adresele dvs. sunt formatate pentru a se potrivi cu standardele serviciului ales. Acesta va diferi ușor între fiecare serviciu, dar un format comun este formatul USPS de „PRIMARY# STREET, CITY, STATE, ZIP” unde STATE este un cod de abreviere, PRIMARY# este numărul străzii și toate mențiunile de numere de apartamente, clădire. numerele și căsuțele poștale sunt eliminate. 

Odată ce adresa dvs. este formatată, trebuie să o trimiteți la API pentru geocodare. În cazul geocoderului Biroului de Recensământ din S.U.A., puteți fie să trimiteți manual adresa prin fila Procesare adresă pe o linie, fie să utilizați furnizat REST API pentru a trimite adresa în mod programatic. Geocoderul U.S. Census Bureau vă permite, de asemenea, să geocodați fișiere întregi utilizând geocoderul lot și să specificați sursa de date folosind parametrul de referință. Pentru a geocoda pizzeria de mai devreme, acest link poate fi folosit pentru a transmite adresa către API-ul REST, ceea ce se poate face în Python cu următorul cod.

# 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()

 

Datele returnate sunt un fișier JSON, care este decodat cu ușurință într-un dicționar Python. Conține un câmp „tigerLineId” care poate fi folosit pentru a potrivi fișierul de formă pentru cea mai apropiată stradă, un câmp „lateral” care poate fi folosit pentru a determina pe ce parte a acelei străzi se află adresa și câmpurile „fromAddress” și „toAddress”. care conțin intervalul de adrese pentru segmentul de stradă. Cel mai important, conține un câmp de „coordonate” care poate fi folosit pentru a localiza adresa pe o hartă. Următorul cod extrage coordonatele din fișierul JSON și le procesează într-un GeoDataFrame pentru a-l pregăti pentru analiza spațială.

# 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",
)

 

Vizualizarea acestui punct arată că se află ușor în afara drumului la stânga punctului care a fost geocodat manual.

 

XXXXX

Geocodarea inversă este procesul de preluare a coordonatelor geografice și de potrivire a acestora cu descrierile în limbaj natural ale unei regiuni geografice. Când este aplicată corect, este una dintre cele mai puternice tehnici de atașare a datelor externe în setul de instrumente pentru știința datelor. Primul pas al geocodării inverse este determinarea zonelor geografice țintă. Aceasta este regiunea care va conține datele de coordonate. Câteva exemple comune sunt tracturile de recensământ, codurile poștale și orașele. Al doilea pas este determinarea în care dintre acele regiuni se află punctul, dacă este cazul. Când se utilizează regiuni comune, Geocoder pentru recensământul SUA poate fi folosit pentru a inversa geocodarea prin efectuarea de mici modificări la solicitarea API-ului REST. Este legată o solicitare pentru stabilirea zonelor geografice ale recensământului care conțin pizzeria de mai înainte aici. Rezultatul acestei interogări poate fi procesat folosind aceleași metode ca înainte. Cu toate acestea, definirea creativă a regiunii pentru a se potrivi unei nevoi de analiză și inversarea manuală a geocodării la aceasta deschide multe posibilități. 

Pentru a inversa manual geocodarea, trebuie să determinați locația și forma unei regiuni, apoi determinați dacă punctul se află în interiorul acelei regiuni. Determinarea dacă un punct se află în interiorul unui poligon este de fapt o problemă destul de dificilă, dar algoritm de turnare a razei, unde o rază care începe la punctul și călătorește infinit într-o direcție intersectează limita regiunii de un număr impar de ori dacă se află în interiorul regiunii și de un număr par de ori altfel (Shimrat), poate fi folosită pentru a o rezolva în majoritatea cazurilor. cazuri. Pentru cei înclinați spre matematică, aceasta este de fapt o aplicare directă a Teorema curbei Jordan (Hosch). Ca o notă, dacă utilizați date din întreaga lume, algoritmul de turnare a razelor poate eșua, deoarece o rază se va înfășura în cele din urmă în jurul suprafeței Pământului și va deveni un cerc. În acest caz, va trebui în schimb să găsiți numărul de înfășurare (Weisstein) pentru regiune și punct. Punctul este în interiorul regiunii dacă numărul de înfășurare nu este zero. Din fericire, biblioteca geopandas a lui Python oferă funcționalitatea necesară atât pentru a defini interiorul unei regiuni poligonale, cât și pentru a testa dacă un punct se află în interiorul acesteia fără toate matematicile complexe.

În timp ce geocodarea manuală poate fi prea complexă pentru multe aplicații, geocodarea manuală inversă poate fi un plus practic la setul de abilități, deoarece vă permite să vă potriviți cu ușurință punctele cu regiuni extrem de personalizate. De exemplu, presupuneți că doriți să vă duceți felia de pizza într-un parc și să faceți un picnic. Poate doriți să știți dacă pizzeria se află la mică distanță de un parc. New York City oferă shapefile pentru parcurile lor, ca parte a Set de date Parks Properties (NYC Parks Open Data Team) și pot fi accesați și prin intermediul API-ului SODA folosind următorul cod.

# 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", ] )
]

 

Aceste parcuri pot fi adăugate la vizualizare pentru a vedea ce parcuri sunt în apropierea pizzeriei.

 

XXXXX
 

Există în mod clar câteva opțiuni în apropiere, dar determinarea distanței folosind fișierele de formă și punctul poate fi dificilă și costisitoare din punct de vedere computațional. În schimb, se poate aplica geocodarea inversă. Primul pas, așa cum am menționat mai sus, este determinarea regiunii la care doriți să atașați punctul. În acest caz, regiunea se află la „o distanță de 1/2 milă de un parc din New York”. Al doilea pas este calculul dacă punctul se află în interiorul unei regiuni, lucru care se poate face matematic folosind metodele menționate anterior sau prin aplicarea funcției „conține” în geopandas. Următorul cod este folosit pentru a adăuga un tampon de 1/2 milă la limitele parcurilor înainte de a testa pentru a vedea regiunile tampon ale parcurilor care conțin acum punctul.

# 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])]

 

Acest buffer dezvăluie parcurile din apropiere, care sunt evidențiate cu albastru în imaginea de mai jos

 

XXXXX
 

După geocodare inversă cu succes, ați aflat că există 8 parcuri la o jumătate de milă de pizzerie în care ați putea face picnic. Bucurați-vă de felia aceea.
 

XXXXX
Pizza Slice de j4p4n

Surse

  1. Lawler, Josh și Schiess, Peter. ESRM 250: Introducere în sistemele informaționale geografice în resursele forestiere. Definitions of GIS, 12 februarie 2009, Universitatea din Washington, Seattle. Prelegere de clasă. 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. Documentația privind geocoderul Biroului de Recensământ din SUA. august 2022. https://geocoding.geo.census.gov/geocoder/Geocoding_Services_API.pdf 
  4. Shimrat, M., “Algorithm 112: Position of point relative to polygon” 1962, Comunicări ale ACM Volumul 5 Numărul 8, august 1962. https://dl.acm.org/doi/10.1145/368637.368653 
  5. Hosch, William L.. “Jordan curve theorem”. Enciclopedia Britannica, 13 aprilie 2018, https://www.britannica.com/science/Jordan-curve-theorem
  6. Weisstein, Eric W. “Contour Winding Number.” From MathWorld–A Wolfram Web Resource. https://mathworld.wolfram.com/ContourWindingNumber.html
  7. Echipa NYC Parks Open Data. Proprietăți Parcuri. 14 aprilie 2023. https://nycopendata.socrata.com/Recreation/Parks-Properties/enfh-gkve
  8. j4p4n, „Feție de pizza”. Din OpenClipArt. https://openclipart.org/detail/331718/pizza-slice

 
 
Evan Miller este un membru al științei datelor la Tech Impact, unde folosește datele pentru a sprijini agențiile nonprofit și guvernamentale cu o misiune de bine social. Anterior, Evan folosea învățarea automată pentru a antrena vehicule autonome la Universitatea Central Michigan.
 

Timestamp-ul:

Mai mult de la KDnuggets