मुख्य सामग्री पर जाएँ

Python में भू-स्थानिक डेटा का परिचय

इस ट्यूटोरियल में, आप 30 अगस्त से 18 सितंबर तक हरिकेन फ्लोरेंस के पथ का प्लॉट बनाने के लिए भू-स्थानिक डेटा का उपयोग करेंगे।
· 13 मि॰ पढ़ें

AI के साथ खोजें

भू-स्थानिक ग्राफ़िक

इस ट्यूटोरियल में, आप भू-स्थानिक डेटा के साथ काम करने के लिए लोकप्रिय दो पैकेजों से परिचित होंगे: geopandas और Shapely। फिर आप इन दोनों पैकेजों का उपयोग करके भू-स्थानिक डेटा को Python का उपयोग करते हुए पढ़ेंगे और 30 अगस्त से 18 सितंबर तक हरिकेन फ्लोरेंस के निशान का प्लॉट बनाएंगे।

भू-स्थानिक डेटा क्या है?

Spatial data, Geospatial data, GIS data या geodata, ये सभी ऐसे संख्यात्मक डेटा के नाम हैं जो किसी भौतिक वस्तु जैसे इमारत, सड़क, कस्बा, शहर, देश आदि के भौगोलिक स्थान की पहचान भौगोलिक निर्देशांक प्रणाली के अनुसार करते हैं। स्थानिक डेटा से आप न केवल लोकेशन, बल्कि किसी भी वस्तु की लंबाई, आकार, क्षेत्रफल या आकृति भी जान सकते हैं। स्थानिक डेटा के उदाहरण के तौर पर आपको वस्तु के निर्देशांक मिल सकते हैं, जैसे अक्षांश, देशांतर और ऊँचाई। Geographic Information Systems (GIS) या अन्य विशेष सॉफ्टवेयर एप्लिकेशन का उपयोग भू-स्थानिक डेटा तक पहुँचने, उसे देखने, संसाधित करने और विश्लेषित करने के लिए किया जा सकता है।

भू-स्थानिक डेटा क्यों?

भू-स्थानिक डेटा का हमारे दैनिक जीवन में बहुत व्यापक उपयोग है। एक उदाहरण वह Maps एप्लिकेशन है जिसका उपयोग आप एक स्थान से दूसरे स्थान तक नेविगेट करने के लिए करते हैं। दूसरा उदाहरण जिसे आप रोज़ देखते होंगे, वह मौसम चैनल है।

समाचार मौसम सेगमेंट का स्क्रीनशॉट

हाँ, भू-स्थानिक डेटा का उपयोग किसी वस्तु की स्थिति संबंधी जानकारी को उसके आसपास की अन्य चीज़ों के संदर्भ में दर्शाने के लिए किया जाता है: शहर के नक्शे पर आपका घर, विश्व मानचित्र पर हरिकेन, आदि। तो इस ट्यूटोरियल में, आप विध्वंसक हरिकेन फ्लोरेंस पर नज़र डालेंगे और उसके लोकेशन को ट्रैक करेंगे।

पैकेज आवश्यकताएँ

आगे न बढ़ें। यह एक महत्वपूर्ण भाग है। यदि आपको यकीन नहीं है कि आपने आवश्यकताएँ पूरी कर ली हैं, तो बस दोबारा जाँच लें। सबसे पहले, आपको नीचे दिए गए सभी पैकेज इंस्टॉल करने होंगे।

  • Pandas: डेटा स्ट्रक्चर और डेटा विश्लेषण टूल प्रदान करता है
  • Numpy: Python के साथ वैज्ञानिक कंप्यूटिंग के लिए एक मूलभूत पैकेज
  • SciPy: (उच्चारण “साइ पाई”) गणित, विज्ञान और इंजीनियरिंग के लिए Python-आधारित ओपन-सोर्स सॉफ्टवेयर का इकोसिस्टम
  • RTree: libspatialindex का ctypes Python रैपर जो उन्नत स्पैटियल इंडेक्सिंग सुविधाएँ प्रदान करता है
  • GDAL: रास्टर और वेक्टर भू-स्थानिक डेटा फ़ॉर्मैट के लिए ट्रांसलेटर लाइब्रेरी
  • Fiona: Fiona स्थानिक डेटा फ़ाइलें पढ़ता और लिखता है
  • Shapely: ज्यामितीय ऑब्जेक्ट्स, प्रेडिकेट्स, और ऑपरेशन्स
  • GeoPandas: pandas द्वारा उपयोग किए जाने वाले डेटा टाइप्स को विस्तारित करता है ताकि ज्यामितीय टाइप्स पर स्थानिक ऑपरेशन किए जा सकें।
  • PySAL: उच्च-स्तरीय एप्लिकेशन विकास को समर्थन देने हेतु Python में लिखे स्थानिक विश्लेषण फ़ंक्शनों की लाइब्रेरी।
  • Matplotlib: Python 2D प्लॉटिंग लाइब्रेरी
  • Missingno: Python के लिए रिक्त डेटा का विज़ुअलाइज़ेशन मॉड्यूल

