الترميز الجغرافي لعلماء البيانات - KDnuggets

الترميز الجغرافي لعلماء البيانات - KDnuggets

عقدة المصدر: 2713218

عندما يحتاج علماء البيانات إلى معرفة كل ما يمكن معرفته حول "مكان" بياناتهم، فإنهم غالبًا ما يلجأون إلى أنظمة المعلومات الجغرافية (GIS). نظم المعلومات الجغرافية هي مجموعة معقدة من التقنيات والبرامج التي تخدم مجموعة واسعة من الأغراض، ولكن جامعة واشنطن تقدم تعريفا شاملا إلى حد ما، قائلة "إن نظام المعلومات الجغرافية هو ترتيب معقد من الأشياء أو الكائنات المرتبطة أو المتصلة، والغرض منها هو توصيل المعرفة حول الميزات الموجودة على سطح الأرض "(لولر وآخرون). يشمل نظام المعلومات الجغرافية مجموعة واسعة من التقنيات لمعالجة البيانات المكانية بدءًا من الاستحواذ وحتى التصور، والعديد منها يعد أدوات قيمة حتى لو لم تكن متخصصًا في نظم المعلومات الجغرافية. تقدم هذه المقالة نظرة عامة شاملة عن الترميز الجغرافي مع عروض توضيحية في Python للعديد من التطبيقات العملية. على وجه التحديد، ستحدد الموقع الدقيق لمحل بيتزا في مدينة نيويورك، نيويورك باستخدام عنوانه وتوصيله بالبيانات المتعلقة بالمتنزهات القريبة. بينما تستخدم العروض التوضيحية كود Python، يمكن تطبيق المفاهيم الأساسية على العديد من بيئات البرمجة لدمج الترميز الجغرافي في سير العمل الخاص بك. توفر هذه الأدوات الأساس لتحويل البيانات إلى بيانات مكانية وتفتح الباب أمام تحليل جغرافي أكثر تعقيدًا. 

 

XXXXX

يتم تعريف الترميز الجغرافي بشكل شائع على أنه تحويل بيانات العنوان إلى إحداثيات الخرائط. عادةً ما يتضمن ذلك اكتشاف اسم شارع في عنوان ما، ومطابقة ذلك الشارع بحدود نظيره الحقيقي في قاعدة البيانات، ثم تقدير مكان وضع العنوان في الشارع باستخدام رقم الشارع. على سبيل المثال، دعنا نستعرض عملية الرمز الجغرافي اليدوي البسيط لعنوان محل بيتزا في نيويورك في برودواي: 2709 Broadway, New York, NY 10025. المهمة الأولى هي العثور على ملفات الأشكال المناسبة لنظام الطرق الخاص بالموقع من عنوانك. لاحظ أنه في هذه الحالة تكون مدينة وولاية العنوان هي "New York, NY". ولحسن الحظ، تنشر مدينة نيويورك معلومات مفصلة عن الطرق بيانات NYC المفتوحة الصفحة (CSCL PUB). ثانيًا، افحص اسم الشارع "برودواي". أنت تعلم الآن أن العنوان يمكن أن يقع في أي شارع يسمى "برودواي" في مدينة نيويورك، لذا يمكنك تنفيذ كود Python التالي للاستعلام عن NYC Open Data SODA API لجميع الشوارع المسماة "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)

 

هناك أكثر من 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. قد تسمع حتى الترميز الجغرافي العكسي (الذي سيتم تغطيته لاحقًا) يُشار إليه بالترميز الجغرافي. التعريف الأكثر تساهلاً للترميز الجغرافي الذي يشمل هذه الأمور هو "النقل بين الأوصاف التقريبية للغة الطبيعية للمواقع والإحداثيات الجغرافية". لذا، في أي وقت تحتاج فيه إلى التنقل بين هذين النوعين من البيانات، فكر في الترميز الجغرافي كحل.

