데이터 과학자를 위한 지오코딩 - KDnuggets

데이터 과학자를 위한 지오코딩 – KDnuggets

소스 노드 : 2713218

데이터 과학자는 데이터의 "위치"에 대해 알아야 할 모든 것을 알아야 할 때 종종 지리 정보 시스템(GIS)을 사용합니다. GIS는 다양한 목적을 제공하는 복잡한 기술 및 프로그램 세트이지만, 워싱턴 대학에서는 "지리 정보 시스템은 관련되거나 연결된 사물 또는 객체의 복잡한 배열이며 그 목적은 다음과 같이 상당히 포괄적인 정의를 제공합니다. 지구 표면의 특징에 대한 지식을 전달합니다”(Lawler et al). GIS는 획득부터 시각화까지 공간 데이터를 처리하는 광범위한 기술을 포함하며, 그 중 다수는 GIS 전문가가 아니더라도 유용한 도구입니다. 이 기사에서는 Python의 여러 실제 응용 프로그램 데모를 통해 지오코딩에 대한 포괄적인 개요를 제공합니다. 구체적으로, 주소를 사용하여 뉴욕주 뉴욕 시에 있는 피자 가게의 정확한 위치를 파악하고 이를 인근 공원에 대한 데이터에 연결합니다. 데모에서는 Python 코드를 사용하지만 핵심 개념은 다양한 프로그래밍 환경에 적용되어 지오코딩을 워크플로에 통합할 수 있습니다. 이러한 도구는 데이터를 공간 데이터로 변환하기 위한 기반을 제공하고 보다 복잡한 지리 분석을 위한 문을 열어줍니다. 

 

XXXXX

지오코딩은 가장 일반적으로 주소 데이터를 매핑 좌표로 변환하는 것으로 정의됩니다. 일반적으로 여기에는 주소에서 거리 이름을 감지하고 해당 거리를 데이터베이스의 실제 대응 경계와 일치시킨 다음 거리 번호를 사용하여 주소를 배치할 거리 위치를 추정하는 작업이 포함됩니다. 예를 들어, New York on Broadway: 2709 Broadway, New York, NY 10025에 있는 피자 가게 주소에 대한 간단한 수동 지오코드 프로세스를 살펴보겠습니다. 첫 번째 작업은 해당 위치의 도로 시스템에 적합한 셰이프파일을 찾는 것입니다. 당신의 주소. 이 경우 주소의 도시와 주는 "New York, NY"입니다. 다행스럽게도 뉴욕시는 해당 지역에 대한 자세한 도로 정보를 공개하고 있습니다. 뉴욕시 오픈 데이터 페이지(CSCL PUB). 둘째, 거리 이름인 'Broadway'를 살펴보세요. 이제 주소가 뉴욕시의 "Broadway"라는 거리에 있을 수 있다는 것을 알았으므로 다음 Python 코드를 실행하여 "Broadway"라는 모든 거리에 대해 NYC Open Data SODA API를 쿼리할 수 있습니다.

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)

 

이 쿼리에는 700개가 넘는 결과가 있지만 피자를 찾기 위해 700개의 거리를 확인해야 한다는 의미는 아닙니다. 데이터를 시각화하면 3개의 주요 브로드웨이 거리와 몇 개의 작은 거리가 있음을 알 수 있습니다.

 

XXXXX
 

그 이유는 각 거리가 대략 블록에 해당하는 섹션으로 나뉘어 데이터를 보다 세부적으로 볼 수 있기 때문입니다. 프로세스의 다음 단계는 우편번호와 거리 번호를 사용하여 주소가 어느 구역에 있는지 정확하게 확인하는 것입니다. 데이터 세트의 각 거리 세그먼트에는 거리의 왼쪽과 오른쪽에 있는 건물 주소에 대한 주소 범위가 포함되어 있습니다. 마찬가지로 각 구간에는 거리의 왼쪽과 오른쪽 모두에 대한 우편번호가 포함되어 있습니다. 올바른 세그먼트를 찾기 위해 다음 코드는 필터를 적용하여 우편번호가 주소의 우편번호와 일치하고 주소 범위에 주소의 거리 번호가 포함된 거리 세그먼트를 찾습니다.

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

 

