news 2026/6/9 22:13:38

城市仿真软件:CityEngine_(14).CityEngine与其他GIS软件的集成

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
城市仿真软件:CityEngine_(14).CityEngine与其他GIS软件的集成

CityEngine与其他GIS软件的集成

在城市仿真软件的开发中,CityEngine常常需要与其他GIS(地理信息系统)软件进行集成,以充分利用各种地理数据和功能。本节将详细介绍CityEngine与其他GIS软件集成的方法和原理,包括数据导入、脚本调用、以及与其他GIS软件的API交互等。

数据导入

CityEngine支持多种地理数据格式的导入,这些数据可以从其他GIS软件中导出,然后再导入到CityEngine中进行进一步的处理和仿真。常见的地理数据格式包括Shapefile、GeoJSON、KML、CityGML等。

导入Shapefile数据

Shapefile是一种常用的地理数据格式,由ESRI公司开发。CityEngine支持直接导入Shapefile文件,下面是一个具体的例子:

  1. 准备Shapefile数据:假设你有一个包含城市地块的Shapefile数据,文件名为parcels.shp,并附带parcels.dbfparcels.shx文件。

  2. 导入数据

    • 打开CityEngine。

    • 选择File>Import>GIS Data

    • 在弹出的对话框中,选择Shapefile,然后浏览并选择parcels.shp文件。

    • 点击Import按钮,数据将被导入到CityEngine中。

  3. 数据处理

    • 导入后的数据将以图层的形式出现在Layers面板中。

    • 你可以通过选择图层,然后右键点击选择Properties来查看和编辑图层属性。

    • 使用CityEngine的规则编辑器(Rule Editor)来定义地块的生成规则。例如,你可以定义一个规则文件parcels.cga,内容如下:

    // parcels.cga version "2022.1" @StartRule Lot --> extrude(Height) color(0.5, 0.5, 0.5)
    • 在CityEngine中,选择导入的地块图层,然后应用上述规则文件parcels.cga

导入GeoJSON数据

GeoJSON是一种基于JSON的地理数据格式,广泛用于Web GIS应用。CityEngine支持通过插件导入GeoJSON数据。下面是一个具体的例子:

  1. 准备GeoJSON数据:假设你有一个包含城市道路的GeoJSON文件,文件名为roads.geojson

  2. 安装GeoJSON插件

    • 打开CityEngine。

    • 选择Window>Preferences>CityEngine>Plug-ins

    • 点击Install New Plug-ins,搜索并安装GeoJSON Importer插件。

  3. 导入数据

    • 选择File>Import>GIS Data

    • 在弹出的对话框中,选择GeoJSON,然后浏览并选择roads.geojson文件。

    • 点击Import按钮,数据将被导入到CityEngine中。

  4. 数据处理

    • 导入后的数据将以图层的形式出现在Layers面板中。

    • 你可以通过选择图层,然后右键点击选择Properties来查看和编辑图层属性。

    • 使用CityEngine的规则编辑器(Rule Editor)来定义道路的生成规则。例如,你可以定义一个规则文件roads.cga,内容如下:

    // roads.cga version "2022.1" @StartRule Road --> offset(2) color(0.2, 0.2, 0.2)
    • 在CityEngine中,选择导入的道路图层,然后应用上述规则文件roads.cga

脚本调用

CityEngine支持通过脚本调用外部GIS软件的功能,这可以通过Python脚本实现。Python脚本可以调用ArcGIS、QGIS等GIS软件的API,从而实现数据处理和功能扩展。

调用ArcGIS API

假设你需要调用ArcGIS的API来处理一些地理数据,然后将结果导入到CityEngine中。下面是一个具体的例子:

  1. 安装ArcGIS API for Python

    • 确保你的Python环境中已经安装了arcgis库。如果没有,可以使用pip安装:
    pipinstallarcgis
  2. 编写Python脚本

    • 创建一个Python脚本文件arcgis_process.py,内容如下:
    # arcgis_process.pyfromarcgis.gisimportGISfromarcgis.featuresimportFeatureLayer# 连接到ArcGIS Onlinegis=GIS("https://www.arcgis.com","your_username","your_password")# 获取Feature Layerfeature_layer=FeatureLayer("https://services.arcgis.com/your_service_url/arcgis/rest/services/your_layer_name/FeatureServer/0")# 查询数据query_result=feature_layer.query(where="1=1",out_fields="*")# 将查询结果导出为GeoJSON文件withopen("output.geojson","w")asf:f.write(query_result.to_geojson)
  3. 在CityEngine中调用Python脚本

    • 在CityEngine中,选择Tools>Python>Run Script

    • 浏览并选择arcgis_process.py文件。

    • 运行脚本后,生成的GeoJSON文件将被保存在指定路径。

    • 按照前文所述的方法,将生成的GeoJSON文件导入到CityEngine中。

