以GeoJSON格式结构化方式存储地理数据的MongoDB集群的地理数据读写方法

文档序号:6550224阅读:306来源:国知局
以GeoJSON格式结构化方式存储地理数据的MongoDB集群的地理数据读写方法
【专利摘要】本发明针对MongoDB集群设计了大规模地理数据存储方案,在MongoDB集群中以GeoJSON格式结构化的方式组织地理数据,使得采用分布式高速MongoDB集群高效存储大规模地理数据成为可能。针对该地理数据存储方案,本发明提出了地理数据的读写方法以及可实现该地理数据读写方法的驱动程序。本发明以OGR类库为地理数据读写驱动的设计架构,以GeoJSON格式结构化的读写MongoDB集群地理数据源。本发明采用OGR函数库,在地理数据与MongoDB集群之间通过内存中构建的OGR对象建立桥梁,使针对MongoDB集群的地理数据高效读写成为可能,使得高性能地理分析算法可以运行在MongoDB数据库集群之上。
【专利说明】以GeoJSON格式结构化方式存储地理数据的MongoDB集群的地理数据读写方法
【技术领域】
[0001]本发明涉及MongoDB集群中地理数据的存储方式,特别涉及以GeoJSON格式结构化方式存储地理数据的MongoDB集群的地理数据读写方法。
【背景技术】
[0002]随着地理信息技术的不断发展,如高分辨率空间传感器、移动定位技术以及雷达激光遥测等技术的大范围普及与应用,尤其是全球对地观测系统(GlobalEarth Observation System of Systems, GEOSS)、国家信息高速公路(NationalInformation Infrastructure, Nil)、国家地理数据基础设施(National Spatial DataInfrastructure, NSDI)等重大计划的实施,人类对地球不同层面、不同现象的综合观测能力达到了前所未有的水平。这些进步一方面使得海量地理信息得以在更广阔的领域不断获取和更新,带来了极其丰富翔实的地物信息,但同时也衍生了海量地理数据存储与管理问题。
[0003]地理数据库的存储需求已经从目前的GB级和TB级达到了 PB级,海量地理数据已无法沿用传统集中存储管理方式(蔡磊等,2009 ;朱庆等,2006)。如何对海量地理数据进行高效的存储、组织、管理与处理,使得海量空间信息能高效的为各行各业所用,成为一个迫切需要解决的问题。与此同时,另一方面,信息技术特别是信息通讯技术的迅速发展,使得互联网、WEB2.0、社交网络、物联网、移动互联网、云计算等相继进入人们的日常工作和生活中,尤其是近年来移动互联网、移动定位技术、地图服务以及基于位置的服务(LocationBased Services, LBS)等新兴业务的迅猛崛起,为互联网产业注入了新的维度——位置信肩、O
[0004]全球数据无论在信息量还是在多样性方面都呈现出指数式爆炸增长。根据国际数据公司IDC发布的研究报告,2011年全球创建和复制的数据总量为1.8ZB (约1.8万亿GB),预计全球数据量大约每两年翻一番,到2020年全球将达到35ZB的数据信息量(IDC,2011)。如今,人在每分每秒产生的数据(包括位置、状态,见闻、言论等等)都能够被数字化并进入互联网,各类传感器可以应用到各个领域收集我们所需的数据,甚至能植入人体。新的互联网址协议IPv6可以标识如家用电器、远程照相机、汽车、传感器等,甚至可以细微到大海里的一颗沙子。数据库巨人Jim Gray预测,到2047年现实世界人、事、物的所有信息都将上网(Gordon Bell, Jim Gray, 1999)。前所未有的巨量数据信息正在朝着数字地球-智慧地球的方向迅速聚集,人类步入大数据时代。
[0005]当前地理数据主要依赖关系型数据库进行存储与管理,但是关系型数据库在大数据时代背景下面临以下三个方面的突出问题:
[0006](I)性能问题关系型数据库建立在关系模型的基础上,多表的连接查询及关系型数据库严格的事务要求限制了数据读写的速度,特别是在高并发的条件下,事务的ACID属性-原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),成为影响读写性能的瓶颈。
[0007](2)易扩展性问题在云计算架构下,关系型数据库很难进行横向扩展。当一个应用系统的数据量和访问量与日俱增时,关系型数据库系统很难通过简单的添加更多硬件和服务节点来扩展性能,并同时实现系统负载均衡。
[0008](3)数据库模式的问题关系型数据库的关系模式有严格的定义,如果业务发生变化,需要增加或减少某个属性会给系统带来较大的改动。对于一些半结构化的数据而言,如果使用关系模式进行数据建模,表中会有很多元组的属性列是空值。这不仅造成存储空间的浪费,而且影响系统性能。
[0009]针对上述问题,近年来出现了一些新的数据管理系统,它们只提供简单的读写操作,具有很好的水平扩展能力,可以分布式的部署在多个服务器上。这些系统的出现,很好地解决了现阶段大数据管理中出现的问题,打破了关系型数据库在云计算环境下的性能瓶颈。由于它们不是用关系模型作为其主要的数据模型,并且不提供SQL接口,而被统称为“NoSQL”。NoSQL(Not Only SQL)也被称为非关系型数据库,是一系列与关系型数据库典型模型有较大差异的数据管理系统的统称,其中最显著的差异在于它不使用SQL作为基本的查询语言。NoSQL数据库没有特定的表结构,通常不支持连接操作,不支持完整的ACID属性,并且通常具有强大的水平扩展性。
[0010]其中,MongoDB是最受欢迎的开源NoSQL数据库之一,由IOgen公司在2009年2月推出第一版,因其高效的性能和丰富的使用功能在生产中有非常广泛的应用。MongoDB的设计定位是在具有key/value存储方式的高性能和高度扩展性的同时,具备传统的关系数据库管理系统的丰富功能,集两者的优势于一身。MongoDB使用数据结构松散的JSON格式面向文档存储数据,使 用自动分片(Auto-Sharding)实现海量数据存储,支持全类型索引,使用的查询语言语法类似面向对象查询语言,可以实现类似关系数据库单表查询的绝大部分功能(丰富的查询功能是其相较其他NoSQL数据库的突出优点),支持主/从(Master/Slave)和复制集(Replica Set)两种数据复制机制。
[0011]但是将NoSQL数据应用于地理数据存储的研究与技术很少见,地理数据缺少向NoSQL数据库输入和输出的读写技术,从而严重限制了地理数据在大数据背景下应用和实施。