이렇게 하면 목록이 아래에 표시된 하나의 거리 세그먼트로 좁혀집니다.

 

XXXXX
 

마지막 작업은 이 줄에서 주소가 어디에 있는지 확인하는 것입니다. 이는 세그먼트의 주소 범위 내에 거리 번호를 배치하고, 주소가 선을 따라 얼마나 멀리 떨어져 있는지 결정하기 위해 정규화하고, 해당 상수를 선의 끝점 좌표에 적용하여 주소 좌표를 얻는 방식으로 수행됩니다. 다음 코드는 이 프로세스를 간략하게 설명합니다.

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

 

주소 지오코딩이 완료되면 이제 이 피자 가게의 위치를 ​​지도에 표시하여 해당 위치를 이해할 수 있습니다. 위의 코드는 거리 구간의 왼쪽에 관한 정보를 살펴보았으므로 실제 위치는 도로 왼쪽에 있는 건물의 표시된 지점에서 약간 왼쪽에 위치하게 됩니다. 마침내 피자를 어디서 구할 수 있는지 알게 되었습니다.

 

XXXXX
 

이 프로세스는 가장 일반적으로 지오코딩이라고 하는 내용을 다루지만 이것이 이 용어가 사용되는 유일한 방식은 아닙니다. 지오코딩은 랜드마크 이름을 좌표로, 우편번호를 좌표로, 좌표를 GIS 벡터로 전송하는 프로세스를 참조하는 것을 볼 수도 있습니다. 지오코딩(geocoding)이라고 하는 역지오코딩(나중에 다루겠습니다)을 들을 수도 있습니다. 이를 포함하는 지오코딩에 대한 보다 관대한 정의는 "위치에 대한 대략적인 자연어 설명과 지리 좌표 간의 전송"입니다. 따라서 두 종류의 데이터 사이를 이동해야 할 때마다 솔루션으로 지오코딩을 고려하세요.

주소를 지오코딩해야 할 때마다 이 프로세스를 반복하는 대신 다음과 같은 다양한 API 엔드포인트를 사용할 수 있습니다. 미국 인구조사국 지오코더 그리고 구글 지오코딩 API, 정확한 지오코딩 서비스를 무료로 제공합니다. 다음과 같은 일부 유료 옵션 에스리의 ArcGIS, 지오코디오스마티 선택한 주소에 대해 옥상 정확도를 제공할 수도 있습니다. 즉, 반환된 좌표가 인근 거리가 아닌 건물 옥상에 정확하게 위치한다는 의미입니다. 다음 섹션에서는 미국 인구조사국 지오코더(US Census Bureau Geocoder)를 예로 들어 이러한 서비스를 사용하여 데이터 파이프라인에 지오코딩을 적용하는 방법을 간략하게 설명합니다.

지오코딩 시 최대한의 정확성을 얻으려면 항상 주소 형식이 선택한 서비스 표준에 맞게 지정되었는지 확인해야 합니다. 이는 각 서비스마다 조금씩 다르지만 일반적인 형식은 "PRIMARY# STREET, CITY, STATE, ZIP"의 USPS 형식입니다. 여기서 STATE는 약어 코드이고 PRIMARY#은 거리 번호이며 모든 호실 번호, 건물에 대한 언급이 있습니다. 번호 및 사서함이 제거되었습니다. 

주소 형식이 지정되면 지오코딩을 위해 이를 API에 제출해야 합니다. 미국 인구조사국 지오코더의 경우 한 줄 주소 처리 탭을 통해 주소를 수동으로 제출하거나 REST API 제공 프로그래밍 방식으로 주소를 제출합니다. 미국 인구조사국 지오코더를 사용하면 배치 지오코더를 사용하여 전체 파일을 지오코딩하고 벤치마크 매개변수를 사용하여 데이터 소스를 지정할 수도 있습니다. 이전의 피자 가게를 지오코딩하려면 이 링크 다음 코드를 사용하여 Python에서 수행할 수 있는 REST API에 주소를 전달하는 데 사용할 수 있습니다.

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

 