كبديل لتكرار هذه العملية عندما تحتاج إلى ترميز العناوين جغرافيًا، يمكن استخدام مجموعة متنوعة من نقاط نهاية واجهة برمجة التطبيقات، مثل مكتب الإحصاء الأمريكي المشفر الجغرافي و جوجل الترميز الجغرافي API، توفير خدمة الترميز الجغرافي الدقيقة مجانًا. بعض الخيارات المدفوعة مثل نظام ArcGIS من شركة Esri, جيوكوديوو هندى حتى أنها تقدم دقة على السطح لعناوين محددة، مما يعني أن الإحداثيات التي تم إرجاعها تقع بالضبط على سطح المبنى بدلاً من أن تكون على شارع قريب. توضح الأقسام التالية كيفية استخدام هذه الخدمات لملاءمة الترميز الجغرافي في مسار البيانات الخاص بك باستخدام المشفر الجغرافي لمكتب الإحصاء الأمريكي كمثال.

من أجل الحصول على أعلى دقة ممكنة عند الترميز الجغرافي، يجب عليك دائمًا أن تبدأ بالتأكد من تنسيق عناوينك لتتناسب مع معايير الخدمة التي اخترتها. سيختلف هذا قليلاً بين كل خدمة، ولكن التنسيق الشائع هو تنسيق USPS لـ "PRIMARY# STREET, CITY, STATE, ZIP" حيث تكون STATE رمز اختصار، وPRIMARY# هو رقم الشارع، وجميع الإشارات إلى أرقام الأجنحة والمباني تتم إزالة الأرقام وصناديق البريد. 

بمجرد تنسيق عنوانك، يتعين عليك إرساله إلى واجهة برمجة التطبيقات (API) للترميز الجغرافي. في حالة المشفر الجغرافي لمكتب الإحصاء الأمريكي، يمكنك إما إرسال العنوان يدويًا من خلال علامة التبويب معالجة العنوان في سطر واحد أو استخدام المقدمة REST API لإرسال العنوان برمجياً. يتيح لك برنامج التشفير الجغرافي لمكتب الإحصاء الأمريكي أيضًا ترميز الملفات بالكامل جغرافيًا باستخدام برنامج التشفير الجغرافي الدفعي وتحديد مصدر البيانات باستخدام معلمة قياس الأداء. لتشفير محل البيتزا جغرافيًا من وقت سابق، الرابط التالي يمكن استخدامه لتمرير العنوان إلى REST API، وهو ما يمكن إجراؤه في Python باستخدام الكود التالي.

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

 

البيانات التي تم إرجاعها هي ملف JSON، والذي يمكن فك تشفيره بسهولة في قاموس بايثون. يحتوي على حقل "tigerLineId" الذي يمكن استخدامه لمطابقة ملف الشكل لأقرب شارع، وحقل "جانبي" يمكن استخدامه لتحديد الجانب الذي يقع فيه العنوان من هذا الشارع، وحقول "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. يتم ربط طلب تحديد مناطق التعداد الجغرافي التي تحتوي على مطعم البيتزا من قبل هنا. يمكن معالجة نتيجة هذا الاستعلام باستخدام نفس الأساليب كما كان من قبل. ومع ذلك، فإن تحديد المنطقة بطريقة إبداعية لتناسب احتياجات التحليل وعكس الترميز الجغرافي يدويًا لها يفتح العديد من الاحتمالات. 

لعكس الرمز الجغرافي يدويًا، تحتاج إلى تحديد موقع المنطقة وشكلها، ثم تحديد ما إذا كانت النقطة تقع داخل تلك المنطقة. إن تحديد ما إذا كانت النقطة موجودة داخل مضلع هو في الواقع مشكلة صعبة إلى حد ما، ولكن خوارزمية صب الأشعةحيث أن الشعاع الذي يبدأ من النقطة ويسافر إلى ما لا نهاية في اتجاه يتقاطع مع حدود المنطقة عدد فردي من المرات إذا كان داخل المنطقة وعدد زوجي من المرات خلاف ذلك (الشمرات)، يمكن الاستعانة بحلها في أغلب الأحيان حالات. بالنسبة للميول الرياضية، هذا في الواقع تطبيق مباشر لـ نظرية منحنى الأردن (هوش). كملاحظة، إذا كنت تستخدم بيانات من جميع أنحاء العالم، فيمكن أن تفشل خوارزمية صب الشعاع في الواقع نظرًا لأن الشعاع سوف يلتف في النهاية حول سطح الأرض ويصبح دائرة. في هذه الحالة، سيتعين عليك بدلاً من ذلك العثور على رقم الملف (Weisstein) للمنطقة والنقطة. تكون النقطة داخل المنطقة إذا كان رقم اللف ليس صفراً. لحسن الحظ، توفر مكتبة Geopandas في بايثون الوظائف اللازمة لتحديد الجزء الداخلي لمنطقة متعددة الأضلاع واختبار ما إذا كانت هناك نقطة بداخلها دون الحاجة إلى كل الرياضيات المعقدة.