सब कुछ सही तरह से काम करे, यह सुनिश्चित करने के लिए ऊपर दिए क्रम में सभी पैकेज इंस्टॉल करें। कुछ पैकेज अन्य के लिए पूर्व-आवश्यक हैं, उदाहरण के लिए: GeoPandas को इंस्टॉल करने के लिए Shapely चाहिए, और Shapely इंस्टॉल करने के लिए RTree, GDAL, और Fiona पहले से इंस्टॉल होने चाहिए। किसी पैकेज को इंस्टॉल करने का सबसे आसान तरीका है: pip install PACKAGE_NAME

यदि आप Windows उपयोग कर रहे हैं और इस तरह पैकेज इंस्टॉल नहीं हो रहा, तो इस वेबसाइट को देखें, संबंधित पैकेज डाउनलोड करें और pip install PATH_TO_PACKAGE चलाएँ।

डेटा के बारे में

जैसा कि आप जानते हैं, भयावह हरिकेन फ्लोरेंस हाल ही में संयुक्त राज्य के पूर्वी तट के एक हिस्से से गुज़रा, जिससे अनुमानित 17 अरब USD का नुकसान हुआ। यह ट्यूटोरियल आपको यह पता लगाने में मदद करेगा कि यह कहाँ से आया, कब और कहाँ यह अधिक शक्तिशाली हुआ, और इस प्राकृतिक आपदा के बारे में अधिक समझ विकसित करते हुए इसे Python में विश्लेषित करेगा। इस हरिकेन के बारे में जानकारी देने वाली कई वेबसाइटें हैं। उदाहरण के लिए, इस वेबसाइट ने 1902 से 2018 तक अमेरिका में कई तूफानों और हरिकेनों के लिए डेटा प्रदान किया है, इसलिए आगे काम करने के लिए आपके पास ढेर सारा डेटा उपलब्ध है। इस ट्यूटोरियल के लिए, आप केवल हरिकेन फ्लोरेंस डेटा का उपयोग करेंगे।

आप इंटरनेट से अमेरिका के मानचित्र का भू-स्थानिक डेटा भी उपयोग करेंगे। Eric Celeste के ब्लॉग पोस्ट में अमेरिका की काउंटी और राज्यों के लिए सभी प्रकार की सीमा संबंधी डेटा फ़ाइलें हैं। इस ट्यूटोरियल में उपयोग किया गया डेटा US States, 5m, GeoJSON फ़ाइल है।

 # Load all importance packages
import geopandas
import numpy as np
import pandas as pd
from shapely.geometry import Point

import missingno as msn

import seaborn as sns
import matplotlib.pyplot as plt

% matplotlib inline

सबसे पहले, आइए पहले भू-स्थानिक डाटाफ़्रेम पर नज़र डालते हैं: US States Geodata

# Getting to know GEOJSON file:
country = geopandas.read_file("data/gz_2010_us_040_00_5m.json")
country.head()
भू-स्थानिक डाटाफ़्रेम

अभी-अभी आपने जो डाटाफ़्रेम लोड किया है, उसका प्रकार जाँचते हुए आप देख सकते हैं कि यह Geo Data Frame है, जिसमें Pandas DataFrame की सभी सामान्य विशेषताएँ होती हैं।

type(country)
geopandas.geodataframe.GeoDataFrame

निर्देशांक रखने वाले कॉलम के डेटा टाइप की जाँच: यह GeoSeries है।

type(country.geometry)
geopandas.geoseries.GeoSeries

GeoSeries की प्रत्येक वैल्यू एक Shapely ऑब्जेक्ट होती है। यह हो सकती है:

  • Point
  • Line
  • Polygon
  • MultiPolygon

