You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python绘制带实际尺寸的多边形:寻求可缩放矢量绘图库方案

适合绘制带真实坐标地块的Python矢量绘图库

推荐几个能满足你需求的库,支持精确坐标控制、比例缩放,且生成矢量格式文件(适配建筑图纸场景):

1. PyCairo

PyCairo是轻量型矢量绘图库,支持生成PDF、SVG、PNG等格式,可直接基于真实坐标绘图,再通过缩放参数输出对应比例的图纸。

示例代码(以1/100比例绘制地块):

import cairo

# 真实坐标数据(闭合多边形)
x = [21065.67, 21063.77, 21079.64, 21081.62, 21065.67]
y = [19803.76, 19827.50, 19829.54, 19805.39, 19803.76]
scale = 1/100  # 缩放比例1:100

# 创建PDF表面,预留边距避免内容裁切
max_x = max(x) * scale
max_y = max(y) * scale
surface = cairo.PDFSurface("plot_100.pdf", max_x + 50, max_y + 50)
ctx = cairo.Context(surface)

# 应用缩放规则
ctx.scale(scale, scale)

# 绘制多边形
ctx.move_to(x[0], y[0])
for i in range(1, len(x)):
    ctx.line_to(x[i], y[i])
ctx.close_path()

# 调整线条宽度(反向抵消缩放影响,保证输出后粗细符合预期)
ctx.set_source_rgb(0, 0, 0)
ctx.set_line_width(0.5 * (1/scale))
ctx.stroke()

surface.finish()

2. ReportLab

ReportLab专注于PDF生成,内置适配工程绘图的坐标系统,支持精确缩放,还可添加标注、文字等元素,适合制作完整的建筑图纸文档。

示例代码:

from reportlab.pdfgen import canvas
from reportlab.lib.units import mm

# 真实坐标与缩放比例
x = [21065.67, 21063.77, 21079.64, 21081.62, 21065.67]
y = [19803.76, 19827.50, 19829.54, 19805.39, 19803.76]
scale = 1/100  # 1:100比例

# 创建PDF画布,单位设为毫米(工程图常用单位)
page_width = max(x)*scale + 10*mm
page_height = max(y)*scale + 10*mm
c = canvas.Canvas("plot_reportlab.pdf", pagesize=(page_width, page_height))

# 应用缩放
c.scale(scale, scale)

# 绘制多边形
c.setStrokeColorRGB(0,0,0)
c.setLineWidth(0.5 / scale)
c.moveTo(x[0], y[0])
for xi, yi in zip(x[1:], y[1:]):
    c.lineTo(xi, yi)
c.closePath()
c.stroke()

c.save()

3. SVGwrite

直接生成SVG矢量文件,SVG为纯文本格式,可直接用浏览器、CAD软件打开编辑,缩放时不会失真,适合需要后续二次编辑的场景。

示例代码:

import svgwrite

# 真实坐标与缩放比例
x = [21065.67, 21063.77, 21079.64, 21081.62, 21065.67]
y = [19803.76, 19827.50, 19829.54, 19805.39, 19803.76]
scale = 1/200  # 1:200比例

# 通过viewBox控制整体缩放,添加边距
view_box = (0, 0, max(x)*scale + 50, max(y)*scale + 50)
dwg = svgwrite.Drawing("plot.svg", viewBox=f"{view_box[0]} {view_box[1]} {view_box[2]} {view_box[3]}")

# 创建多边形路径,使用真实坐标,缩放由viewBox自动处理
polygon = dwg.polygon(points=list(zip(x, y)), stroke='black', fill='none', stroke_width=0.5/(scale))
dwg.add(polygon)

dwg.save()

关键注意点

  • 缩放时,线条宽度需要反向调整(线条宽度 = 目标输出宽度 / 缩放比例),避免缩放后线条过细或过粗。
  • 生成的PDF/SVG文件可直接导入AutoCAD、SketchUp等建筑类软件,保留精确坐标信息。

内容的提问来源于stack exchange,提问作者user3132616

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 11:15:36