【发明内容】

[0012]本发明要解决的技术问题是:克服现有技术缺点,提出一种以GeoJSON格式结构化方式存储地理数据的MongoDB集群的地理数据读写方法。
[0013]本发明以GeoJSON格式结构化方式存储地理数据的MongoDB集群,其特征在于:MongoDB集群中包含有若干与地理数据源(DataSource)对应的空间数据库(Database),每
个空间数据库包含有一个元数据集合(G_sys_Metadata)、若干个与地理图层(Layer)--
对应的地理要素集合(Collection),所述元数据集合中包含与地理图层——对应的空间元数据文档,所述空间元数据文档存储有与相应地理图层相关的空间元数据信息,每个地理要素集合中包含有若干与地理要素(Feature) —一对应的GeoJSON文档,所述地理要素以GeoJSON文档的形式进行存储。
[0014]进一步的,本发明MongoDB集群还具有如下改进:[0015]1、所述空间元数据文档以JSON文档的形式存储。
[0016]2、所述空间元数据信息至少包括图层空间参考、图层外边界、图层内地理要素个数、图层名称。
[0017]此外,本发明提供的以GeoJSON格式结构化方式存储地理数据的MongoDB集群中地理数据的读取方法,其特征在于步骤如下:
[0018]第I步、根据给定的连接参数建立与MongoDB集群的相应空间数据库(Database)元数据集合、对应地理要素集合(Collection)的数据连接;
[0019]第2步、从元数据集合(G_SyS_Metadata)中查找指定的空间元数据文档,获取相应的空间元数据信息;
[0020]第3步、在计算机内存中构建以下OGR地理对象:地理数据源对象、地理图层对象、地理要素对象、空间参考对象,所述OGR地理对象是OGR类库中对应类的实例,所述地理数据源对象包含有与对应地理要素集合数目相等的地理图层对象,每个地理图层对象包含有若干地理要素对象;从所述第2步中获取的空间元数据信息中抽取空间参考信息赋值给空间参考对象,完成对空间参考对象的实例化;
[0021]第4步、根据查询条件利用JSON解析函数库对相应空间数据库(Database)对应地理要素集合(Collection)中的GeoJSON文档进行结构解析,逐个提取GeoJSON文档中存储的地理要素信息,赋值给地理要素对象,完成地理要素对象的实例化;
[0022]第5步、将所有实例化的地理要素对象更新至相应的地理图层对象中,再将地理图层对象更新至地理数据源对象中,至此,完成将MongoDB集群中地理数据读取至内存。
[0023]本发明地理数据读取方法,进一步改进在于:
[0024]1、第5步完成之后,MongoDB集群中的地理数据以OGR地理对象的形式存在,用于进一步空间分析和数据处理;
[0025]2、所述OGR地理对象可用其他地理要素类库中相应类的实例进行替换。
[0026]另外,本发明还提供了以GeoJSON格式结构化方式存储地理数据的MongoDB集群的地理数据写入方法,其特征在于,步骤如下:
[0027]第I步、使用OGR类库读取地理数据矢量文件,在内存中实例化获得以下地理对象:地理数据源对象、地理图层对象、地理要素对象、空间参考对象,所述地理数据源对象包含有若干地理图层对象,地理图层对象包含若干地理要素对象,所述地理对象是OGR类库中对应类的实例;
[0028]第2步、在MongoDB集群中创建与地理数据源对象对应的空间数据库(Database),在所述空间数据库内创建元数据集合(G_SyS_Metadata)、与地理图层对象对应的地理要素集合(Collection),并将每个地理图层对象的空间元数据信息分别以单独JSON文档的形式存入元数据集合(G_sys_Metadata)中;
[0029]第3步、将地理要素对象逐一以单独GeoJSON文档的形式写入空间数据库的相应地理要素集合中,至此,完成将地理数据写入MongoDB集群。
[0030]为了实现上述读写方法,本发明在OGR类库框架下研发了以GeoJSON格式结构化方式存储地理数据的MongoDB集群的读写实现方法。其借助读写驱动完成,首先需构建读写驱动的类库。
[0031]构建OGRDriver类的子类MongoDriver类,负责与MongoDB数据源的连接信息管理以及MongoDatasource类的创建与管理;构建OGRDatasource子类MongoDatasource类,负责空间元数据的读取以及MongoLayer对象管理;构建MongoLayer类,继承自OGRLayer类,负责地理要素对象的读写与管理;构建MongoReader类处理GeoJSON文档的解析工作。
[0032]从MongoDB集群中读取地理数据时,在内存中构建MongoDriver对象,根据给定的连接参数建立与MongoDB集群中空间数据库的连接,同时实例化MongoDatasource对象,并在元数据集合中查找与待读取图层对应的空间元数据文档,并从该空间元数据文档中提取空间参考信息、图层外边界信息,实例化空间参考对象,以属性的形式存储在MongoDataSource 对象中;创建MongoLayer 对象和 MongoReader 对象,通过MongoReader 对象利用JSON解析函数库对待读取的地理要素集合中的GeoJSON文档进行结构解析,将每个GeoJSON文档解析形成OGRFeature对象(OGR地理要素对象),将OGRFeature对象加载至MongoLayer对象中,MongoLayer对象加载至MongoDatasource对象中,完成将MongoDB集群中的地理数据读取至内存;
[0033]向MongoDB集群存储地理数据时,首先实例化MongoDriver对象,由MongoDriver对象建立与MongoDB集群的连接,在MongoDB中创建空间数据库,以及空间数据库内的元数据集合、地理要素集合,并将每个图层的空间元数据信息以独立JSON文档的形式存储在元数据集合中;内存中所有的MongoLayer对象将各自图层中每个OGRFeature对象逐一以GeoJSON文档的形式写入对应的地理要素集合中,完成将内存中的地理数据写入MongoDB集群。
[0034]本发明针对MongoDB集群提出了一种大规模地理数据存储方案,在MongoDB分布式数据库集群中以GeoJSON格式结构化的方式组织地理数据。具体来说,将地理要素以GeoJSON文档的形式存储在MongoDB集群的地理要素集合中,把描述图层信息的元数据文档则存储在与地理要素集合同级的元数据集合中,从而在MongoDB集群中构建起与通用地理数据组织方式对应的层次关系,使得采用分布式高速MongoDB集群高效存储大规模地理数据成为可能。
[0035]针对该地理数据存储方案,本发明提出了地理数据的读写方法以及可实现该地理数据读写方法的驱动程序,以GDAL/0GR类库为地理数据读写驱动的设计架构,以GeoJSON格式结构化的读写MongoDB集群地理数据源。本发明采用OGR函数库,在地理数据与MongoDB集群之间通过内存中构建的OGR对象建立桥梁,使针对MongoDB集群的地理数据高效读写成为可能,突破了传统分布式数据库对大规模地理数据存储的约束,同时也扩展了GDAL/0GR对MongoDB分布式地理数据库的支持,提供了读写MongoDB分布式地理数据库的有效方法,使得高性能地理分析算法可以运行在MongoDB数据库集群之上。
【专利附图】