प्रत्येक ऑब्जेक्ट का उपयोग अलग-अलग प्रकार की भौतिक वस्तु के लिए किया जा सकता है: जैसे इमारत के लिए Point, सड़क के लिए Line, शहर के लिए Polygon, और कई शहरों वाले देश के लिए MultiPolygon। प्रत्येक ज्यामितीय ऑब्जेक्ट के बारे में अधिक जानकारी के लिए यह लेख पढ़ें: https://shapely.readthedocs.io/en/stable/manual.html#geometric-objects

type(country.geometry[0])
shapely.geometry.multipolygon.MultiPolygon

Pandas DataFrame की तरह, GeoDataFrame में भी plot एट्रिब्यूट होता है, जो डाटाफ़्रेम के भीतर मौजूद geometry का उपयोग करके मानचित्र प्लॉट करता है:

country.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x1cfe68c1358>
एट्रिब्यूट प्लॉट

जैसा कि आप देख सकते हैं, US का मानचित्र फ़्रेम की तुलना में अपेक्षाकृत छोटा है। इसका कारण यह है कि जानकारी में अलास्का, हवाई और प्यूर्टो रिको शामिल हैं, जो बिखरे हुए हैं। इस ट्यूटोरियल के उद्देश्य से, आप अलास्का और हवाई को बाहर कर सकते हैं क्योंकि हरिकेन उन दोनों राज्यों के पास नहीं गया था। आप अपने प्लॉट को कस्टमाइज़ करने के लिए फ़िगर साइज और रंग भी जोड़ सकते हैं:

# Exclude Alaska and Hawaii for now
country[country['NAME'].isin(['Alaska','Hawaii']) == False].plot(figsize=(30,20), color='#3B3C6E');
US मानचित्र

ज़्यादा मुश्किल नहीं, है न! अब जब आपके पास US का मानचित्र है, तो आइए हरिकेन डेटा लोड करते हैं:

florence = pd.read_csv('data/florence.csv')
florence.head()
हरिकेन डेटा

खोजपूर्ण डेटा विश्लेषण

जब भी आप कोई डेटासेट लोड करते हैं, यह हमेशा पहला कदम होता है:

  • जानकारी, डेटा टाइप की जाँच
  • कोई मिसिंग वैल्यू
  • सांख्यिकीय डेटा
florence.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 105 entries, 0 to 104
Data columns (total 11 columns):
AdvisoryNumber    105 non-null object
Date              105 non-null object
Lat               105 non-null float64
Long              105 non-null float64
Wind              105 non-null int64
Pres              105 non-null int64
Movement          105 non-null object
Type              105 non-null object
Name              105 non-null object
Received          105 non-null object
Forecaster        104 non-null object
dtypes: float64(2), int64(2), object(7)
memory usage: 9.1+ KB

missingno पैकेज का उपयोग करके मिसिंग वैल्यू जाँचना। यह एक उपयोगी पैकेज है जो विज़ुअलाइज़ेशन के माध्यम से मिसिंग डेटा दिखाता है। जैसा कि आप नीचे देख सकते हैं, "Forecaster" कॉलम में केवल एक मिसिंग वैल्यू है, जिसकी आपको इस ट्यूटोरियल में आवश्यकता नहीं है। इसलिए फिलहाल आप इसे नज़रअंदाज़ कर सकते हैं।

# Notice you can always adjust the color of the visualization
msn.bar(florence, color='darkolivegreen');
बार चार्ट

कुछ सांख्यिकीय जानकारी देखें; कुछ बहुत उपयोगी हो सकती हैं, जैसे औसत पवन गति, इस हरिकेन की अधिकतम और न्यूनतम पवन गति, आदि।

# Statistical information
florence.describe()
 LatLongWindPres
count105.000000105.000000105.000000105.000000
mean25.93142956.93809574.428571981.571429
std7.97591720.87886536.56076522.780667
min12.90000018.40000025.000000939.000000
25%18.90000041.00000040.000000956.000000
50%25.10000060.00000070.000000989.000000
75%33.60000076.400000105.0000001002.000000
max42.60000082.900000140.0000001008.000000

अधिकांश डेटा के लिए, आपको सफ़ाई करनी होगी और केवल वही लेना होगा जिसकी आपको ज़रूरत है। यहाँ, आपको केवल समय, निर्देशांक: अक्षांश और देशांतर, पवन गति, दाब, और नाम चाहिए। Movement और Type वैकल्पिक हैं, लेकिन बाकी को हटाया जा सकता है।