调用QGIS API

QGIS是一个开源的GIS软件,支持通过Python脚本调用其API。下面是一个具体的例子:

  1. 安装QGIS API

    • 确保你的Python环境中已经安装了qgis库。如果没有,可以使用pip安装:
    pipinstallqgis
  2. 编写Python脚本

    • 创建一个Python脚本文件qgis_process.py,内容如下:
    # qgis_process.pyfromqgis.coreimportQgsApplication,QgsVectorLayer,QgsMapLayerRegistry# 初始化QGIS应用QgsApplication.setPrefixPath("/usr",True)qgs=QgsApplication([],False)qgs.initQgis()# 加载Shapefile数据layer=QgsVectorLayer("/path/to/parcels.shp","parcels","ogr")# 检查数据是否加载成功ifnotlayer.isValid():print("Layer failed to load!")else:# 将图层添加到注册表QgsMapLayerRegistry.instance().addMapLayer(layer)# 处理数据(例如,添加字段)layer.startEditing()layer.addAttribute(QgsField("Area",QVariant.Double))layer.commitChanges()# 保存处理后的数据layer.saveEdits()# 退出QGIS应用qgs.exitQgis()
  3. 在CityEngine中调用Python脚本

    • 在CityEngine中,选择Tools>Python>Run Script

    • 浏览并选择qgis_process.py文件。

    • 运行脚本后,处理后的Shapefile文件将被保存在指定路径。

    • 按照前文所述的方法,将处理后的Shapefile文件导入到CityEngine中。

API交互

CityEngine提供了强大的API,可以与其他GIS软件进行交互,实现数据的双向流动。下面我们将介绍如何通过API实现CityEngine与ArcGIS和QGIS的交互。

与ArcGIS的API交互

ArcGIS提供了一个丰富的API,可以通过Python脚本与CityEngine进行交互。下面是一个具体的例子,展示如何从CityEngine中获取地块数据,并在ArcGIS中进行处理。

  1. 获取CityEngine中的地块数据

    • 在CityEngine中,使用Python脚本获取地块数据。创建一个脚本文件get_parcels.py,内容如下:
    # get_parcels.pyfromcesiumimportCesiumLayer,CesiumObject# 获取地块图层layer=CesiumLayer.findLayer("parcels")# 获取图层中的所有对象parcels=layer.getObjects()# 将地块数据导出为GeoJSON格式geojson_data=[]forparcelinparcels:parcel_data={"type":"Feature","geometry":parcel.getGeometry(),"properties":{"id":parcel.getId(),"area":parcel.getArea()}}geojson_data.append(parcel_data)geojson={"type":"FeatureCollection","features":geojson_data}# 保存GeoJSON文件withopen("parcels.geojson","w")asf:f.write(geojson)
  2. 在ArcGIS中处理数据

    • 在ArcGIS中,编写一个Python脚本来读取并处理CityEngine导出的GeoJSON数据。创建一个脚本文件process_parcels.py,内容如下:
    # process_parcels.pyimportjsonfromarcgis.gisimportGISfromarcgis.featuresimportGeoAccessor,GeoSeriesAccessor# 读取GeoJSON文件withopen("parcels.geojson","r")asf:geojson=json.load(f)# 连接到ArcGIS Onlinegis=GIS("https://www.arcgis.com","your_username","your_password")# 创建GeoDataFrameimportgeopandasasgpd gdf=gpd.GeoDataFrame.from_features(geojson["features"],crs="EPSG:4326")# 处理数据(例如,计算面积)gdf['area']=gdf['geometry'].area# 将处理后的数据导出为Shapefilegdf.to_file("processed_parcels.shp")

与QGIS的API交互

