[ad_1]
TRONG Theo quan điểm của tôi, một trong những tính năng tốt nhất mà dữ liệu địa lý sở hữu là khả năng hiển thị 3D. Tuy nhiên, do lượng tài nguyên tính toán cần thiết cho những phép tính như vậy nên nó thực sự hiếm khi được thực hiện trong python (thường là JavaScript và các thư viện của nó được sử dụng làm lựa chọn thay thế). Trong một trong những bài viết trước của tôi, tôi đã chia sẻ sáu gói python cho phép tạo các bản đồ tĩnh và tương tác đẹp mắt, nhưng chỉ ở không gian 2D.
Hôm nay tôi muốn thu hẹp khoảng cách này và cùng bạn nghiên cứu một khuôn khổ thực sự phong cách và hiệu quả để trực quan hóa dựa trên internet hiệu suất cao boong.jlcũng có thư viện python PyDeck.
Để khám phá chính xác các khả năng của nó trong python, chúng ta cần một bộ dữ liệu không gian địa lý lớn. Một ứng cử viên hoàn hảo cho điều đó là Dữ liệu Tội phạm Los Angeles 2010–2020 tập dữ liệu từ Kaggle. Could mắn thay, nó có một giấy phép mởđể chúng ta có thể tự do sử dụng nó cho mục đích của mình.
Các tác giả phân phối hai csv các tệp mà chúng tôi sẽ hợp nhất thành một tệp lọc ra tất cả các cột ngoại trừ kinh độ và vĩ độ (tọa độ của những nơi xảy ra tội ác).
🐍Mã python đầy đủ: GitHub.
import numpy as np
import pandas as pd
import xarray as xr
import geopandas as gpd
import random
import mathimport matplotlib.pyplot as plt
from shapely import Level
import cartopy
import cartopy.crs as ccrs
import cartopy.characteristic as cfeature
import warnings
warnings.filterwarnings('ignore')
latest = pd.read_csv('./LA Crimes/Crime_Data_from_2020_to_Present.csv')(('LAT', 'LON'))
previous = pd.read_csv('./LA Crimes/Crime_Data_from_2010_to_2019.csv')(('LAT', 'LON'))
df = pd.concat((previous, latest))
df = df((df.LON!=0) & (df.LAT!=0)) #zeros are Nans in accordance with meta information
Sau khi tải nó vào gấu trúc, tôi muốn thực hiện hiển thị 2D tĩnh bằng cách sử dụng tranh vẽ, chỉ để có một tài liệu tham khảo đáng tin cậy. Nếu chúng ta chỉ đơn giản vẽ biểu đồ dữ liệu, chúng ta sẽ nhận được một loạt điểm dữ liệu không có ích gì cho chúng ta.
Thay vào đó, hãy thực hiện phép nội suy không gian bằng phương pháp NN (bạn có thể đọc thêm về nó trong bài viết khác của tôi).
Về cơ bản, điều đó có nghĩa là chúng ta chuyển các quan sát thưa thớt vào một lưới địa lý (PyDeck sẽ làm điều tương tự, trong trường hợp này có thể gọi là tổng hợp dữ liệu).
def coords(x,y, base=0.01):
x, y = spherical(base * math.ceil(abs(x)/base),2), spherical(base * math.ceil(y/base),2)
return (y,x)def NN(knowledge, LAT, LON):
array = np.zeros((LAT.form(0), LON.form(0)),dtype=int)
onGrid = knowledge.apply(lambda row: coords(row.LAT, row.LON, 0.01), axis = 1).value_counts()
for coor in onGrid.index:
lon_idx, lat_idx = np.the place(LON==coor(0)), np.the place(LAT==coor(1))
array(lat_idx,lon_idx) = int(onGrid(coor))
return array
Sau khi thuật toán hoàn tất (bạn sẽ cần đợi một thời gian vì chúng tôi có hơn 2 triệu hàng để xử lý), chúng tôi có thể gói kết quả của nó vào một xarray tập dữ liệu và ánh xạ nó.
LAT, LON = np.arange(spherical(df.LAT.min()), spherical(df.LAT.max()), 0.01).astype(np.float32), np.arange(spherical(df.LON.min()), spherical(df.LON.max()), 0.01).astype(np.float32)
crimes = NN(df, LAT, LON)
ds = xr.Dataset(
{'Crimes': (('lat', 'lon'), crimes)},
coords={'lat': LAT, 'lon': LON})fig, ax = plt.subplots(subplot_kw=dict(projection=ccrs.PlateCarree()), figsize=(16, 9))
ds.Crimes.plot(ax=ax, cmap='Reds')
ax.set_extent((-118.9, -118.1, 33.6, 34.5 ), crs=ccrs.PlateCarree())
ax.gridlines(draw_labels=True,linewidth=2, shade='black', alpha=0.5, linestyle='--')
ax.add_feature(cfeature.BORDERS, edgecolor='black', linewidth=1)
ax.add_feature(cfeature.COASTLINE, edgecolor='black', linewidth=1)
ax.add_feature(cartopy.characteristic.RIVERS, edgecolor='blue', linewidth=0.5)
states_provinces = cfeature.NaturalEarthFeature(
class='cultural', title='admin_1_states_provinces',
scale='10m', facecolor='none')
plt.present()
Theo quan điểm của tôi, nó trông đẹp và nhiều thông tin, nhưng nếu bạn cần bán dự án này cho ai đó, rất có thể bạn sẽ thất bại với bản đồ như vậy xD. Vì vậy, hãy cài đặt PyDeck và xem nó có thể làm gì cho chúng ta!
Loại lớp bản đồ đầu tiên tôi thấy đẹp là lớp Hình lục giác. Bạn cần chỉ định nó trong khi tạo Layer biến trong PyDeck. Có một số thông số quan trọng khác đối với chúng tôi:
- bán kính (bán kính của hình lục giác tính bằng mét, tức là độ phân giải không gian tính bằng m);
- độ cao_scale (hệ số tỷ lệ cho thùng, giá trị càng lớn thì hình lục giác càng cao);
- độ cao_range (chiều cao tối thiểu và tối đa);
- có thể chọn (hiển thị tương tác các giá trị);
- ép đùn (độ cao tế bào).
layer = pdk.Layer(
'HexagonLayer',
df,
get_position=('LON', 'LAT'),
radius=500, #bin radius
auto_highlight=True,
elevation_scale=50, #scale issue for bins (the higher - the upper)
elevation_range=(0, 3000),
pickable=True,
extruded=True,#cell elevation
)
Biến thứ hai chúng ta cần tạo là trạng thái View. Chúng ta cần cho nó ăn:
- kinh độ và vĩ độ;
- thu phóng (thu phóng ban đầu);
- min_zoom và max_zoom;
- ổ đỡ (góc nhìn trái/phải);
- cao độ (góc nhìn lên/xuống).
view_state = pdk.ViewState(
longitude=-118.3,
latitude=34.4,
zoom=8,
min_zoom=6,
max_zoom=15,
bearing=-20,#left/proper angle
pitch=20, #up/down angle
)
Vì chúng tôi có tập dữ liệu lớn nên google colab không hiển thị tất cả tập dữ liệu nên bạn có hai tùy chọn:
- Mẫu N hàng từ tập dữ liệu;
- Lưu bản đồ vào html và mở nó trong trình duyệt của bạn.
Nếu bạn chọn cái thứ hai, bạn sẽ nhận được điều này:
Thành thật mà nói, tôi thích hình thức của hình lục giác, nhưng tôi chưa bao giờ nhìn thấy chúng trong bất kỳ bài báo/bài trình bày/bài giảng khoa học nào, vì vậy tôi khuyên bạn nên sử dụng chúng một cách có ý thức.
Bây giờ hãy thử tạo một hình ảnh trực quan tương tự nhưng sử dụng các cột. Nhưng trong trường hợp này, chúng ta sẽ cần chuyển cho hàm tập dữ liệu xarray mà chúng ta đã tạo trước đó và chỉ định màu cũng như biến để trực quan hóa:
layer = pdk.Layer(
'ColumnLayer',
ds.to_dataframe().reset_index(),
get_position=('lon', 'lat'),
get_elevation='Crimes',
elevation_scale=10,
radius=200,
get_fill_color=('Crimes', 220),
pickable=True,
extruded=True,
)
Về bản chất, biểu đồ phân tán là một đám mây điểm, nhưng các tác giả của PyDeck đã phát triển các hình trụ trông khá độc đáo:
layer = pdk.Layer(
'ColumnLayer',
df(:15000),
get_position=('LON', 'LAT'),
auto_highlight=True,
get_radius=200, # Radius is given in meters
get_fill_color=(180, 0, 200, 140), # Set an RGBA worth for fill
pickable=True)
Một điều thực sự thú vị về PyDeck là dưới dạng các công cụ lập bản đồ âm mưu, geemap, folium và các công cụ lập bản đồ tương tác khác, nó cho phép người dùng thay đổi bản đồ cơ sở, nghĩa là bạn có thể thiết kế bản đồ theo bối cảnh dự án của mình:
r = pdk.Deck(layers=(layer),
initial_view_state=view_state,
map_style=pdk.map_styles.LIGHT, # ‘gentle’, ‘darkish’, ‘highway’, ‘satellite tv for pc’, ‘dark_no_labels’, and ‘light_no_labels
)
Tính năng tiếp theo mà tôi thấy cực kỳ hữu ích là thay đổi mô tả dữ liệu tương tác. Bằng cách đặt con trỏ lên một cột/hình lục giác/điểm, bạn có thể nhận được thông tin meta, nhưng thường nó trông hơi phi lý. Nhưng trong PyDeck bạn có thể dễ dàng khắc phục điều đó:
r = pdk.Deck(layers=(layer),
initial_view_state=view_state,
"html": "Variety of crimes: {elevationValue}",
"model": {
"backgroundColor": "yellow",
"shade": "black"
}
},
)
Cuối cùng, tính năng tuyệt vời nhất của thư viện này là khả năng thay đổi góc nhìn trên bản đồ chỉ bằng cách nhấp chuột phải:
from ipywidgets import HTMLtextual content = HTML(worth='Transfer the point of view')
def filter_by_bbox(row, west_lng, east_lng, north_lat, south_lat):
return west_lng < row('lng') < east_lng and south_lat < row('lat') < north_lat
def filter_by_viewport(widget_instance, payload):
west_lng, north_lat = payload('knowledge')('nw')
east_lng, south_lat = payload('knowledge')('se')
filtered_df = df(df.apply(lambda row: filter_by_bbox(row, west_lng, east_lng, north_lat, south_lat), axis=1))
r.deck_widget.on_click(filter_by_viewport)
Tôi chắc chắn thích PyDeck và dự định đi sâu hơn vào boong.jl khuôn khổ. Với cú pháp siêu dễ dàng và trực quan, nó cho phép người dùng xây dựng các hình ảnh trực quan ấn tượng và tiết kiệm năng lượng. Python giới hạn khả năng của gói này rất nhiều, vì vậy hãy kiểm tra phòng trưng bàythật tuyệt vời, đặc biệt là tính năng GlobalView thử nghiệm của họ…
Hy vọng bài viết này mang lại thông tin hữu ích và sâu sắc cho bạn!
===============================================
Tất cả các ấn phẩm của tôi trên Medium đều miễn phí và có thể truy cập mở, đó là lý do tại sao tôi thực sự đánh giá cao nếu bạn theo dõi tôi tại đây!
Ps Tôi cực kỳ đam mê Khoa học dữ liệu (Địa lý), ML/AI và Biến đổi khí hậu. Vì vậy, nếu bạn muốn làm việc cùng nhau trong một số dự án, vui lòng liên hệ với tôi theo địa chỉ LinkedIn.
🛰️Theo dõi để biết thêm🛰️
[ad_2]
Source link