반환된 데이터는 Python 사전으로 쉽게 디코딩되는 JSON 파일입니다. 여기에는 가장 가까운 거리에 대한 Shapefile을 일치시키는 데 사용할 수 있는 "tigerLineId" 필드, 주소가 해당 거리의 어느 쪽에 있는지 결정하는 데 사용할 수 있는 "side" 필드, "fromAddress" 및 "toAddress" 필드가 포함되어 있습니다. 거리 세그먼트에 대한 주소 범위를 포함합니다. 가장 중요한 점은 지도에서 주소를 찾는 데 사용할 수 있는 "좌표" 필드가 포함되어 있다는 것입니다. 다음 코드는 JSON 파일에서 좌표를 추출하고 이를 GeoDataFrame으로 처리하여 공간 분석을 준비합니다.

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

 

이 지점을 시각화하면 수동으로 지오코딩된 지점의 왼쪽 도로에서 약간 벗어난 것을 알 수 있습니다.

 

XXXXX

역지오코딩은 지리적 좌표를 가져와 이를 지리적 영역에 대한 자연어 설명과 일치시키는 프로세스입니다. 올바르게 적용하면 데이터 과학 툴킷에 외부 데이터를 첨부하는 가장 강력한 기술 중 하나입니다. 역지오코딩의 첫 번째 단계는 대상 지역을 결정하는 것입니다. 이는 좌표 데이터가 포함될 지역입니다. 몇 가지 일반적인 예로는 인구 조사 지역, 우편번호, 도시 등이 있습니다. 두 번째 단계는 해당 영역 중 어느 영역에 점이 있는지 결정하는 것입니다. 공통 영역을 사용할 때, 미국 인구조사 지오코더 REST API 요청을 약간 변경하여 지오코딩을 역방향으로 수행하는 데 사용할 수 있습니다. 이전의 피자 가게가 포함된 인구 조사 지역을 결정하기 위한 요청이 연결되어 있습니다. 여기에서 지금 확인해 보세요.. 이 쿼리의 결과는 이전과 동일한 방법을 사용하여 처리할 수 있습니다. 그러나 분석 요구에 맞게 지역을 창의적으로 정의하고 수동으로 역지오코딩을 수행하면 많은 가능성이 열립니다. 

수동으로 지오코드를 역방향으로 지정하려면 지역의 위치와 모양을 결정한 다음 해당 지점이 해당 지역의 내부에 있는지 확인해야 합니다. 점이 다각형 내부에 있는지 확인하는 것은 실제로 상당히 어려운 문제입니다. 레이 캐스팅 알고리즘, 지점에서 시작하여 한 방향으로 무한히 이동하는 광선이 영역 내부에 있으면 홀수 번 교차하고 그렇지 않으면 짝수 번(Shimrat) 영역의 경계와 교차하는 경우 대부분의 문제를 해결하는 데 사용할 수 있습니다. 사례. 수학적으로 기울어진 사람들에게 이것은 실제로 조던 곡선 정리 (호쉬). 참고로 전 세계의 데이터를 사용하는 경우 광선이 결국 지구 표면을 감싸고 원이 되기 때문에 광선 캐스팅 알고리즘이 실제로 실패할 수 있습니다. 이 경우에는 대신 해당 지역과 지점에 대한 굴곡 수(Weisstein)를 찾아야 합니다. 굴곡 수가 XNUMX이 아닌 경우 포인트는 영역 내부에 있습니다. 다행스럽게도 Python의 geopandas 라이브러리는 복잡한 수학 없이 다각형 영역의 내부를 정의하고 점이 내부에 있는지 테스트하는 데 필요한 기능을 제공합니다.