على الرغم من أن الترميز الجغرافي اليدوي قد يكون معقدًا للغاية بالنسبة للعديد من التطبيقات، إلا أن الترميز الجغرافي العكسي اليدوي يمكن أن يكون إضافة عملية إلى مجموعة المهارات الخاصة بك لأنه يسمح لك بمطابقة نقاطك بسهولة مع المناطق المخصصة للغاية. على سبيل المثال، افترض أنك تريد أخذ شريحة البيتزا الخاصة بك إلى الحديقة والذهاب في نزهة. قد ترغب في معرفة ما إذا كان محل البيتزا يقع على مسافة قصيرة من المنتزه. توفر مدينة نيويورك ملفات أشكال لمتنزهاتها كجزء من مجموعة بيانات خصائص الحدائق (فريق البيانات المفتوحة في NYC Parks)، ويمكن أيضًا الوصول إليهم عبر 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 ميل إلى حدود المتنزهات قبل الاختبار لمعرفة المناطق المخزنة مؤقتًا في المتنزهات التي تحتوي الآن على النقطة.

# 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 حدائق على بعد نصف ميل من محل البيتزا حيث يمكنك قضاء نزهة. استمتع بهذه الشريحة.
 

XXXXX
شريحة بيتزا بواسطة j4p4n

مصادر

  1. لولر، جوش وشييس، بيتر. ESRM 250: مقدمة لنظم المعلومات الجغرافية في موارد الغابات. تعريفات نظم المعلومات الجغرافية، 12 فبراير 2009، جامعة واشنطن، سياتل. محاضرة صفية. https://courses.washington.edu/gis250/lessons/introduction_gis/definitions.html
  2. حانة CSCL. نيويورك البيانات المفتوحة. https://data.cityofnewyork.us/City-Government/road/svwp-sbcd
  3. وثائق المشفر الجغرافي لمكتب الإحصاء الأمريكي. أغسطس 2022. https://geocoding.geo.census.gov/geocoder/Geocoding_Services_API.pdf 
  4. شيمرات، م.، "الخوارزمية 112: موضع النقطة بالنسبة للمضلع" 1962، اتصالات ACM المجلد 5 العدد 8 أغسطس 1962. https://dl.acm.org/doi/10.1145/368637.368653 
  5. هوش، ويليام ل.. “نظرية منحنى الأردن”. موسوعة بريتانيكا، 13 أبريل 2018 ، https://www.britannica.com/science/Jordan-curve-theorem
  6. فايستين، إريك دبليو. “رقم لف الكفاف”. من MathWorld– مصدر ويب Wolfram. https://mathworld.wolfram.com/ContourWindingNumber.html
  7. فريق البيانات المفتوحة في NYC Parks. خصائص الحدائق. 14 أبريل 2023. https://nycopendata.socrata.com/Recreation/Parks-Properties/enfh-gkve
  8. j4p4n، "شريحة بيتزا." من OpenClipArt. https://openclipart.org/detail/331718/pizza-slice

 
 
إيفان ميلر هو زميل علوم البيانات في Tech Impact، حيث يستخدم البيانات لدعم الوكالات غير الربحية والحكومية التي تهدف إلى تحقيق الصالح الاجتماعي. في السابق، استخدم إيفان التعلم الآلي لتدريب المركبات ذاتية القيادة في جامعة سنترال ميشيغان.
 

الطابع الزمني:

اكثر من KD nuggets