地理处理
基础地理处理工具
Functions:
| 
 | 自动识别地理格式并转换为shapely格式 | 
| 测绘院(上海2000)crs信息 | |
| 将度分秒格式的经纬度转为小数 | |
| 
 | 计算两个点(经度,纬度)之间的距离,单位:米 | 
| 
 | 转换geometry格式 | 
| 
 | 确保经纬度是tuple类型,如果是geometry会自动提取经纬度 | 
| 
 | 将Point/LineString/Polygon转为multi分别转为MultiPoint/MultiLineString/MultiPolygon | 
| 
 | 提取Multi类型的geometry中的第一个元素 | 
| 确保输出的面数据是有效的,会从GeometryCollection中筛选面重新组成geometry | |
| 
 | 根据经纬度计算 UTM 区域 EPSG 代码 | 
| 从GeometryCollection中筛选面重新组成geometry | |
| shapely转为geojson文本格式 | |
| 
 | geojson文本形式转为shapely几何对象 | 
| 
 | 根据城市查询epsg代码,用于投影 | 
| 
 | 返回面内的一个点,默认返回中心点,当中心点不在面内则返回面内一个点 | 
| 
 | 推断geometry格式 | 
| 
 | 判断是否为geojson格式 | 
| 
 | 判断是否为线数据 | 
| 
 | 判断是否为点数据 | 
| 
 | 判断是否为面数据 | 
| 
 | 判断是否为shapely格式 | 
| 
 | 判断经纬度是否有效 | 
| 
 | 判断是否为wkb格式 | 
| 
 | 判断是否为wkt格式 | 
| 
 | 获取城市所在的经度 | 
| 
 | 根据提供的点划线 | 
| 
 | multiline转为multipolygon,直接首尾相连 | 
| 
 | 返回多部件要素中的元素(LineString、Point、Polygon)组成的列表 | 
| 
 | 判断是否为空 | 
| 
 | 判断是否非空 | 
| 
 | 将一段坐标文本信息整理成经纬度列表 | 
| 
 | 文本转为shapely | 
| 
 | 将Shapely几何对象转换为文本形式的WKB | 
| 
 | 将文本形式的WKB转换为Shapely几何对象 | 
| 
 | 将Shapely几何对象转换为文本形式的WKT | 
| 
 | 将文本形式的WKT转换为Shapely几何对象 | 
- ricco.geometry.util.auto_loads(x) BaseGeometry
- 自动识别地理格式并转换为shapely格式 
- ricco.geometry.util.crs_sh2000()
- 测绘院(上海2000)crs信息 
- ricco.geometry.util.deg_to_decimal(x: (<class 'str'>, <class 'list'>, <class 'tuple'>))
- 将度分秒格式的经纬度转为小数 - 参数:
- x – 字符串或列表, - 字符串格式为 123°5’6.77”(分和秒分别为单双引号) - 列表长度为3,分别是度分秒,数值型 
 