수동 지오코딩은 많은 응용 프로그램에서 너무 복잡할 수 있지만 수동 역 지오코딩은 고도로 맞춤화된 지역에 포인트를 쉽게 일치시킬 수 있으므로 기술 세트에 실용적인 추가 기능이 될 수 있습니다. 예를 들어 피자 한 조각을 공원에 가져가서 피크닉을 즐기고 싶다고 가정해 보겠습니다. 피자 가게가 공원에서 가까운 거리에 있는지 알고 싶을 수도 있습니다. 뉴욕시는 다음의 일부로 공원에 대한 셰이프파일을 제공합니다. 공원 속성 데이터 세트 (NYC Parks Open Data Team), 다음 코드를 사용하여 SODA API를 통해 액세스할 수도 있습니다.

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

 

이러한 공원을 시각화에 추가하여 피자 가게 근처에 어떤 공원이 있는지 확인할 수 있습니다.

 

XXXXX
 

근처에는 분명히 몇 가지 옵션이 있지만 쉐이프파일과 점을 사용하여 거리를 파악하는 것은 어렵고 계산 비용이 많이 들 수 있습니다. 대신 역지오코딩을 적용할 수 있습니다. 위에서 언급한 것처럼 첫 번째 단계는 점을 부착할 영역을 결정하는 것입니다. 이 경우 해당 지역은 "뉴욕시의 공원에서 1/2마일 거리"입니다. 두 번째 단계는 포인트가 영역 내부에 있는지 계산하는 것입니다. 이는 앞서 언급한 방법을 사용하거나 지리판다에서 "포함" 기능을 적용하여 수학적으로 수행할 수 있습니다. 다음 코드는 공원의 버퍼링된 영역에 현재 지점이 포함되어 있는지 확인하기 전에 공원 경계에 1/2마일 버퍼를 추가하는 데 사용됩니다.

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

 

이 버퍼는 아래 이미지에서 파란색으로 강조 표시된 인근 공원을 보여줍니다.

 

XXXXX
 

역지오코딩에 성공한 후 피자 가게에서 8마일 이내에 피크닉을 즐길 수 있는 공원이 XNUMX개 있다는 것을 알게 되었습니다. 그 조각을 즐기십시오.
 

XXXXX
j4p4n의 피자 슬라이스

지우면 좋을거같음 . SM

  1. 롤러, 조쉬, 쉬스, 피터. ESRM 250: 산림 자원의 지리 정보 시스템 소개. GIS 정의, 12년 2009월 XNUMX일, 시애틀 워싱턴 대학교. 수업 강의. https://courses.washington.edu/gis250/lessons/introduction_gis/definitions.html
  2. CSCL PUB. 뉴욕 오픈데이터. https://data.cityofnewyork.us/City-Government/road/svwp-sbcd
  3. 미국 인구조사국 지오코더 문서. 2022년 XNUMX월. https://geocoding.geo.census.gov/geocoder/Geocoding_Services_API.pdf 
  4. Shimrat, M., “알고리즘 112: 다각형에 대한 점의 위치” 1962, ACM의 커뮤니케이션 5권 8호, 1962년 XNUMX월. https://dl.acm.org/doi/10.1145/368637.368653 
  5. Hosch, William L.. “요르단 곡선 정리”. Britannica 백과 사전, 13년 2018월 XNUMX일, https://www.britannica.com/science/Jordan-curve-theorem
  6. Weisstein, Eric W. “윤곽 굴곡 번호.” 에서 수학세계– Wolfram 웹 리소스. https://mathworld.wolfram.com/ContourWindingNumber.html
  7. NYC Parks 오픈 데이터 팀. 공원 속성. 14년 2023월 XNUMX일. https://nycopendata.socrata.com/Recreation/Parks-Properties/enfh-gkve
  8. j4p4n, “피자 슬라이스.” 에서 사이트 OpenClipArt. https://openclipart.org/detail/331718/pizza-slice

 
 
에반 밀러 그는 Tech Impact의 데이터 과학 연구원으로 데이터를 사용하여 사회적 이익을 사명으로 하는 비영리 기관 및 정부 기관을 지원합니다. 이전에 Evan은 Central Michigan University에서 머신러닝을 사용하여 자율주행차를 훈련했습니다.
 

타임 스탬프 :

더보기 너 겟츠