QGIS的API也非常强大,可以通过Python脚本与CityEngine进行交互。下面是一个具体的例子,展示如何从CityEngine中获取地块数据,并在QGIS中进行处理。

  1. 获取CityEngine中的地块数据

    • 在CityEngine中,使用Python脚本获取地块数据。创建一个脚本文件get_parcels.py,内容如下:
    # get_parcels.pyfromcesiumimportCesiumLayer,CesiumObject# 获取地块图层layer=CesiumLayer.findLayer("parcels")# 获取图层中的所有对象parcels=layer.getObjects()# 将地块数据导出为GeoJSON格式geojson_data=[]forparcelinparcels:parcel_data={"type":"Feature","geometry":parcel.getGeometry(),"properties":{"id":parcel.getId(),"area":parcel.getArea()}}geojson_data.append(parcel_data)geojson={"type":"FeatureCollection","features":geojson_data}# 保存GeoJSON文件withopen("parcels.geojson","w")asf:f.write(geojson)
  2. 在QGIS中处理数据

    • 在QGIS中,编写一个Python脚本来读取并处理CityEngine导出的GeoJSON数据。创建一个脚本文件process_parcels.py,内容如下:
    # process_parcels.pyimportjsonfromqgis.coreimportQgsVectorLayer,QgsFeature,QgsGeometry,QgsField,QgsVectorFileWriter,QgsCoordinateReferenceSystem# 读取GeoJSON文件withopen("parcels.geojson","r")asf:geojson=json.load(f)# 创建QgsVectorLayerlayer=QgsVectorLayer("Polygon?crs=EPSG:4326","parcels","memory")layer.dataProvider().addAttributes([QgsField("id",QVariant.Int),QgsField("area",QVariant.Double)])layer.updateFields()# 将GeoJSON数据添加到QgsVectorLayerforfeatureingeojson["features"]:geom=QgsGeometry.fromWkt(json.dumps(feature["geometry"]))feat=QgsFeature()feat.setGeometry(geom)feat.setAttributes([feature["properties"]["id"],feature["properties"]["area"]])layer.dataProvider().addFeature(feat)layer.updateExtents()# 保存处理后的数据为ShapefileQgsVectorFileWriter.writeAsVectorFormat(layer,"processed_parcels.shp","UTF-8",QgsCoordinateReferenceSystem(4326),"ESRI Shapefile")

数据同步

在城市仿真软件的开发中,数据同步是一个重要的环节。CityEngine可以通过脚本或其他方式实现与其他GIS软件的数据同步,确保数据的一致性和实时性。

与ArcGIS的数据同步

假设你需要将CityEngine中的地块数据同步到ArcGIS Online中,下面是一个具体的例子:

  1. 创建Python脚本

    • 创建一个Python脚本文件sync_with_arcgis.py,内容如下:
    # sync_with_arcgis.pyfromcesiumimportCesiumLayer,CesiumObjectfromarcgis.gisimportGISfromarcgis.featuresimportFeatureLayer# 获取CityEngine中的地块数据layer=CesiumLayer.findLayer("parcels")parcels=layer.getObjects()# 连接到ArcGIS Onlinegis=GIS("https://www.arcgis.com","your_username","your_password")# 获取Feature Layerfeature_layer=FeatureLayer("https://services.arcgis.com/your_service_url/arcgis/rest/services/your_layer_name/FeatureServer/0")# 将地块数据转换为ArcGIS Feature Setfeatures=[]forparcelinparcels:feature={"geometry":parcel.getGeometry(),"attributes":{"id":parcel.getId(),"area":parcel.getArea()}}features.append(feature)feature_set={"features":features}# 同步数据到ArcGIS Onlinefeature_layer.edit_features(adds=feature_set)
  2. 在CityEngine中运行脚本

    • 在CityEngine中,选择Tools>Python>Run Script

    • 浏览并选择sync_with_arcgis.py文件。

    • 运行脚本后,CityEngine中的地块数据将被同步到ArcGIS Online中。

与QGIS的数据同步