- ricco.geometry.util.distance(p1: (<class 'tuple'>, <class 'str'>), p2: (<class 'tuple'>, <class 'str'>), city: str = None, epsg_from: int = 4326, epsg_to: (<class 'str'>, <class 'int'>) = None)
- 计算两个点(经度,纬度)之间的距离,单位:米 - 参数:
- p1 – 点位1,经纬度或geometry 
- p2 – 点位2,经纬度或geometry 
- city – 所在城市,用于投影 
- epsg_from – epsg代码 
- epsg_to – 投影epsg代码 
 
 
- ricco.geometry.util.dumps2x(x: BaseGeometry, geom_format)
- 转换geometry格式 
- ricco.geometry.util.ensure_lnglat(lnglat) tuple
- 确保经纬度是tuple类型,如果是geometry会自动提取经纬度 
- ricco.geometry.util.ensure_multi_geom(geom: BaseGeometry) BaseMultipartGeometry
- 将Point/LineString/Polygon转为multi分别转为MultiPoint/MultiLineString/MultiPolygon 
- ricco.geometry.util.ensure_single_geom(geom: BaseGeometry) BaseGeometry
- 提取Multi类型的geometry中的第一个元素 
- ricco.geometry.util.ensure_valid_polygon(x)
- 确保输出的面数据是有效的,会从GeometryCollection中筛选面重新组成geometry 
- ricco.geometry.util.epsg_from_lnglat(lng, lat=0)
- 根据经纬度计算 UTM 区域 EPSG 代码 
- ricco.geometry.util.filter_polygon_from_collection(x)
- 从GeometryCollection中筛选面重新组成geometry 
- ricco.geometry.util.geojson_dumps(x: BaseGeometry)
- shapely转为geojson文本格式 
- ricco.geometry.util.geojson_loads(x: (<class 'str'>, <class 'dict'>), warning=True)
- geojson文本形式转为shapely几何对象 
- ricco.geometry.util.get_epsg(city: str)
- 根据城市查询epsg代码,用于投影 
- ricco.geometry.util.get_inner_point(polygon: BaseGeometry, within=True)
- 返回面内的一个点,默认返回中心点,当中心点不在面内则返回面内一个点 
- ricco.geometry.util.infer_geom_format(series: (<class 'str'>, <class 'list'>, <class 'tuple'>, <class 'pandas.core.series.Series'>, <class 'shapely.geometry.base.BaseGeometry'>))
- 推断geometry格式 
- ricco.geometry.util.is_geojson(x, na=False) bool
- 判断是否为geojson格式 
- ricco.geometry.util.is_line(x: BaseGeometry)
- 判断是否为线数据 
- ricco.geometry.util.is_point(x: BaseGeometry)
- 判断是否为点数据 
- ricco.geometry.util.is_polygon(x: BaseGeometry)
- 判断是否为面数据 
- ricco.geometry.util.is_shapely(x, na=False) bool
- 判断是否为shapely格式 
- ricco.geometry.util.is_valid_lnglat(lng, lat)
- 判断经纬度是否有效 
- ricco.geometry.util.is_wkb(x, na=False) bool
- 判断是否为wkb格式 
- ricco.geometry.util.is_wkt(x, na=False) bool
- 判断是否为wkt格式 
- ricco.geometry.util.lng_from_city(city: str)
- 获取城市所在的经度 
- ricco.geometry.util.make_line(p1: Point, p2: Point, geom_format='shapely')
- 根据提供的点划线 
- ricco.geometry.util.multiline2multipolygon(multiline_shapely: MultiLineString, force=False)
- multiline转为multipolygon,直接首尾相连 
- ricco.geometry.util.split_multi_geoms(geometry: BaseMultipartGeometry) list
- 返回多部件要素中的元素(LineString、Point、Polygon)组成的列表 - 参数:
- geometry – geometry类型的数据 
 
- ricco.geometry.util.st_is_empty(x)
- 判断是否为空 
- ricco.geometry.util.st_not_empty(x)
- 判断是否非空 
- ricco.geometry.util.text2lnglats(text: str, point_sep: str, lnglat_sep: str)
- 将一段坐标文本信息整理成经纬度列表 - 参数:
- text – 要转换为文本 
- point_sep – 点位之间的分隔符 
- lnglat_sep – 经纬度之间的分隔符 
 
 
- ricco.geometry.util.text2shapely(text: str, geometry_type: str, point_sep: str = ';', lnglat_sep: str = ',', ensure_multi: bool = True)
- 文本转为shapely - 参数:
- text – 坐标组成的文本 
- geometry_type – 要输出的地理类型,可选值为 ‘polygon’、’line’ 
- point_sep – 点位键的分隔符,默认为分号 ‘;’ 
- lnglat_sep – 经纬度的分隔符,默认为逗号 ‘,’ 
- ensure_multi – 是否转为multi-geometry,默认为True 
 
 - 示例 - >>> ss = '121.4737,31.2304; 121.4740,31.2304; 121.4740,31.2307' >>> text2shapely(ss, geometry_type='line', point_sep=';', lnglat_sep=',') MULTILINESTRING ((121.4737 31.2304, 121.474 31.2304, 121.474 31.2307)) 
- ricco.geometry.util.wkb_dumps(x: BaseGeometry)
- 将Shapely几何对象转换为文本形式的WKB 
- ricco.geometry.util.wkb_loads(x: str, hex=True)
- 将文本形式的WKB转换为Shapely几何对象 
- ricco.geometry.util.wkt_dumps(x: BaseGeometry)
- 将Shapely几何对象转换为文本形式的WKT 
- ricco.geometry.util.wkt_loads(x: str)
- 将文本形式的WKT转换为Shapely几何对象 
基于GeoDataframe处理
Functions:
| 
 | 自动识别地理格式并转换为shapely格式 | 
