找回密码
 立即注册

QQ登录

只需一步,快速开始

xyz_2019

注册会员

6

主题

27

帖子

191

积分

注册会员

积分
191
xyz_2019
注册会员   /  发表于:2022-6-13 17:09  /   查看:3535  /  回复:8
本帖最后由 xyz_2019 于 2022-6-13 17:48 编辑

为摆脱在线转svg到GeoJson工具的每月3次转换限制,并且提高生成自定义地图的效率和区块之间位置、比例的准确性,尝试在Auto CAD内制作VBA工程,并通过CAD VBA工程从CAD工程文件导出自定义地图(area)和点(point)对象为txt文件,然后通过记事本或者Visual Studio简单编辑txt文件,最后修改文件后缀名为json即可:
1. 在CAD的”模型“编辑框内,使用多段线绘制出各个封闭区块;
image.png25921935.png
2. 在CAD的Visual Basic编辑器内贴入以下代码,并运行,导出txt文件:
有两个函数,分别用于导出区块和点两种对象,注意红色加粗内容是导出文件保存位置,需要自行修改 CAD制作GeoJson文件.png30846556.png
Sub 导出多段线对象坐标到txt文件再转GeoJson文件作为area文件()
    Dim Ent As Object
    Dim getDpts As Variant
    Dim 每个点坐标前字符串 As String
    Dim 每个点坐标后字符串 As String
    Dim 坐标x As String
    Dim 坐标y As String
    Open "i:\alltext.txt" For Append As #1
    Print #1, "{""type"": ""FeatureCollection"",""creator"": ""xyz_2019"",""name"": ""DSXGZD"",""features"": ["
    每个点坐标前字符串名字前 = "{ ""type"": ""Feature"", ""properties"": { ""name"": """
    每个点坐标前字符串名字后 = """}, ""geometry"": { ""type"": ""Polygon"", ""coordinates"": [ [ "
    每个点坐标后字符串 = "] ] } },"
    j = 1
    For Each Ent In ThisDrawing.ModelSpace
        If Ent.ObjectName = "AcDbPolyline" Then
            If j = 1 Then
                Print #1, 每个点坐标前字符串名字前 & "坝体轮廓" & 每个点坐标前字符串名字后
            ElseIf j = 2 Then
                Print #1, 每个点坐标前字符串名字前 & "坝轴线" & 每个点坐标前字符串名字后
            Else
                Print #1, 每个点坐标前字符串名字前 & CStr(j - 2) & 每个点坐标前字符串名字后
            End If      
            getDpts = Ent.Coordinates
            For i = 0 To UBound(Ent.Coordinates) \ 2
                If Left(getDpts(i * 2), 1) = "." Then
                    坐标x = "0" & getDpts(i * 2)
                Else
                    坐标x = getDpts(i * 2)
                End If
                If Left(getDpts(i * 2 + 1), 1) = "." Then
                    坐标y = "0" & getDpts(i * 2 + 1)
                Else
                    坐标y = getDpts(i * 2 + 1)
                End If
                If i < UBound(Ent.Coordinates) \ 2 Then
                    Print #1, "[" & 坐标x & ", " & 坐标y & " ],"
                Else
                    Print #1, "[" & 坐标x & ", " & 坐标y & " ]"
                End If
            Next i
            Print #1, 每个点坐标后字符串
        End If
        j = j + 1
    Next Ent
    Print #1, "] }"
    Close #1
    MsgBox "已完成"
End Sub

Sub 导出点对象坐标到txt文件再转GeoJson文件作为point文件()
    Dim Ent As Object
    Dim getDpts As Variant
    Dim 每个点坐标前字符串 As String
    Dim 每个点坐标后字符串 As String
    Open "i:\alltext.txt" For Append As #1
    Print #1, "{""type"": ""FeatureCollection"", ""features"": ["
    每个点坐标前字符串 = "{ ""type"": ""Feature"", ""properties"": { ""name"": ""N""}, ""geometry"": { ""type"": ""Point"", ""coordinates"": [ "
    每个点坐标后字符串 = "] } },"
    For Each Ent In ThisDrawing.ModelSpace
        If Ent.ObjectName = "AcDbPoint" Then
            Print #1, 每个点坐标前字符串
            getDpts = Ent.Coordinates
            Print #1, "[" & getDpts(0) & ", " & getDpts(1) & " ]"
            Print #1, 每个点坐标后字符串
        End If
    Next Ent
    Print #1, "] }"
    Close #1
    MsgBox "已完成"
End Sub
3. 用记事本或者Visual Studio打开导出的txt文件,进行编辑和修改:
主要是修改区块的名称,并排除结尾的一个语法瑕疵。
image.png499984740.png image.png458926085.png
4. 最后修改文件名格式
区块对象格式为”******_area.json“,点对象格式为”******_point.json“,复制到这个文件夹就可以用了
image.png793075256.png
5. 可能需要多次尝试,才能呈现最理想的自定义地图:
image.png629716796.png
以上为个人经验,或有不足之处,请多指导交流。

评分

参与人数 2金币 +671 收起 理由
Chelsey.Wang + 666 赞一个!
Lay.Li + 5 赞一个!

查看全部评分

8 个回复

倒序浏览
alexyui悬赏达人认证 活字格认证
银牌会员   /  发表于:2022-6-22 08:33:47
推荐
好多年没看VBA语法了,给大佬点赞
回复 使用道具 举报
谢厅讲师达人认证 悬赏达人认证 活字格认证
金牌服务用户   /  发表于:2022-6-13 17:25:55
推荐
感谢大佬分享
这个帖子不加精版主拉去修长城好吧
回复 使用道具 举报
xyz_2019
注册会员   /  发表于:2022-6-13 17:19:49
沙发
以往相关讨论内容:
1. yikai,https://gcdn.grapecity.com.cn/showtopic-69056-1-1.html,https://gcdn.grapecity.com.cn/showtopic-69010-1-1.html
2. 钟海东,https://gcdn.grapecity.com.cn/showtopic-80496-1-1.html
回复 使用道具 举报
Lay.Li悬赏达人认证 活字格认证
超级版主   /  发表于:2022-6-13 17:22:01
板凳
回复 使用道具 举报
xyz_2019
注册会员   /  发表于:2022-6-13 17:52:29
5#
谢厅 发表于 2022-6-13 17:25
感谢大佬分享
这个帖子不加精版主拉去修长城好吧

向谢老板学习!
回复 使用道具 举报
carl_chen悬赏达人认证 活字格认证
金牌服务用户   /  发表于:2022-6-14 08:45:38
6#
回复 使用道具 举报
cfanlane
中级会员   /  发表于:2022-6-20 09:34:32
7#
高手如云呀,,,赞一个
回复 使用道具 举报
白菜贝贝悬赏达人认证 活字格认证
银牌会员   /  发表于:2022-6-20 16:13:19
8#
虽然看不懂
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部