【二次开发】CityMaker数据加载——矢量数据

版权声明:CityMaker技术服务中心——小白 https://blog.csdn.net/weixin_38476447/article/details/86686959

**

加载矢量数据

**

一、技术原理

计算机中显示的图形一般分为两大类——矢量和位图。矢量图使用直线和曲线来描述图形,这些图形的元素是一些点、线、矩形、多边形、圆和弧等,它们都是通过数学公式计算获得的。矢量图形无论是放大、缩小或者旋转都不会失真。

CityMaker 几乎支持所有的主流矢量数据的加载,其支持的格式请参考SDKHelp中 gviConnectionType 中的数据类型。

Shapefile文件是由ESRI公司开发,是描述空间数据的几何和属性特征的非拓扑实体矢量数据结构的一种格式,其主要包括:

•主文件(*.shp): 存储地理要素的几何图形的文件;     
•索引文件(*.shx): 存储图形要素与属性信息索引的文件;     
•dBASE表文件(*.dbf): 存储要素信息属性的dBase表文件;  
其它附属文件有.prj、.sbn等。

ArcSDE 为ESRI公司开发的ArcGIS的空间数据引擎,为存储、管理、检索空间数据提供高效率的数据服务,CityMaker把它当做一种矢量数据源,即可以在三维场景中加载。

本节主要讲解如何将shapefile数据加入场景中。

二、实现步骤

1. .Net步骤

private void loadShp(){
    //创建数据连接
    IConnectionInfo ci = new ConnectionInfo();  //新建数据连接
    ci.ConnectionType = gviConnectionType.gviConnectionShapeFile;    //数据连接类型为shapefile
    ci.Database = @"D:\citymakerbookdata\polygon.shp";    //shp文件地址

    //打开数据源,获取数据集
    IDataSourceFactory dsFactory = new DataSourceFactory();
    IDataSource ds = dsFactory.OpenDataSource(ci);  //利用数据源工厂打开数据数据源
    string[] setnames = (string[])ds.GetFeatureDatasetNames();//获得所有数据集的名称
    if (setnames.Length == 0)
        return;
    IFeatureDataSet dataset = ds.OpenFeatureDataset(setnames[0]);//通过数据集名称打开第一个数据集

    //通过数据集类型获取FeatureClass(要素类)的所有名称
    string[] fcnames = (string[])dataset.GetNamesByType(gviDataSetType.gviDataSetFeatureClassTable);
    if (fcnames.Length == 0)
        return;

    //获取要素类,创建要素图层
    foreach (string name in fcnames)
    {
        IFeatureClass fc = dataset.OpenFeatureClass(name);//通过要素类名称打开要素类
        IFeatureLayer featureLayer = rendercontrol.ObjectManager.CreateFeatureLayer(fc, "Geometry", null, null, rootId);//创建几何字段名称为“Geometry”的图层        
    }
}

2. JS步骤

function loadShp() {

    //新建数据库连接
    var c = __g.new_ConnectionInfo;    
    c.connectionType = 12;
    c.database = "D:\\citymakerbookdata\\polygon.shp";

    //打开数据源,获得数据集
    var ds = __g.dataSourceFactory.openDataSource(c);    //利用数据源工厂打开数据库
    var fdsNames = ds.getFeatureDatasetNames();    //获得所有数据集的名称
    if (fdsNames.length == 0)
        return false;
    var __fds = ds.openFeatureDataset(fdsNames[0]);    //打开第一个数据集
    var fcNames = __fds.getNamesByType(3);    //获得数据集中所有要素类(FeatureClass)的名称
    if (fcNames.length == 0)
        return false;

    var __rootId = __g.objectManager.getProjectTree().rootID; //也可直接用字符串"11111111-1111-1111-1111-111111111111"
    //获取要素类,创建要素图层
    for (var i = 0; i < fcNames.length; i++) {
        var fc = __fds.openFeatureClass(fcNames[i]);    //通过名称打开要素类
        var fl = __g.objectManager.createFeatureLayer(fc, "Geometry", null, null, __rootId); //创建几何字段名称为“Geometry”的图层
    }    
}

三、注意事项

加载shp数据出错的可能有以下原因:

•shp数据坐标系与场景坐标系不一致,导致位置不正确;

猜你喜欢

转载自blog.csdn.net/weixin_38476447/article/details/86686959