【附图说明】
[0036]下面结合附图对本发明作进一步的说明。
[0037]图1是MongoDB集群中地理数据结构化组织方式示意图。
[0038]图2是MongoDB地理数据库结构化读写驱动类库设计示意图。
【具体实施方式】
[0039]下面根据附图详细阐述本发明,使本发明的技术路线和操作步骤更加清晰。[0040]如图1所示,为本发明实施例MongoDB集群中地理数据结构化组织方式示意图。本例中,MongoDB集群中包含2个与地理数据源(DataSource)对应的空间数据库
(Database),每个空间数据库包含有一个元数据集合、若干个与地理图层(Layer)--对
应的地理要素集合(Collection),元数据集合中包含与地理图层一一对应的空间元数据文档,空间元数据文档存储有与相应地理图层相关的空间元数据信息(空间元数据信息至少包括图层空间参考、图层外边界、图层内地理要素个数、图层名称),每个地理要素集合中包含有若干与地理要素(Feature)——对应的GeoJSON文档,地理要素以GeoJSON文档的形式进行存储。
[0041]以图1中名称为Jiangsu DB的空间数据库为例,该空间数据库中包括有名称为G_sys_metadata的元数据集合,地理图层的元数据信息以JSON文档(空间元数据文档)的形式存储在元数据集合中,空间元数据文档中一般记载有图层名称、图层空间参考、图层外边界、图层内地理要素个数、图层创建时间等信息Jiangsu DB空间数据库中还包括名称为Mayor Roads、Sub-regions的地理要素集合(每个地理要素集合都对应一个图层),MayorRoads图层中包括名称为Jinghu Highway、Ninglian Highway等若干个记载地理要素信息的Geo JSON文档。
[0042]本实施例中,以结构化方式存储地理数据的MongoDB集群中地理数据的读取方法,步骤如下:
[0043]第I步、根据给定的连接参数建立与MongoDB集群的相应空间数据库(Database)元数据集合、对应地理要素集合(Collection)的数据连接;
[0044]第2步、从元数据集合(G_SyS_Metadata)中查找指定的空间元数据文档,获取相应的空间元数据信息;
[0045]第3步、在计算机内存中构建以下OGR地理对象:地理数据源对象、地理图层对象、地理要素对象、空间参考对象,所述OGR地理对象是OGR类库中对应类的实例,所述地理数据源对象包含有与对应地理要素集合数目相等的地理图层对象,每个地理图层对象包含有若干地理要素对象;从所述第2步中获取的空间元数据信息中抽取空间参考信息赋值给空间参考对象,完成对空间参考对象的实例化;
[0046]第4步、根据查询条件利用JSON解析函数库对相应空间数据库(Database)对应地理要素集合(Collection)中的GeoJSON文档进行结构解析,逐个提取GeoJSON文档中存储的地理要素信息,赋值给地理要素对象,完成地理要素对象的实例化;
[0047]第5步、将所有实例化的地理要素对象更新至相应的地理图层对象中,再将地理图层对象更新至地理数据源对象中,至此,完成将MongoDB集群中地理数据读取至内存。
[0048]本实施例中,以结构化方式存储地理数据的MongoDB集群的地理数据写入方法,步骤如下:
[0049]第I步、使用OGR类库读取地理数据矢量文件,在内存中实例化获得以下地理对象:地理数据源对象、地理图层对象、地理要素对象、空间参考对象,所述地理数据源对象包含有若干地理图层对象,地理图层对象包含若干地理要素对象,所述地理对象是OGR类库中对应类的实例;
[0050]第2步、在MongoDB集群中创建与地理数据源对象对应的空间数据库(Database),在所述空间数据库内创建元数据集合(G_SyS_Metadata)、与地理图层对象对应的地理要素集合(Collection),并将每个地理图层对象的空间元数据信息分别以单独JSON文档的形式存入元数据集合(G_sys_Metadata)中;
[0051]第3步、将地理要素对象逐一以单独GeoJSON文档的形式写入空间数据库的相应地理要素集合中,至此,完成将地理数据写入MongoDB集群。
[0052]为了实现对本发明MongoDB集群中地理数据的读写,本发明设计了读写驱动ogr2ogr,读写驱动ogr2ogr的类库设计图见图2。
[0053]该读写驱动包括:
[0054]MongoDriver类,为OGRDriver类的子类,负责与MongoDB数据源的连接信息管理以及MongoDatasource类的创建与管理;
[0055]MongoDatasource类,为OGRDatasource类的子类,负责空间元数据的读取以及MongoLayer对象管理;
[0056]MongoLayer类,继承自OGRLayer类,负责地理要素对象的读写与管理;
[0057]MongoReader类,负责处理GeoJSON文档的解析工作。
[0058]下面通过读写驱动ogrfogr的读写操作来对本发明做进一步的说明。
[0059]本实施例先将ESRI Shapefile文件数据通过ogr2ogr以结构化的方式导入MongoDB中,用以说明MongoDB地理数据库结构化读写驱动的写入能力;然后再以ogr2ogr程序将MongoDB中的地理数据导出到ESRI ShapefiIe格式文件中,用以说明MongoDB地理数据库结构化读写驱动的读取地理数据的能力。
[0060]本实施例测试数据采用QGIS开源项目提供的Alaska开放数据(下载地址:http://download, osge0.0rg/qgis/data/qgis_sample_data.zip)中的气象站点数据(Climate, shp)。该数据一共包含了 14个气象站点,记录了每个气象站点名称、I月平均气温、7月平均气温和年平均气温等信息,采用了阿尔伯斯等面积投影(AlberS_EqUal_Area),详细信息参加表I。测试过程在Microsoft Windows7x86_64位操作系统下进行,MongoDB服务器取默认端口(27017),测试数据climate, shp处于GPATH目录下。
[0061]表I美国阿拉斯加气象站点数据(ESRI Shapefile格式)
[0062]
【权利要求】
1.以GeoJSON格式结构化方式存储地理数据的MongoDB集群,其特征在于=MongoDB集群中包含有若干与地理数据源对应的空间数据库,每个空间数据库包含有一个元数据集合、若干个与地理图层一一对应的地理要素集合,所述元数据集合中包含与地理图层一一对应的空间元数据文档,所述空间元数据文档存储有与相应地理图层相关的空间元数据信息,每个地理要素集合中包含有若干与地理要素一一对应的GeoJSON文档,所述地理要素以GeoJSON文档的形式进行存储。
2.根据权利要求1所述的以GeoJSON格式结构化方式存储地理数据的MongoDB集群,其特征在于:所述空间元数据文档以JSON文档的形式存储。
3.根据权利要求1所述的以GeoJSON格式结构化方式存储地理数据的MongoDB集群,其特征在于:所述空间元数据信息至少包括图层空间参考、图层外边界、图层内地理要素个数、图层名称。
4.权利要求1所述以GeoJSON格式结构化方式存储地理数据的MongoDB集群中地理数据的读取方法,其特征在于步骤如下: 第I步、根据给定的连接参数建立与MongoDB集群的相应空间数据库元数据集合、对应地理要素集合的数据连接; 第2步、从元数据集合中查找指定的空间元数据文档,获取相应的空间元数据信息; 第3步、在计算机内存中构建以下OGR地理对象:地理数据源对象、地理图层对象、地理要素对象、空间参考对象,所述OGR地理对象是OGR类库中对应类的实例,所述地理数据源对象包含有与对应地理要素集合数目相等的地理图层对象,每个地理图层对象包含有若干地理要素对象;从所述第2步中获取的空间元数据信息中抽取空间参考信息赋值给空间参考对象,完成对空间参考对象的实例化; 第4步、根据查询条件利用JSON解析函数库对相应空间数据库对应地理要素集合中的GeoJSON文档进行结构解析,逐个提取GeoJSON文档中存储的地理要素信息,赋值给地理要素对象,完成地理要素对象的实例化; 第5步、将所有实例化的地理要素对象更新至相应的地理图层对象中,再将地理图层对象更新至地理数据源对象中,至此,完成将MongoDB集群中地理数据读取至内存。
5.根据权利要求4所述的地理数据的读取方法,其特征在于:第5步完成之后,MongoDB集群中的地理数据以OGR地理对象的形式存在,用于进一步空间分析和数据处理。
6.根据权利要求4或5所述的地理数据的读取方法,其特征在于:所述OGR地理对象用其他地理要素类库中相应类的实例进行替换。
7.权利要求1所述以结构化方式存储地理数据的MongoDB集群的地理数据写入方法,其特征在于,步骤如下: 第I步、使用OGR类库读取地理数据矢量文件,在内存中实例化获得以下地理对象:地理数据源对象、地理图层对象、地理要素对象、空间参考对象,所述地理数据源对象包含有若干地理图层对象,地理图层对象包含若干地理要素对象,所述地理对象是OGR类库中对应类的实例; 第2步、在MongoDB集群中创建与地理数据源对象对应的空间数据库,在所述空间数据库内创建元数据集合、与地理图层对象对应的地理要素集合,并将每个地理图层对象的空间元数据信息分别以单独JSON文档的形式存入元数据集合中;第3步、将地理要素对象逐一以单独GeoJSON文档的形式写入空间数据库的相应地理要素集合中,至此,完成将地理数据写入MongoDB集群。
8.权利要求7所述的地理数据写入方法,其特征在于:所述OGR地理对象用其他地理要素类库中相应类的实例进行替换。
9.以GeoJSON格式结构化方式存储地理数据的MongoDB集群的读写实现方法,其特征在于借助读写工具完成,该读写工具包含有: MongoDriver类,为OGRDriver类的子类,负责与MongoDB数据源的连接信息管理以及MongoDatasource类的创建与管理; MongoDatasource类,为OGRDatasource类的子类,负责空间元数据的读取以及MongoLayer对象管理; MongoLayer类,继承自OGRLayer类,负责地 理要素对象的读写与管理; MongoReader类,负责处理GeoJSON文档的解析工作; 从MongoDB集群中读取地理数据时,在内存中构建MongoDriver对象,根据给定的连接参数建立与MongoDB集群中空间数据库的连接,同时实例化MongoDatasource对象,并在元数据集合中查找与待读取图层对应的空间元数据文档,并从该空间元数据文档中提取空间参考信息、图层外边界信息,实例化空间参考对象,以属性的形式存储在MongoDataSource对象中;创建MongoLayer对象和MongoReader对象,通过MongoReader对象利用JSON解析函数库对待读取的地理要素集合中的GeoJSON文档进行结构解析,将每个GeoJSON文档解析形成OGRFeature对象,将OGRFeature对象加载至MongoLayer对象中,MongoLayer对象加载至MongoDatasource对象中,完成将MongoDB集群中的地理数据读取至内存; 向MongoDB集群存储地理数据时,首先实例化MongoDriver对象,由MongoDriver对象建立与MongoDB集群的连接,在MongoDB中创建空间数据库,以及空间数据库内的元数据集合、地理要素集合,并将每个图层的空间元数据信息以独立JSON文档的形式存储在元数据集合中;内存中所有的MongoLayer对象将各自图层中每个OGRFeature对象逐一以GeoJSON文档的形式写入对应的地理要素集合中,完成将内存中的地理数据写入MongoDB集群。
10.根据权利要求1所述的读写实现方法,其特征在于:所述MongoDriver对象为 MongoDriver 类的实例,所述 MongoDatasource 对象为 MongoDatasource 类的实例,MongoLayer对象为MongoLayer类的实例,所述MongoReader对象为MongoReader类的实例,所述OGRFeature实例为OGR类库中Feature类的实例。
【文档编号】G06F17/30GK104008209SQ201410277320
【公开日】2014年8月27日 申请日期:2014年6月20日 优先权日:2014年6月20日
【发明者】李满春, 张帅, 陈振杰, 张伯雷, 马磊 申请人:南京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1