假设你需要将CityEngine中的地块数据同步到QGIS中,下面是一个具体的例子:

  1. 创建Python脚本

    • 创建一个Python脚本文件sync_with_qgis.py,内容如下:
    # sync_with_qgis.pyfromcesiumimportCesiumLayer,CesiumObjectfromqgis.coreimportQgsVectorLayer,QgsFeature,QgsGeometry,QgsField,QgsVectorFileWriter,QgsCoordinateReferenceSystem# 获取CityEngine中的地块数据layer=CesiumLayer.findLayer("parcels")parcels=layer.getObjects()# 创建QgsVectorLayerqgis_layer=QgsVectorLayer("Polygon?crs=EPSG:4326","parcels","memory")qgis_layer.dataProvider().addAttributes([QgsField("id",QVariant.Int),QgsField("area",QVariant.Double)])qgis_layer.updateFields()# 将地块数据添加到QgsVectorLayerforparcelinparcels:geom=QgsGeometry.fromWkt(json.dumps(parcel.getGeometry()))feat=QgsFeature()feat.setGeometry(geom)feat.setAttributes([parcel.getId(),parcel.getArea()])qgis_layer.dataProvider().addFeature(feat)qgis_layer.updateExtents()# 保存处理后的数据为ShapefileQgsVectorFileWriter.writeAsVectorFormat(qgis_layer,"processed_parcels.shp","UTF-8",QgsCoordinateReferenceSystem(4326),"ESRI Shapefile")
  2. 在QGIS中加载数据

    • 在QGIS中,选择Layer>Add Layer>Add Vector Layer

    • 浏览并选择processed_parcels.shp文件,点击Add按钮,数据将被加载到QGIS中。

实时数据更新

在一些应用场景中,城市仿真软件需要实时更新地理数据,以反映城市的变化。CityEngine可以通过API和脚本实现与其他GIS软件的实时数据更新。实时数据更新对于动态城市规划、交通管理、灾害响应等场景非常关键。

与ArcGIS的实时数据更新

假设你需要实现CityEngine与ArcGIS Online的实时数据更新,下面是一个具体的例子:

  1. 创建Python脚本

    • 创建一个Python脚本文件realtime_update.py,内容如下:
    # realtime_update.pyfromcesiumimportCesiumLayer,CesiumObjectfromarcgis.gisimportGISfromarcgis.featuresimportFeatureLayer# 连接到ArcGIS Onlinegis=GIS("https://www.arcgis.com","your_username","your_password")# 获取Feature Layerfeature_layer=FeatureLayer("https://services.arcgis.com/your_service_url/arcgis/rest/services/your_layer_name/FeatureServer/0")# 定义一个函数来获取CityEngine中的地块数据并同步到ArcGISdefupdate_parcels():# 获取CityEngine中的地块数据layer=CesiumLayer.findLayer("parcels")parcels=layer.getObjects()# 将地块数据转换为ArcGIS Feature Setfeatures=[]forparcelinparcels:feature={"geometry":parcel.getGeometry(),"attributes":{"id":parcel.getId(),"area":parcel.getArea()}}features.append(feature)feature_set={"features":features}# 同步数据到ArcGIS Onlinefeature_layer.edit_features(adds=feature_set)# 设定定时任务importtimewhileTrue:update_parcels()time.sleep(60)# 每60秒更新一次
  2. 在CityEngine中运行脚本

    • 在CityEngine中,选择Tools>Python>Run Script

    • 浏览并选择realtime_update.py文件。

    • 运行脚本后,CityEngine中的地块数据将每隔60秒自动同步到ArcGIS Online中。

与QGIS的实时数据更新

假设你需要实现CityEngine与QGIS的实时数据更新,下面是一个具体的例子:

  1. 创建Python脚本

    • 创建一个Python脚本文件realtime_update_qgis.py,内容如下:
    # realtime_update_qgis.pyfromcesiumimportCesiumLayer,CesiumObjectfromqgis.coreimportQgsVectorLayer,QgsFeature,QgsGeometry,QgsField,QgsVectorFileWriter,QgsCoordinateReferenceSystem# 获取CityEngine中的地块数据defget_parcels():layer=CesiumLayer.findLayer("parcels")parcels=layer.getObjects()# 将地块数据转换为QGIS Feature Setgeojson_data=[]forparcelinparcels:parcel_data={"type":"Feature","geometry":parcel.getGeometry(),"properties":{"id":parcel.getId(),"area":parcel.getArea()}}geojson_data.append(parcel_data)geojson={"type":"FeatureCollection","features":geojson_data}# 保存GeoJSON文件withopen("parcels.geojson","w")asf:f.write(json.dumps(geojson))# 在QGIS中加载数据defload_parcels():importjsonfromqgis.coreimportQgsVectorLayer,QgsFeature,QgsGeometry,QgsField,QgsVectorFileWriter,QgsCoordinateReferenceSystem# 读取GeoJSON文件withopen("parcels.geojson","r")asf:geojson=json.load(f)# 创建QgsVectorLayerqgis_layer=QgsVectorLayer("Polygon?crs=EPSG:4326","parcels","memory")qgis_layer.dataProvider().addAttributes([QgsField("id",QVariant.Int),QgsField("area",QVariant.Double)])qgis_layer.updateFields()# 将GeoJSON数据添加到QgsVectorLayerforfeatureingeojson["features"]:geom=QgsGeometry.fromWkt(json.dumps(feature["geometry"]))feat=QgsFeature()feat.setGeometry(geom)feat.setAttributes([feature["properties"]["id"],feature["properties"]["area"]])qgis_layer.dataProvider().addFeature(feat)qgis_layer.updateExtents()# 保存处理后的数据为ShapefileQgsVectorFileWriter.writeAsVectorFormat(qgis_layer,"processed_parcels.shp","UTF-8",QgsCoordinateReferenceSystem(4326),"ESRI Shapefile")# 设定定时任务importtimewhileTrue:get_parcels()load_parcels()time.sleep(60)# 每60秒更新一次
  2. 在CityEngine中运行脚本

    • 在CityEngine中,选择Tools>Python>Run Script

    • 浏览并选择realtime_update_qgis.py文件。

    • 运行脚本后,CityEngine中的地块数据将每隔60秒自动导出为GeoJSON文件,并在QGIS中加载和处理。