| 
 | 将geometry转为指定格式 | 
| 
 | 获得一定半径的缓冲区 | 
| 
 | 计算一个数据集中的每个元素到另一个数据集之间的最短距离。 如需计算实际距离,投影后再使用此方法 | 
| 
 | 计算数据集df中元素到单个geometry的最短距离。 该方法可自动将df转为GeoDataframe,自动将geometry转为shapely格式 | 
| 
 | 转换并仅保留geometry列 | 
| 
 | 自动提取点或转换为点的经纬度 | 
| 
 | 将geojson格式的geometry列转换为shapely格式 | 
| 
 | 将geometry列中为空的记录置为None | 
| 
 | 计算面积(单位:平方米) | 
| 
 | 获取数据集中每个点的邻居面(相邻标准:至少有一个点相同且不重叠) | 
| 
 | 获取数据投影后或坐标系转后的中心点x、y坐标 | 
| 
 | 将经纬度坐标转换为shapely格式的geometry | 
| 
 | 经纬度转wkb格式的geometry | 
| 
 | 经纬度转wkb格式的geometry | 
| 
 | 使用面数据通过空间关联(sjoin)给数据打标签 | 
| 
 | KDTree近邻分析,计算一个数据集中的元素到另一个数据集中全部元素的最短距离(单位:米), 同时可进行其他运算 | 
| 
 | 近邻分析,计算一个数据集中的元素到另一个数据集中全部元素的最短距离(单位:米) | 
| 
 | 确保Dataframe中有lng/lat/geometry列 | 
| 
 | 投影变换 | 
| 
 | 直接对经纬度进行投影变换 | 
| 
 | 获取中心点shapely格式 | 
| 
 | 将shapely格式的geometry列转换为geojson格式 | 
| 
 | shapely格式提取面内点转为经纬度。 | 
| 
 | 将shapely格式的geometry列转换为wkb格式 | 
| 
 | 将shapely格式的geometry列转换为wkt格式 | 
| 
 | 将shapely转为指定的格式 | 
| 
 | 对面数据覆盖范围内的点数据进行空间统计 | 
| 
 | 根据所给边界划分固定边长的栅格 | 
| 
 | 将多部件要素拆解为多行的单部件要素 | 
| 
 | geometry转经纬度,求中心点经纬度 | 
| 
 | 将wkb格式的geometry列转换为shapely格式 | 
| 
 | wkb转wkt | 
| 
 | geometry转经纬度,求中心点经纬度 | 
| 
 | 将wkt格式的geometry列转换为shapely格式 | 
| 
 | wkb转wkt | 
- ricco.geometry.df.auto2shapely(df, geometry='geometry') GeoDataFrame
- 自动识别地理格式并转换为shapely格式 
- ricco.geometry.df.auto2x(df, geometry_format: str, geometry='geometry')
- 将geometry转为指定格式 - 参数:
- df – 要转换的Dataframe 
- geometry_format – 要转换为的geometry类型,支持shapely,wkb,wkt,geojson 
- geometry – geometry列的列名,默认为“geometry” 
 
 
- ricco.geometry.df.buffer(df: DataFrame, radius: int | float, city: str | None = None, geo_type: str = 'point', geometry: str = 'geometry', buffer_geometry: str = 'buffer_geometry', geo_format='wkb') DataFrame
- 获得一定半径的缓冲区 - 参数:
- df – pd.DataFrame, 包含地理信息的DataFrame 
- radius – numeric, 缓冲区半径(单位米) 
- city – str, 可选, 投影城市,可提高数据精度 
- geo_type – str, 地理数据类型,可选point, line或polygon(包括multipolygon),默认point 
- geometry – str, geometry字段名,默认”geometry” 
- buffer_geometry – 输出的缓冲区geometry字段名,默认”buffer_geometry” 
- geo_format – str, 输出的缓冲区geometry格式,支持wkb,wkt,shapely,geojson,默认wkb 
 
- 返回:
- 包含缓冲区geometry的DataFrame 
 