# dropping all unused features:
florence = florence.drop(['AdvisoryNumber', 'Forecaster', 'Received'], axis=1)
florence.head()
डाटाफ़्रेम 1

आम तौर पर, यदि आप केवल डेटा को ही प्लॉट करते हैं, तो निर्देशांकों के लिए अतिरिक्त सावधानी की आवश्यकता नहीं होती। हालांकि, यदि आप चाहते हैं कि यह मानचित्र पर जैसा दिखता है वैसा दिखे, तो देशांतर और अक्षांश की जाँच करना महत्वपूर्ण है। यहाँ देशांतर पश्चिम में है, आपको डेटा को सही ढंग से प्लॉट करने के लिए संख्या के आगे "-" जोड़ना होगा:

# Add "-" in front of the number to correctly plot the data:
florence['Long'] = 0 - florence['Long']
florence.head()
डाटाफ़्रेम 2

फिर आप अक्षांश और देशांतर को मिलाकर हरिकेन के निर्देशांक बना सकते हैं, जिन्हें बाद में विज़ुअलाइज़ेशन के लिए GeoPoint में बदला जाएगा।

# Combining Lattitude and Longitude to create hurricane coordinates:
florence['coordinates'] = florence[['Long', 'Lat']].values.tolist()
florence.head()
डाटाफ़्रेम 3
# Change the coordinates to a geoPoint
florence['coordinates'] = florence['coordinates'].apply(Point)
florence.head()
डाटाफ़्रेम 4

florence डाटाफ़्रेम और florence डेटा के coordinates कॉलम के प्रकार की जाँच। ये pandas DataFrame और pandas Series हैं।

type(florence)
pandas.core.frame.DataFrame
type(florence['coordinates'])
pandas.core.series.Series

डेटा को भू-स्थानिक डेटा में बदलने के बाद, हम florence डाटाफ़्रेम और Florence डेटा के coordinates कॉलम के प्रकार को फिर से जाँचेंगे। अब ये Geo DataFrame और GeoSeries हैं।

# Convert the count df to geodf
florence = geopandas.GeoDataFrame(florence, geometry='coordinates')
florence.head()
डाटाफ़्रेम 5
type(florence)
geopandas.geodataframe.GeoDataFrame
type(florence['coordinates'])
geopandas.geoseries.GeoSeries

ध्यान दें कि भले ही अब यह Geo DataFrame और Geo Series है, फिर भी यह एक सामान्य DataFrame और Series की तरह ही व्यवहार करता है। यानी आप अब भी डाटाफ़्रेम पर फ़िल्टरिंग, groupby कर सकते हैं या कॉलम के न्यूनतम, अधिकतम, या औसत मान निकाल सकते हैं।

# Filtering from before the hurricane was named.
florence[florence['Name']=='Six']
डाटाफ़्रेम 6
# Groupping by name to see how many names it has in the data set:
florence.groupby('Name').Type.count()
Name
FLORENCE     6
Florence    85
SIX          4
Six         10
Name: Type, dtype: int64

हरिकेन फ्लोरेंस की औसत पवन गति निकालना:

print("Mean wind speed of Hurricane Florence is {} mph and it can go up to {} mph maximum".format(round(florence.Wind.mean(),4),
                                                                                         florence.Wind.max()))
Mean wind speed of Hurricane Florence is 74.4286 mph and it can go up to 140 mph maximum

तो हरिकेन फ्लोरेंस की औसत पवन गति 74.43 मील प्रति घंटा (119.78 किमी प्रति घंटा) है और अधिकतम 140 मील प्रति घंटा (225.308 किमी प्रति घंटा) है। यह पवन गति कितनी भयावह हो सकती है, इसे समझने के लिए, U.K Royal Navy द्वारा विकसित Beaufort Wind Scale पानी और भूमि पर हवा के प्रभाव का रूप दिखाती है। 48 से 55 मील प्रति घंटा की गति पर भी, यह पेड़ों को तोड़ और उखाड़ सकती है, और "काफी संरचनात्मक क्षति" पहुँचा सकती है।

हरिकेन

आप उस समय वहाँ होना नहीं चाहेंगे।

विज़ुअलाइज़ेशन

pandas DataFrame की तरह, GeoDataFrame में भी .plot एट्रिब्यूट होता है। हालाँकि, यह एट्रिब्यूट GeoDataFrame के भीतर मौजूद निर्देशांकों का उपयोग करके मानचित्रण करता है। आइए देखें:

