kaggle地理空間分析-coordinate reference system(坐標參考系統)


介紹

您在本課程中創建的地圖以二維方式描繪了地球表面。但是,正如您所知,世界實際上是三維地球。因此,我們必須使用一種稱為地圖投影的方法將其渲染為平坦表面。

地圖投影不能100%准確。每個投影都會以某種方式扭曲地球表面,同時保留一些有用的屬性。例如,

  • 等面積投影(例如“蘭伯特圓柱等分面積”或“非洲阿爾伯斯等分圓錐”)可保留面積。例如,如果您想計算一個國家或城市的面積,這是一個不錯的選擇。

  • 等距投影(例如“方位角等距投影”)保留距離。這將是計算飛行距離的好選擇。

我們使用坐標參考系統(CRS)來顯示投影點如何對應於地球上的真實位置。在本教程中,您將了解有關坐標參考系統的更多信息,以及如何在GeoPandas中使用它們。

import geopandas as gpd
import pandas as pd

設置CRS

當我們從shapefile創建GeoDataFrame時,已經為我們導入了CRS。

# Load a GeoDataFrame containing regions in Ghana
regions = gpd.read_file("../input/geospatial-learn-course-data/ghana/ghana/Regions/Map_of_Regions_in_Ghana.shp")
print(regions.crs)
{'init': 'epsg:32630'}

您如何解釋?

坐標參考系統由歐洲石油測量集團(EPSG)代碼參考。

此GeoDataFrame使用EPSG 32630,通常更稱為“墨卡托”投影。 該投影保留了角度(使其對於海上航行很有用)並且使區域略微變形。

但是,從CSV文件創建GeoDataFrame時,必須設置CRS。 EPSG 4326對應於緯度和經度的坐標。

# Create a DataFrame with health facilities in Ghana
facilities_df = pd.read_csv("../input/geospatial-learn-course-data/ghana/ghana/health_facilities.csv")

# Convert the DataFrame to a GeoDataFrame
facilities = gpd.GeoDataFrame(facilities_df, geometry=gpd.points_from_xy(facilities_df.Longitude, facilities_df.Latitude))

# Set the coordinate reference system (CRS) to EPSG 4326
facilities.crs = {'init': 'epsg:4326'}

# View the first five rows of the GeoDataFrame
facilities.head()

在上面的代碼單元中,要從CSV文件創建GeoDataFrame,我們需要同時使用Pandas和GeoPandas:

  • 我們首先創建一個DataFrame,其中包含具有經度和緯度坐標的列。
  • 要將其轉換為GeoDataFrame,我們使用gpd.GeoDataFrame()。
  • gpd.points_from_xy()函數從緯度和經度列創建Point對象。

重新投影

重新投影是指更改CRS的過程。 這是在GeoPandas中使用to_crs()方法完成的。

繪制多個GeoDataFrame時,重要的是它們都使用相同的CRS。 在下面的代碼單元中,我們在繪制之前更改設施GeoDataFrame的CRS以匹配區域的CRS。

# Create a map
ax = regions.plot(figsize=(8,8), color='whitesmoke', linestyle=':', edgecolor='black')
facilities.to_crs(epsg=32630).plot(markersize=1, ax=ax)
<matplotlib.axes._subplots.AxesSubplot at 0x7faa424e6748>


to_crs()方法僅修改“ geometry”列:所有其他列均保持不變。

# The "Latitude" and "Longitude" columns are unchanged
facilities.to_crs(epsg=32630).head()

如果在GeoPandas中沒有EPSG代碼,我們可以使用CRS的“ proj4字符串”來更改CRS。 例如,要轉換為緯度/經度坐標的proj4字符串如下:

+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs
# Change the CRS to EPSG 4326
regions.to_crs("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs").head()

幾何對象的屬性

正如您在第一個教程中所了解的那樣,對於任意的GeoDataFrame,“ geometry”列中的類型取決於我們要顯示的內容:例如,我們可以使用:

  • 震中點
  • 街道的LineString,或
  • 顯示國家邊界的多邊形。
    三種類型的幾何對象均具有內置屬性,可用於快速分析數據集。 例如,您可以分別從x和y屬性獲得Point的x和y坐標。
# Get the x-coordinate of each point
facilities.geometry.x.head()
out:
0   -1.96317
1   -1.58592
2   -1.34982
3   -1.61098
4   -1.61098
dtype: float64

並且,您可以從length屬性中獲取LineString的長度。

或者,您可以從area屬性獲得多邊形的面積。

# Calculate the area (in square meters) of each polygon in the GeoDataFrame 
regions.loc[:, "AREA"] = regions.geometry.area / 10**6

print("Area of Ghana: {} square kilometers".format(regions.AREA.sum()))
print("CRS:", regions.crs)
regions.head()
out:
Area of Ghana: 239584.5760055668 square kilometers
CRS: {'init': 'epsg:32630'}

在上面的代碼單元中,由於區域GeoDataFrame的CRS設置為EPSG 32630(“墨卡托”投影),因此與使用等面積投影(如“非洲阿爾伯斯等距圓錐形”)相比,面積計算的准確性稍差 ”。

但是,這加納的面積約為239585平方公里,與正確答案相差不遠。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM