我有一张洛杉矶地区的热图,存储为矩阵;然而,信息存储为像素,而不是更方便的(纬度、经度)。有什么办法可以将其合并到地图中吗?
我有多个不完全重叠的图像,使用它们的坐标访问图像上的公共点会很方便。
要将基于像素的热图合并到洛杉矶的地理地图中并处理纬度和经度的转换,请按照以下步骤操作:
识别与热图图像边缘相对应的地理边界(最小和最大纬度和经度)。这些信息通常可以在与图像相关的元数据或文档中找到。
创建一个函数,根据已知范围将像素坐标转换为地理坐标。对于简单的线性映射,您可以使用以下变换: 纬度 = 最小纬度 + (像素_y / 图像高度) * (最大纬度 - 最小纬度) lon = min_lon + (pixel_x / image_width) * (max_lon - min_lon)
使用 Python 中的 folium、gmplot 或 geopandas 等地图库来绘制地理坐标。 实施示例 假设您有热图的地理范围和图像尺寸:
import numpy as np
import folium
# Define the geographic bounds of the map (example values)
min_lat = 34.000 # minimum latitude
max_lat = 34.200 # maximum latitude
min_lon = -118.500 # minimum longitude
max_lon = -118.200 # maximum longitude
# Dimensions of the heatmap image (example values)
image_width = 1000 # width in pixels
image_height = 800 # height in pixels
# Function to convert pixel coordinates to lat/lon
def pixel_to_geo(pixel_x, pixel_y, min_lat, max_lat, min_lon, max_lon, image_width, image_height):
lat = min_lat + (pixel_y / image_height) * (max_lat - min_lat)
lon = min_lon + (pixel_x / image_width) * (max_lon - min_lon)
return lat, lon
# Example heat map matrix (replace with your data)
heatmap_matrix = np.random.random((image_height, image_width))
# Create a folium map centered on the region
m = folium.Map(location=[(min_lat + max_lat) / 2, (min_lon + max_lon) / 2], zoom_start=12)
# Convert heat map matrix to geographic coordinates and add to map
for x in range(image_width):
for y in range(image_height):
lat, lon = pixel_to_geo(x, y, min_lat, max_lat, min_lon, max_lon, image_width, image_height)
folium.CircleMarker(location=[lat, lon], radius=1, color=f'#{int(heatmap_matrix[y, x] * 255):02x}0000').add_to(m)
# Save map to HTML file
m.save('heatmap.html')
处理不重叠的图像 如果您有多个图像不完全重叠,请确保每个图像都有地理范围。根据每个图像的特定边界对其应用相同的变换。您可以在地图上对这些图像进行分层,每个图像都有自己的地理变换。
具有多个图像的示例
# List of heatmaps with their respective bounds and dimensions
heatmaps = [
{
"data": np.random.random((800, 1000)),
"bounds": (34.000, 34.200, -118.500, -118.200), # (min_lat, max_lat, min_lon, max_lon)
"dimensions": (1000, 800) # (image_width, image_height)
},
# Add more heatmaps here
]
# Create a folium map centered on the region
m = folium.Map(location=[34.100, -118.350], zoom_start=12)
# Add each heatmap to the folium map
for heatmap in heatmaps:
data = heatmap["data"]
min_lat, max_lat, min_lon, max_lon = heatmap["bounds"]
image_width, image_height = heatmap["dimensions"]
for x in range(image_width):
for y in range(image_height):
lat, lon = pixel_to_geo(x, y, min_lat, max_lat, min_lon, max_lon, image_width, image_height)
folium.CircleMarker(location=[lat, lon], radius=1, color=f'#{int(data[y, x] * 255):02x}0000').add_to(m)
# Save map to HTML file
m.save('heatmap_combined.html')
这种方法可确保每个图像都正确映射到其地理位置,使您可以在公共坐标系上访问和可视化它们。
最好的!