总结

通过上述方法,CityEngine可以与其他GIS软件(如ArcGIS和QGIS)进行集成,实现数据导入、脚本调用、API交互和实时数据更新。这些集成方法不仅增强了CityEngine的功能,还为城市仿真和规划提供了更多的灵活性和扩展性。无论是静态数据处理还是动态数据更新,CityEngine都能有效地与其他GIS软件协同工作,为用户提供全面的地理信息解决方案。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 15:09:23

经典算法题型之扫雷游戏(二)

解决方案方法一:深度优先搜索 模拟思路与算法由于题目要求你根据规则来展示执行一次点击操作后游戏面板的变化,所以我们只要明确该扫雷游戏的规则,并用代码模拟出来即可。那我们着眼于题目的规则,会发现总共分两种情况&#xff1…

作者头像 李华
网站建设 2026/6/10 15:23:14

电动汽车动力系统匹配与整车经济性计算模型

1、电动汽车动力系统匹配计算模型:输入整车参数及性能要求,一键生成驱动系统的扭矩功率峰值转速等参数。 2、整车动力经济性计算模型:包含NEDC/WLTC/CLTC工况,输入整车参数可生成工况电耗、百公里电耗、匀速工况续航、百公里电耗等…

作者头像 李华
网站建设 2026/6/5 6:45:30

探秘文件包含漏洞:从本地挖掘到远程威胁,PHP伪协议成“帮凶”

引入 文件包含是编程中常用的一种技术,它允许一个程序包含并执行另一个文件的内容,本意是为了提高代码的复用性和可维护性。然而,当这种包含机制没有得到正确的安全控制时,就可能引发文件包含漏洞。攻击者可以利用这个漏洞&#…

作者头像 李华
网站建设 2026/6/10 16:02:43

基于springboot房屋租赁管理系统(源码+lw+部署文档+讲解等)

课题介绍本课题聚焦房屋租赁行业传统管理模式中信息不对称、租赁流程繁琐、合同管理不规范、租金监管缺失等痛点,设计并实现基于Spring Boot框架的房屋租赁管理系统。系统以Spring Boot为后端核心开发框架,整合MyBatis-Plus实现租赁数据高效持久化&#…

作者头像 李华
网站建设 2026/6/10 18:03:37

国密算法开发实战:基于GMSSL快速集成SM2、SM3、SM4加密体系!

随着国家密码标准在各行业的深入推广,SM2、SM3、SM4算法已成为构建安全系统的基石。借助GMSSL这一轻量级、高兼容性的开源密码库,开发者能够以较低成本实现三大国密算法的工程化落地。聚焦于SM2非对称加密、SM3哈希摘要与SM4对称加密在实际项目中的协同应…

作者头像 李华
网站建设 2026/5/30 9:12:02

STM32F103 学习笔记-21-串口通信(第1节)-串口通信协议简介

引言 上节章我们讲解了通信的基本概念,包括并行通信、串行通信、同步和异步通信等。本章,我们正式进入串口通信的学习。串口通信是嵌入式开发中最常用的通信方式之一,理解其原理对后续实践至关重要。本节重点讲解串口通信协议的理论部分&…

作者头像 李华