- ricco.geometry.df.distance_gdf(df: GeoDataFrame, df_target: GeoDataFrame, c_dst: str = '最小距离', c_tags: list | None = None) GeoDataFrame
- 计算一个数据集中的每个元素到另一个数据集之间的最短距离。 如需计算实际距离,投影后再使用此方法 - 参数:
- df – 数据集 
- df_target – 目标数据集 
- c_dst – 保存距离的列名,默认为“最小距离” 
- c_tags – 保存目标数据集的标签列,默认为None 
 
 
- ricco.geometry.df.distance_min(df, geometry) float
- 计算数据集df中元素到单个geometry的最短距离。 该方法可自动将df转为GeoDataframe,自动将geometry转为shapely格式 - 参数:
- df – 数据集,GeoDataFrame格式 
- geometry – 单个geometry,shapely格式 
 
 
- ricco.geometry.df.ensure_geometry(df, ensure_point=False, warning=False, geometry='geometry', lng='lng', lat='lat')
- 转换并仅保留geometry列 
- ricco.geometry.df.ensure_lnglat(df, lng='lng', lat='lat', geometry='geometry')
- 自动提取点或转换为点的经纬度 
- ricco.geometry.df.geojson2shapely(df, geometry='geometry', epsg_code: int = 4326) GeoDataFrame
- 将geojson格式的geometry列转换为shapely格式 
- ricco.geometry.df.geom_empty2null(df, c_geometry='geometry')
- 将geometry列中为空的记录置为None 
- ricco.geometry.df.get_area(df: DataFrame, c_dst='area', epsg: int | None = None, decimals=2) DataFrame
- 计算面积(单位:平方米) - 参数:
- df – 要计算的面数据 
- c_dst – 输出面积的列名,默认为“area” 
- epsg – 对于跨时区或不在同一个城市的可以指定epsg code,默认会根据经度中位数获取 
- decimals – 要保留的小数位数 
 
 
- ricco.geometry.df.get_neighbors(df: (<class 'pandas.core.frame.DataFrame'>, <class 'geopandas.geodataframe.GeoDataFrame'>), key_col: str, res_type='dict') -> (<class 'dict'>, <class 'pandas.core.frame.DataFrame'>)
- 获取数据集中每个点的邻居面(相邻标准:至少有一个点相同且不重叠) - 参数:
- df – 
- key_col – 关键列,必须唯一 
- res_type – 返回类型,可返回dict或Dataframe 
 
 
- ricco.geometry.df.get_projection_xy(df: DataFrame, epsg: int | None = None, city: str | None = None, crs=None, c_x: str = 'x', c_y: str = 'y')
- 获取数据投影后或坐标系转后的中心点x、y坐标 - 参数:
- df – 数据集 
- epsg – 投影坐标epsg编号 
- city – 要投影的城市名 
- crs – 投影坐标系 
- c_x – 投影后经度的列名 
- c_y – 投影后纬度的列名 
 
 
- ricco.geometry.df.lnglat2shapely(df, lng='lng', lat='lat', geometry='geometry', delete=True, epsg_code: int = 4326) GeoDataFrame
- 将经纬度坐标转换为shapely格式的geometry 
- ricco.geometry.df.lnglat2wkb(df, lng='lng', lat='lat', geometry='geometry', delete=False, epsg_code=4326)
- 经纬度转wkb格式的geometry 
- ricco.geometry.df.lnglat2wkt(df, lng='lng', lat='lat', geometry='geometry', delete=False, epsg_code=4326)
- 经纬度转wkb格式的geometry 
- ricco.geometry.df.mark_tags_v2(df: ~pandas.core.frame.DataFrame, polygon_df: ~pandas.core.frame.DataFrame, c_tags: (<class 'list'>, <class 'str'>) = None, col_list=None, *, predicate='intersects', drop_geometry=False, geometry_format='wkb', warning=True, c_lng='lng', c_lat='lat', c_geometry='geometry', c_polygon_geometry='geometry', ensure_point=True)
- 使用面数据通过空间关联(sjoin)给数据打标签 - 参数:
- df – 要打标签的数据,一般为点数据,如为面数据,则会自动提取面内点计算 
- polygon_df – 标签列所在的数据集,一般为面数据 
- c_tags – 面数据中要关联到结果中的标签字段名,若为空则全部关联 
- col_list – (已弃用),同c_tags 
- predicate – 关联方法,默认 ‘intersects’ 
- drop_geometry – 结果是否删除point_df中的geometry,默认不删除 
- geometry_format – 输出的geometry格式,支持wkb,wkt,shapely,geojson,默认wkb 
- warning – 是否输出警告信息 
- c_lng – 指定点数据的经度列名 
- c_lat – 指定点数据的经度列名 
- c_geometry – 指定点数据的geometry列名 
- c_polygon_geometry – 指定面数据的geometry列名 
- ensure_point – point_df是否强制转换为点数据 
 
 
- ricco.geometry.df.nearest_kdtree(df: ~pandas.core.frame.DataFrame, df_poi: ~pandas.core.frame.DataFrame, /, *, c_count: str = 'count', c_min_distance: str = 'min_distance', agg: dict = None, limit: int = None, r: (<class 'int'>, <class 'float'>) = None, keep_origin: bool = False, leaf_size: int = 2, epsg: int = None, city=None, crs=None)
- KDTree近邻分析,计算一个数据集中的元素到另一个数据集中全部元素的最短距离(单位:米), 同时可进行其他运算 - 参数:
- df – 基础数据集,统计该数据及周边的其他数据集的信息 
- df_poi – 被统计的数据集 
- c_count – 计数列字段名,默认“count” 
- c_min_distance – 最短距离字段名,默认“min_distance” 
- agg – 计算 df_poi 中的其他字段,格式如: {‘面积’: [‘sum’, ‘mean’]},即计算面积的和、均值 
- limit – 限制符合条件的 df_poi 中的个数,由近及远 
- r – 限制查询半径 
- keep_origin – 是否保留匹配后原始的索引信息 
- leaf_size – KDTree 叶子节点大小 
- epsg – 投影代码,用于投影,epsg/city/crs指定多个时以epsg为准 
- city – 城市,用于获取城市中心点,epsg/city/crs指定多个时以epsg为准 
- crs – 数据集的 crs,epsg/city/crs指定多个时以epsg为准 
 
 
- ricco.geometry.df.nearest_neighbor(df: DataFrame, df_target: DataFrame, c_dst: str = 'min_distance', epsg: int | None = None, r=None) DataFrame
- 近邻分析,计算一个数据集中的元素到另一个数据集中全部元素的最短距离(单位:米) - 参数:
- df – 
- df_target – 
- c_dst – 输出最短距离的列名,默认为“min_distance” 
- epsg – 对于跨时区或不在同一个城市的可以指定epsg code,默认会根据经度中位数获取 
- r – 限制查询半径 
 
 
- ricco.geometry.df.norm_geometry(df, c_lng='lat', c_lat='lng', c_geometry='geometry', geometry_format='wkb')
- 确保Dataframe中有lng/lat/geometry列 
- ricco.geometry.df.projection(df: GeoDataFrame, epsg: int | None = None, city: str | None = None, crs=None, c_geometry='geometry') GeoDataFrame
- 投影变换 - 参数:
- df – 输入的GeomDataFrame格式的数据 
- epsg – epsg code, 第一优先级 
- city – 城市名称,未传入epsg的情况下将通过城市名称获取epsg,若二者都为空则根据经纬度获取 
- crs – 投影坐标系,第二优先级 
- c_geometry – geometry的列名 
 
 
- ricco.geometry.df.projection_lnglat(df: DataFrame, epsg=None, city=None, crs=None) DataFrame
- 直接对经纬度进行投影变换 - 参数:
- df – 输入的GeomDataFrame格式的数据 
- epsg – epsg code, 第一优先级 
- city – 城市名称,未传入epsg的情况下将通过城市名称获取epsg,若二者都为空则根据经纬度获取 
- crs – 投影坐标系,第二优先级 
 
 
- ricco.geometry.df.shapely2central_shapely(df, geometry='geometry', within=False)
- 获取中心点shapely格式 
- ricco.geometry.df.shapely2geojson(df, geometry='geometry')
- 将shapely格式的geometry列转换为geojson格式 
- ricco.geometry.df.shapely2lnglat(df, geometry='geometry', lng='lng', lat='lat', within=False, delete=False)
- shapely格式提取面内点转为经纬度。 - 参数:
- df – 要转换的DataFrame 
- geometry – 输入的geometry列名 
- lng – 输出的经度列名 
- lat – 输出的纬度列名 
- within – 范围的点是否再面内 - False(default): 直接返回中心点; - True: 返回面内的一个点 
- delete – 是否删除geometry 
 
 
- ricco.geometry.df.shapely2wkb(df, geometry='geometry')
- 将shapely格式的geometry列转换为wkb格式 
- ricco.geometry.df.shapely2wkt(df: GeoDataFrame, geometry='geometry')
- 将shapely格式的geometry列转换为wkt格式 
- ricco.geometry.df.shapely2x(df: (<class 'geopandas.geodataframe.GeoDataFrame'>, <class 'pandas.core.frame.DataFrame'>), geometry_format: str, geometry='geometry')
- 将shapely转为指定的格式 - 参数:
- df – 要转换的GeoDataFrame 
- geometry_format – 支持wkb,wkt,shapely,geojson 
- geometry – geometry列的列名,默认“geometry” 
 
 
- ricco.geometry.df.spatial_agg(df: DataFrame, polygon_df: DataFrame, by: str | List[str], agg: dict, c_polygon_geometry: str = 'geometry') DataFrame
- 对面数据覆盖范围内的点数据进行空间统计 - 参数:
- df – 点数据dataframe; 
- polygon_df – 面数据dataframe; 
- by – 空间统计单位字段; 
- agg – 空间统计操作。格式为{‘被统计字段名’: ‘操作名’, …}的字典。如{‘poi’:’sum’}; 
- c_polygon_geometry – 面数据geometry字段名,默认”geometry”; 
 