florence.plot(figsize=(20,10));
geodataframe

क्या हुआ? आपको बिना किसी नेविगेशन के बस बिंदुओं का एक समूह दिखाई दे रहा है। क्या कुछ गलत है?
नहीं, सब ठीक है। क्योंकि इस डाटाफ़्रेम में हर समय-बिंदु पर हरिकेन फ्लोरेंस की केवल निर्देशांक (लोकेशन) जानकारी है, इसलिए हम केवल खाली मानचित्र पर स्थिति ही प्लॉट कर सकते हैं।

तो, अगला कदम US मानचित्र पर हरिकेन की स्थिति को प्लॉट करना है ताकि देखें कि यह कहाँ टकराया और उस समय इसकी ताकत कितनी थी। ऐसा करने के लिए, आप US मानचित्र के निर्देशांकों (शुरुआत में लोड किया गया डेटा) को बेस के रूप में उपयोग करेंगे और उसके ऊपर हरिकेन फ्लोरेंस की स्थिति प्लॉट करेंगे।

 # Plotting to see the hurricane overlay the US map:
fig, ax = plt.subplots(1, figsize=(30,20))
base = country[country['NAME'].isin(['Alaska','Hawaii']) == False].plot(ax=ax, color='#3B3C6E')

# plotting the hurricane position on top with red color to stand out:
florence.plot(ax=base, color='darkred', marker="*", markersize=10);
US मानचित्र पर हरिकेन फ्लोरेंस का प्लॉट

बहुत बढ़िया दिख रहा है! अब, हम इसे कुछ और विवरणों के साथ पूरा करेंगे, जैसे:

  • शीर्षक जोड़ना
  • हरिकेन की स्थिति को पवन गति के आधार पर रंगना ताकि देखें कि जब यह प्रत्येक शहर से गुज़रा, तब यह कितना शक्तिशाली था।
  • एक्सिस हटाना
  • लीजेंड जोड़ना
  • परिणाम को आगे उपयोग के लिए इमेज फ़ाइल में सहेजना
 fig, ax = plt.subplots(1, figsize=(20,20))
base = country[country['NAME'].isin(['Alaska','Hawaii']) == False].plot(ax=ax, color='#3B3C6E')
florence.plot(ax=base, column='Wind', marker="<", markersize=10, cmap='cool', label="Wind speed(mph)")
_ = ax.axis('off')
plt.legend()
ax.set_title("Hurricane Florence in US Map", fontsize=25)
plt.savefig('Hurricane_footage.png',bbox_inches='tight');
US मानचित्र में हरिकेन फ्लोरेंस

तो हरिकेन अपनी अधिकतम ताकत तब पर था जब वह पूर्वी तट के पास अपतटीय क्षेत्र में था। जैसे-जैसे वह भूमि के करीब आया, उसकी ताकत कम होने लगी, लेकिन 60 से 77 मील प्रति घंटा की पवन गति की सीमा में भी, यह भयंकर नुकसान पहुँचा सकता है।

निष्कर्ष

शानदार काम! आपने Python में भू-स्थानिक डेटा के साथ काम करने के कुछ ज़रूरी चरण सीख लिए हैं। आपने यह भी सीखा कि भू-स्थानिक डेटा को कैसे प्लॉट किया जाए और किसी कहानी को दिखाने के लिए प्लॉट्स के आकार, रंग और ओवरले को कैसे कस्टमाइज़ किया जाए। यदि आप अपने कौशल का अभ्यास करना चाहते हैं, तो आज़माने के लिए ऑनलाइन ढेर सारा भू-स्थानिक डेटा उपलब्ध है। एक उदाहरण ऊपर दिया गया मौसम संबंधी वेबसाइट है।

स्रोतों के लिए, कृपया इस पुस्तक पर नज़र डालें: Karim Bahgat (2015) द्वारा “Python Geospatial Development Essentials” गहन मार्गदर्शन के लिए।

यदि आप मुझसे संपर्क करना चाहें, तो आप मुझे [email protected] पर ईमेल भेज सकते हैं या LinkedIn के माध्यम से जुड़ सकते हैं। सीखने का आनंद लें और सुरक्षित रहें!

यदि आप Python में भू-स्थानिक डेटा के बारे में और सीखना चाहते हैं, तो DataCamp का Visualizing Geospatial Data in Python कोर्स लें।

नीचे इस ट्यूटोरियल में उपयोग किया गया डेटा है:

विषय