Cesium for Unity叠加行政区划线

先放上效果图

使用了插件 Shapes

https://assetstore.unity.com/packages/tools/particles-effects/shapes-173167

数据集文件

1、带十段线的

通过网盘分享的文件:100000_full.json

链接: https://pan.baidu.com/s/1gkpe8qEbpI9hfSFNWz8B-w?pwd=66ij 提取码: 66ij

2、不带十段线的

通过网盘分享的文件:中国.geoJson

链接: https://pan.baidu.com/s/1OuDg0MFIv3cRBi9qiIFdMA?pwd=raq5 提取码: raq5

来自 https://geojson.hxkj.vip/

代码

csharp 复制代码
using CesiumForUnity;
using Newtonsoft.Json;
using Shapes;
using System.Collections.Generic;
using System.IO;
using Unity.Mathematics;
using UnityEngine;

public class TestLine : MonoBehaviour
{
    public GameObject linePrefab;
    public CesiumGeoreference cg;

    // Start is called before the first frame update
    void Start()
    {
        string json = File.ReadAllText(Application.streamingAssetsPath + "/100000_full.json");
        Root root = JsonConvert.DeserializeObject<Root>(json);
        Debug.Log(root.name);
        GameObject lineRoot = new GameObject();
        lineRoot.name = "lineRoot";
        CesiumGlobeAnchor cgal = lineRoot.AddComponent<CesiumGlobeAnchor>();
        cgal.longitudeLatitudeHeight = new double3(0, 0, 0);
        lineRoot.transform.SetParent(transform);

        double3 temp = new double3();
        foreach (Feature f in root.features)
        {
            if (f.geometry.type == "MultiPolygon")
            {
                var multi = JsonConvert.DeserializeObject<List<List<List<List<double>>>>>(
                    JsonConvert.SerializeObject(f.geometry.coordinates)
                );
                Debug.Log($"{f.properties.name}: MultiPolygon with {multi.Count} polygons");

                for (int i = 0; i < multi.Count; i++)
                {
                    List<List<List<double>>> item = multi[i];

                    GameObject lineObject = Instantiate(linePrefab, lineRoot.transform);
                    lineObject.name = f.properties.name;
                    Polyline polyline = lineObject.GetComponent<Polyline>();
                    polyline.Thickness = 2000; 
                    List<Vector3> list = new List<Vector3>();

                    for (var j = 0; j < item[0].Count; j++)
                    {
                        double3 l = new double3();
                        l.x = item[0][j][0];
                        l.y = item[0][j][1];
                        l.z = 0;

                        if(temp.Equals(l))
                        {
                            //剔除重复的点,会导致画线中断,画线插件有bug
                            continue;
                        }
                        temp = l;
                        double3 t3 = CesiumWgs84Ellipsoid.LongitudeLatitudeHeightToEarthCenteredEarthFixed(l);
                        double3 u3 = cg.TransformEarthCenteredEarthFixedPositionToUnity(t3);
                        Vector3 v3 = new Vector3((float)u3.x, (float)u3.y, (float)u3.z);
                        polyline.AddPoint(v3); 
                    } 
                    polyline.Closed = true; 
                }
            }
            else if (f.geometry.type == "Polygon")
            {
                var poly = JsonConvert.DeserializeObject<List<List<List<double>>>>(
                    JsonConvert.SerializeObject(f.geometry.coordinates)
                );
                Debug.Log($"{f.properties.name}: Polygon with {poly.Count} rings");
            }
            else
            {
                Debug.LogWarning(f.geometry.type);
            }
        }
    }

    // Update is called once per frame
    void Update()
    {

    }
}
相关推荐
海清河晏1116 小时前
数据结构 | 单链表
数据结构·unity·dreamweaver
mxwin8 小时前
Unity URP 下 MatCap 技术详解 无视光照环境的卡通与质感渲染方案
unity·游戏引擎
山檐雾1 天前
OctreeNode
unity·c#·八叉树
WarPigs1 天前
Unity协程返回值的解决方案
unity·游戏引擎
WarPigs1 天前
Unity单例笔记
unity·游戏引擎
liuccn2 天前
TileServer GL的基本讲解
gis·空间数据
Allen74742 天前
ComfyUI 自动化生产 3D资产 工作流笔记
图像处理·opencv·unity·自然语言处理·3d模型生成·confyui
liuccn2 天前
GIS 数据存储格式
gis·存储·空间数据
nnsix2 天前
Unity Windows11 打字中文显示不出来输入法的候选框
unity
adogai3 天前
unity mcp接入 实现一句话生成游戏!
游戏·unity·游戏引擎