- 返回:
- pd.DataFrame, 包含空间统计单位字段和被统计字段和面数据geometry的DataFrame 
 
- ricco.geometry.df.split_grids(df: GeoDataFrame, step: int, geometry_format='wkb')
- 根据所给边界划分固定边长的栅格 - 参数:
- df – 边界文件,GeoDataFrame格式 
- step – 栅格边长,单位:米 
- geometry_format – 栅格格式,支持wkb,wkt,shapely,geojson 
 
 
- ricco.geometry.df.split_multi_to_rows(df, geometry='geometry', geometry_format=None)
- 将多部件要素拆解为多行的单部件要素 
- ricco.geometry.df.wkb2lnglat(df, geometry='geometry', delete=False, within=False)
- geometry转经纬度,求中心点经纬度 
- ricco.geometry.df.wkb2shapely(df, geometry='geometry', epsg_code: int = 4326) GeoDataFrame
- 将wkb格式的geometry列转换为shapely格式 
- ricco.geometry.df.wkb2wkt(df, geometry='geometry', epsg_code: int = 4326)
- wkb转wkt 
- ricco.geometry.df.wkt2lnglat(df, geometry='geometry', delete=False, within=False)
- geometry转经纬度,求中心点经纬度 
- ricco.geometry.df.wkt2shapely(df, geometry='geometry', epsg_code: int = 4326) GeoDataFrame
- 将wkt格式的geometry列转换为shapely格式 
- ricco.geometry.df.wkt2wkb(df, geometry='geometry', epsg_code: int = 4326)
- wkb转wkt 
拓扑处理
Functions:
| 
 | 修复面地理数据的拓扑问题,index不能重复 | 
| 
 | 判断整列geometry是否规范, 仅支持面数据, | 
- ricco.geometry.topology.fix_topology(df: GeoDataFrame, c_geometry='geometry', fill_intersects=False, keep_contains=False) GeoDataFrame
- 修复面地理数据的拓扑问题,index不能重复 - 参数:
- df – 需要进行拓扑修复的GeoDataFrame 
- c_geometry – geometry列列名 
- fill_intersects – 是否填满相交的区域,如果为True的话,两个面相交的区域会随机分配到其中一个面内 
- keep_contains – fill_intersects为True时才有效,即是否强制保留被包含的面 
 
- 返回:
- 修复完拓扑问题的GeoDataFrame 
 
- ricco.geometry.topology.is_topology_valid(df: GeoDataFrame, c_geometry='geometry')
- 判断整列geometry是否规范, 仅支持面数据,
- 检查geometry是否有空值, 
- 检查每个geometry是否存在拓扑问题, 
- 检查整列geometry之间是否存在拓扑问题 
 
 - 参数:
- df – 需要进行拓扑修复的GeoDataFrame 
- c_geometry – geometry列名 
 
- 返回:
- geometry数据是否规范