引自免费微信小程序:皆我百晓生
在 ArcGIS 中进行线密度分析时,影响结果宽度的因素主要包括以下几个方面:
-
线的数量和长度:线的质量(粗细、长度)直接决定了结果的宽度。线越粗或越长,它覆盖的空间范围就越大,结果的宽度也相应地增大。因此,选择高质量、密集的线路可以提高线密度分析的结果清晰度。
import arcgis as es
# 加载数据
dataset = es.read_management_data(url='https://pan.baidu.com/s/1Obch_r6xvt2DXXttWrrdyQ')
# 确定路径起点和终点
path_start = dataset.geometry.location('path_start')
path_end = dataset.geometry.location('path_end')
# 创建线列表
line_list = []
for layer in dataset.esriLayers:
if layer.name == 'path':
line_list.append(es.GeoDataFrame([line] * layer.spatialReference.transform恶化))
else:
line_list.append(es.GeoDataFrame([[point]] * layer.spatialReference.transform恶化))
# 制作线图
fig, ax = plt.subplots()
ax.axis("equal")
es.plot.line(line_list, width=0.5, color='red', alpha=0.8)
plt.show()
-
断点数量和类型:每个线段通常是由两个或者更多的点构成的。其中,靠近断点的部分称为前边点,而远离断点的部分则称为后边点。断点的选择应该根据道路的特性,例如是否存在复杂的地形弯道、转弯处等特殊区域,以及车辆行驶情况等来进行合理分配。
from geopandas.tools import check_buffering
# 验证断点是否符合设计要求
if not check_buffering(path_start, path_end):
raise ValueError(f"Invalid point range for analysis: {path_start} -> {path_end}")
# 计算断点间距
buffer_length = (path_end - path_start).to_meters()
min_buffer_length = max(buffer_length, 0) # remove points with empty buffer area
max_buffer_length = buffer_length / 2 # add one half buffer length to avoid holes in the map
# 确定断点个数
num_points = len(path_end) - len(path_start)
# 分析线段长度分布
line_lengths = [path_end.distance(path_start) for i in range(num_points)]
if len(line_lengths) > max_buffer_length:
max_line_length = len(line_lengths) # limit result to maximum line length
linewidths = [l / max_line_length for l in line_lengths]
elif len(line_lengths) < min_buffer_length:
min_line_length = len(line_lengths) # limit result to minimum line length
linewidths = [min_l / min_line_length for min_l in line_lengths]
# 绘制线图
fig, ax = plt.subplots(figsize=(10, 6))
ax.axis("equal")
es.plot.line(line_list, linewidths=linewidths, color='blue', alpha=0.8)
plt.show()
-
绘制比例尺和坐标系设置:不同的比例尺和坐标系会影响线的划分方式和结果宽度的计算。在某些情况下,优化比例尺设置可以使结果更直观,但也可能导致分析结果不准确。
from matplotlib.transforms import Affine2D
# 根据实际情况调整比例尺和坐标系
origin = [0, 0] # 原始位置
ax.set_transform(Affine2D().scale((dataset.data.xMax, dataset.data.yMax)))
plt.show()
if "band" in dataset.esriLayers[0].name:
color_band = dataset.esriLayers[0].bands['R'].color
cmap = color_band._color_map
normalizer = color_band.get_normalizer()
linetype_color = cmap.to_rgba(normalizer(value_range))
linetype_colors = list(zip(linetype_color, linewidths))
ax.figure.colorbar(ax.patches, ticks=np.arange(len(linetype_colors)), orientation='horizontal')
else:
linetype_colors = linewidths
linetype_color = 'k'
-
分析对象类型和边界特性:不同的对象类型(如道路、建筑物、桥梁、河流等)其边缘特征可能会影响到线的宽度和结果。例如,道路和桥梁边缘通常比其他类型的边界更平直且线性变化更大,因此它们可能会占据较大的比例空间,从而增加分析结果的宽度。
from pyproj import Proj, Piff projecting
from shapely.geometry import Point, Polygon
def is_polygon(obj):
return isinstance(obj, Polygon)
# 将输入对象转换为 GeoDataFrame 类型
obj = ds.geometry where ds.geometry.intersects(obj)
# 如果对象是 polygon,则绘制线
if is_polygon(obj):
fig, ax = plt.subplots(figsize=(10, 6))
ax.axis("equal")
es.plot.polygons(obj, linewidths=linewidths, color='blue', alpha=0.8)
plt.show()
# 否则,只显示线宽度
else:
bbox = obj.bbox
for edge in bbox:
start_point = [bbox.start + (edge[1] - bbox.end), bbox.start + (edge[0] - bbox.end)]
end_point = [bbox.start + (edge[1] + edge[0]), bbox.end + (edge[1] + edge[0])]
exceeding_width = abs(end_point[0] - start_point[0]) - abs(end_point[1] - start_point[1])
width = exceeding_width / abs(edge[1] - edge[0])
ax.text(start_point[0], start_point[1], f'Width: {width:.2f}')
-
栅格数据与地图比例设置:对于栅格数据,确保地图比例正确且栅格边界具有足够的清晰度,可以有效减少线的宽度,使结果更为直观。
# 检查地图比例
mpx_ratio = ds.properties.get('Map Projection', None)
if mpx_ratio is None or mpx_ratio != 'EPSG:4326':
raise ValueError(f"Invalid Map Projections: {mpx_ratio}")
# 设置默认地图比例
fig, ax = plt.subplots(figsize=(10, 6))
ax.axis("equal")
# 在范围内重新设置地图比例
extent = [max(x for x in range(dataset.data.xMin, dataset.data.xMax, 50)),
min(y for y in range(dataset.data.yMin, dataset.data.yMax, 50)),
dataset.data.xMin, dataset.data.yMax]
es.plot.map缩放(extent, spatial_reference='ESRI World', resolution=None, projection=mpx_ratio)
plt.show()
# 显示默认地图比例结果
ax.figure.canvas.draw()
ax.figure.canvas.flush_events()
通过上述方法,您可以在 ArcGIS 中有效地确定线密度分析结果的宽度因素,并在进行后续分析时进行相应的调整和优化。需要注意的是,具体实现时可能需要根据您的实际需求和技术环境进行适当的调整。