news 2026/4/23 13:34:02

城市仿真软件: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/4/23 11:13:09

RAG常见向量数据库对比(截至2025年12月)

一、主要分类 1. 专用向量数据库 开源项目:Milvus、Qdrant、Weaviate、Chroma、Faiss(库)商业/托管服务:Pinecone、Zilliz 2. 传统数据库扩展 Redis(RedisSearch)PostgreSQL(pgvector&#xff0…

作者头像 李华
网站建设 2026/4/22 1:34:21

基于springboot反诈APP系统(源码+lw+部署文档+讲解等)

课题介绍本课题聚焦当前电信网络诈骗高发、反诈宣传覆盖不足、群众预警响应滞后等痛点,设计并实现基于Spring Boot框架的反诈APP系统。系统以Spring Boot为后端核心开发框架,整合MyBatis-Plus实现反诈数据高效持久化,搭配MySQL构建安全可靠的…

作者头像 李华
网站建设 2026/4/23 11:04:09

一文讲清楚DOM动态观察器MutationObserver的原理和使用场景

一文讲清楚DOM动态观察器MutationObserver的原理和使用场景 1. 引出 前端的童鞋都应该了然一件事,不管是借助框架像vue/react/angular,还是原生开发,就是我们开发来开发去,操作来操作去,其实本质都是在对页面上的HTML内容进行CURD 那既然我们是在对HTML进行CURD,那我们是…

作者头像 李华
网站建设 2026/4/23 12:15:24

云原生密钥管理:Sealed Secrets与Vault

在云原生环境中,密钥管理是保障系统安全的关键环节。密钥就像是一把打开系统资源的“钥匙”,如果管理不当,就会面临密钥泄露、管理失败等严重问题,从而威胁整个云原生系统的安全。而 Sealed Secrets 和 Vault 就是解决这些问题的有…

作者头像 李华
网站建设 2026/4/18 5:27:24

基于深度学习的电动车头盔佩戴检测系统

博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的设计程序开发,开发过上千套设计程序,没有什么华丽的语言,只有实…

作者头像 李华
网站建设 2026/4/23 13:30:22

AI应用架构师如何优化增量学习应用实践

AI应用架构师如何优化增量学习应用实践 一、引入与连接:当AI模型遇上“实时数据洪流” 凌晨3点,某电商AI应用架构师李明盯着监控大屏上的“推荐准确率”曲线——这条原本平稳的曲线,正随着凌晨促销活动的开启快速下滑。原因很简单&#xff1a…

作者头像 李华