ezdxf -- 将未定义的 EPSG 3395 纬度经度十进制坐标转换为 WCS 坐标以保存修改后的 DXF 文件

问题描述 投票:0回答:1

2023 年 12 月 26 日更新

DXF
文件是通过 QGIS 3.34 中的导出项目到 DXF 功能创建的。尽管导出的
DXF
设置为 EPSG 3395,但该指定并未在
dxf.coordinate_type
中设置。 mozman的答案和之前显示的代码合并如下:

import ezdxf
from ezdxf import transform
from ezdxf.math import Matrix44

CRS_TO_WCS = True

doc = ezdxf.readfile("tester.dxf")
msp = doc.modelspace()
geo_data = msp.get_geodata()


def wcs_to_crs(entities, m):
    transform.inplace(entities, m)

def crs_to_wcs(entities, m):
    m = m.copy()
    m.inverse()
    transform.inplace(entities, m)

if geo_data:
    # Get the transformation matrix and epsg code:
    m, epsg = geo_data.get_crs_transformation()
else:
    # Identity matrix for DXF files without a geo location reference:
    m = Matrix44()
    epsg = 3395

if geo_data:
    m, epsg = geo_data.get_crs_transformation()
    if CRS_TO_WCS:
        crs_to_wcs(msp)
    else:
        wcs_to_crs(msp)
else:
    print("No geo reference data available.")

结果是“没有可用的地理参考数据。”

我会提出一个单独的问题来设置 CRS 值。


测试器中的所有实体

DXF
都是
TEXT
LWPOLYLINE

我的目标是将

LWPOLYLINE
中所有图层中的所有
TEXT
DXF
实体从 EPSG 3395(十进制度的纬度经度)递归转换为
WCS
坐标,然后将修改后的
DXF
文件保存为一个新文件。

为此,我应该使用

crs_to_wcs
还是
globe_to_map
?有一个很好的例子来说明步骤吗?

下面是根据

ezdxf
文档修改的python代码:

import ezdxf
from ezdxf.math import Matrix44
from ezdxf.addons import geo

doc = ezdxf.readfile("tester.dxf")

msp = doc.modelspace()

# Get the geo location information from the DXF file:
geo_data = msp.get_geodata()
if geo_data:
    # Get transformation matrix and epsg code:
    m, epsg = geo_data.get_crs_transformation()
else:
    # Identity matrix for DXF files without geo reference data:
    m = Matrix44()
    epsg = 3395
python latitude-longitude dxf ezdxf
1个回答
0
投票

geo
插件实现了
__geo_interface__
,这里不需要。

import ezdxf
from ezdxf import transform

CRS_TO_WCS = True

doc = ezdxf.readfile("tester.dxf")
msp = doc.modelspace()
geo_data = msp.get_geodata()


def wcs_to_crs(entities, m):
    transform.inplace(entities, m)

def crs_to_wcs(entities, m):
    m = m.copy()
    m.inverse()
    transform.inplace(entities, m)

if geo_data:
    m, epsg = geo_data.get_crs_transformation()
    if CRS_TO_WCS:
        crs_to_wcs(msp)
    else:
        wcs_to_crs(msp)
else:
   print("No geo reference data available.")

请阅读 GEODATA 实体的文档以了解限制。

  • 仅适用于局部网格(线性)变换
  • 仅适用于已知的 CRS 配置
  • GEODATA 版本 1 并未得到真正支持(无文档)
© www.soinside.com 2019 - 2024. All rights reserved.