ellipsoid


Nameellipsoid JSON
Version 2024.8.22 PyPI version JSON
download
home_pageNone
Summary参考椭球体基础软件包,主要包括:Geometry-几何要素类;Topology-几何要素拓扑类;MapGrid-国际标准比例尺图幅分幅网格类;Projection-几何要素坐标投影变换类;ProjectionHelper-几何要素坐标投影助手类;Astronomy-天文寻星计算类
upload_time2024-08-24 09:29:25
maintainerNone
docs_urlNone
authorGeoWheel Studio
requires_python>=3.9
licenseMIT
keywords geometry geojson gml kml topology projection mapgrid astronomy
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            <table>
  <tr style="border-style: none;">
    <td style="border-style: none;">
      <svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="100" height="100" version="1.1" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"
viewBox="0 0 2315 2315"
 xmlns:xlink="http://www.w3.org/1999/xlink">
 <g id="geowheel">
  <metadata id="geowheel-Layer"/>
  <path style="fill:#CB7D31" d="M209.13 1279.25l26.75 -39.64c11.21,-17.81 16.25,-22.97 43.89,-64.99 8.35,-12.7 29.37,-44.06 38.09,-56.82l43.3 -61.51 55.38 -75.6 42.12 -55.05 36.95 -47.15 -492.14 2.55c0,164.31 81.21,309.7 205.66,398.21z"/>
  <path style="fill:#0078D7" d="M1130.68 1857.49l-30.56 20.45 -43.04 25.92 -40.52 24.37 -54.64 29.74 -51.29 27.87 -43.49 20.07 -39.02 18.95 -34.56 15.61 -39.03 16.73 -31.36 10.03 -32.86 6.97 -29.17 4.86 -30.79 3.24 -38.8 2.92 -34.12 -1.29 -36.47 -5.68 -26.73 -8.1 -21.88 -9.72 -24.31 -13.78 -21.06 -17.82 -14.59 -14.59 -14.58 -21.06 -11.35 -20.26 -11.39 -27.02 -8.62 -31.27 -4.58 -28.69 -1.67 -34.84 0.57 -30.27 1.57 -26.78 3.2 -24.59 3.1 -22.6 6.48 -29.98 8.91 -29.98 18.45 -50.82 12.87 -31.63 12.15 -26.03 11.35 -25.36 10.81 -26.59 18.64 -45.37 18.63 -43.75 19.77 -41.87 20.34 -43.45 27.58 -51.4 32.25 -58.56 40.08 -68.84 33.77 -52.92 40.41 -64.02 34.55 -53.24 29.6 -44.83 36.6 -52.49 34.75 -45.65 31.6 -39.95 29.69 -34.55 33.57 -37.06 38.69 -40.84 33.69 -36.83 34.03 -33.22 32.41 -30.79 31.41 -29.59 39.28 -33.89 32.5 -28.69 35.37 -30.18 34.13 -28.27 38.23 -29.41 34.59 -28.2 47.8 -34.85 47.81 -31.6 39.7 -25.11 32.7 -20.59 33.46 -19.44 34.93 -18.44 35.84 -20.5 36.94 -19.36 38.04 -17.01 36.41 -15.88 32.03 -13.01 41.71 -16.44 36.07 -11.11 35.65 -8.91 38.09 -7.29 38.89 -5.67 36.74 -1.62 33.75 -0.81 30.79 1.62 27.55 4.86 28.6 7.86 24.87 9.96 19.45 10.54 21.07 15.39 17.01 17.83 14.38 22.03 9.93 20.1 7.29 21.07 7.29 29.17 2.43 17.01 0.81 28.36 -0.81 27.55 -1.83 27.08 -5.26 35.9 -7.96 32.81 -8.36 28.31 -10.25 28.84 -10.66 28.82 -9.98 24.4 -9.19 21.46 -9.69 22.79 -6.19 13.76 33.03 -51.89 -14.79 33.74 18.75 -22.68 19.26 -25.32 16.29 -23.12 14.95 -27.73 13.68 -28.48 11.29 -32.83 10.15 -31.17 8.53 -30.28 8.07 -34.33 4.78 -33.47 3.2 -35.89 0.69 -33.51 -2.07 -29.82 -5.67 -31.6 -7.48 -24.03 -10.34 -23.77 -12.97 -22.69 -17.06 -19.53 -21.02 -17.49 -22.69 -15.4 -20.89 -9.92 -26.78 -9.73 -26.4 -6.48 -25.59 -4.18 -30.79 -3.37 -31.89 -2.46 -31.1 -0.81 -30.94 0.53 -34.7 1.58 -28.7 3.15 -26.17 2.72 -29.21 4.11 -33.07 6.38 -29.7 6.89 -32.84 8.02 -29.98 7.66 -27.12 7.82 -34.03 9.72 -28.27 9.73 -27.64 10.53 -30.65 11.87 -29.3 11.63 -32.94 14.01 -31.07 14.35 -30.85 14.78 -25.87 12.76 -29.17 14.59 -29.98 15.39 -31.6 16.21 -28.36 17.01 -30.79 17.02 -28.36 17.01 -32.6 19.12 -27.36 18.16 -34.03 21.87 -38.08 26.74 -30.74 21.88 -26.79 19.44 -28.85 21.44 -29.36 25.56 -25.77 21.83 -19.58 17.19 -22.02 20.13 -25.32 21.79 -20.87 19.53 -29.17 25.93 -31.6 28.36 -29.98 27.54 -30.98 29.28 -26.23 24.81 -32.6 32.11 -30.7 34.25 -24.52 28.18 -27.07 29.5 -28.12 31.73 -26.75 29.76 -24.32 27.21 -30.91 39.45 -27.27 34.27 -25.92 33.75 -27.21 35.99 -25.51 35.35 -22.83 33.62 -23.01 33.89 -24.96 38.57 -20.13 30.42 -28.79 44.3 -25.77 41.59 -26.33 46.95 -26.54 47.38 -26.21 51.39 -22.9 48.39 -19.86 50.29 -19.95 47.71 -17.22 43.81 -17.17 47.76 -10.58 41.23 -9.67 38.98 -9.22 40.46 -6.99 35.71 -6.48 34.03 -4.86 31.6 -4.86 35.65c0,0 -3.24,25.12 -3.24,29.17 0,4.05 -1.62,38.89 -1.62,38.89l0 17.82 1.62 29.98 4.05 34.03 5.62 24.03 9.41 26.94 11.71 26.82 14.58 29.98 15.7 23.13 16.58 19.52 18.48 16.85 22.16 15.85 23.34 12.89 25.28 8.99 26.74 8.1 25.11 6.48 26.74 4.86 31.6 3.24 30.3 1.01 24.9 -0.04 24.48 -2.87 27.8 -3.58 28.96 -5.36 35.94 -6.71 32.88 -8.63 34.3 -10.89 34.45 -12.39 36.32 -13.73 35.6 -14.53 34.89 -14.64 36.61 -15.16 35.56 -18.59 37.06 -21.44 37.56 -22.63 38.71 -25.63 31.54 -21.84 38.71 -27.89 41.61 -29.13 41.43 -27.15 44.94 -30.89 44.27 -34.15 25.6 -23.68 22.45 -23.19 23.91 -29.23 21.78 -30.2 23.91 -36.19 -45.15 32.33 -37.44 25.34z"/>
  <polygon style="fill:#CB7D31" points="567.35,1345.25 623.59,1345.95 671.15,1344.93 743.21,1344.93 785.56,1344.93 816.5,1345.86 836.7,1347.32 857.99,1350.44 877.25,1356.19 895.97,1363.42 916.24,1373.46 934.9,1385.12 950.49,1395.48 968.4,1408.6 984.11,1422 998.56,1435.52 1009.18,1447.45 1019.97,1460.48 1027.57,1473.89 1034.88,1487.96 1040.38,1500.2 1045.22,1514.04 1048.63,1528.72 1051.5,1543.23 1053.62,1557.77 1054.93,1573.22 1055.69,1591.55 1056.73,1620.55 1056.73,1671.07 1056.73,1765.42 1057.47,1890.24 1055.98,1942.98 1143.65,1941.5 1216.45,1942.98 1285.55,1941.5 1616.15,1942.24 1616.15,1347.16 1974.23,1344.97 1981.63,1344.36 1988.64,1343.55 1997.71,1341.84 2005.58,1339.42 2012.64,1337.26 2027.64,1331.37 2038.92,1325.99 2050.24,1320.28 2063.72,1313.4 2078.44,1305.52 2090.68,1298.11 2105.05,1289.14 2118.03,1278.75 2131.38,1267.39 2144.81,1256.11 2159.1,1241.64 2173.59,1223.72 2187.46,1205.26 2210.4,1171.73 2229.81,1137.65 2246.49,1103.7 2260.95,1068.52 2272.23,1038.36 2281.81,1006.9 2295.93,957.12 2304.84,916.51 2311.53,880.6 1842.74,879.11 1373.21,879.86 857.62,879.86 830.81,916.6 805.89,952.63 782.58,986.39 757.62,1024.3 735.11,1059.6 714.24,1091.17 691.87,1125.56 667.52,1165.4 643.58,1206.42 616.7,1252.68 592.53,1297.76 "/>
 </g>
</svg>
    </td>
    <td style="border-style: none;color: #47709e; font-weight: bold; font-size: 36px;">
      geowheel.ellipsoid / Python
    </td>
  </tr>
</table>

***

参考椭球体基础软件包。主要包括:  
* **Geometry-几何要素类**  
    支持地学实体几何要素加载、编码、转换、变换与序列化,几何要素主体采用{Python-dict}类型存储并符合{GeoJson-geometry}格式要求。  
    支持的几何格式如下:    
    > + **GeoJSON** - A format for encoding a variety of geographic data structures. RFC 7946 was published in August 2016 and is the new standard specification of the GeoJSON format.
    > + **WKT** - ISO 19162:2015(E) - Well-known Text (WKT) offers a compact machine- and human-readable representation of geometric objects.
    > + **WKB** - The well-known binary (WKB) representation for OGC geometry provides a portable representation of a geometry value as a contiguous stream of bytes.
    > + **GML** - ISO 19136:2007 - The Geography Markup Language (GML) is an XML grammar for expressing geographical features.
    > + **KML** - An XML language focused on geographic visualization, including annotation of maps and images. Geographic visualization includes not only the presentation of graphical data on the globe, but also the control of the user’s navigation in the sense of where to go and where to look.
    > + **Shapely** - A Python package for set-theoretic analysis and manipulation of planar features using functions from the well known and widely deployed GEOS library.
    > + **GDAL/OGR** - A vector geospatial geometric data formats based on Geospatial Data Abstraction Library (GDAL/OGR).
    
    支持的几何类型如下:  
    > + **Point** - A geometry type that represents a single coordinate with x,y and possibly z,m values.
    > + **LineString** - A geometry type composed of one or more line segments.
    > + **Polygon** - A geometry type representing an area that is enclosed by a linear ring.
    > + **MultiPoint** - A collection of one or more Points.
    > + **MultiLineString** - A collection of one or more LineStrings.
    > + **MultiPolygon** - A collection of one or more Polygons.
    > + **GeometryCollection** - A collection of one or more geometries that may contain more than one type of geometry.
* **Topology-几何要素拓扑类**  
    > 支持拓扑创建、拓扑检查、面积与长度计算和诸多空间运算功能。  
* **MapGrid-国际标准比例尺图幅分幅网格与编号类**  
    > + 支持比例尺:1∶1000000、1∶500000、1∶250000、1∶200000(非国际标准)、1∶100000、1∶50000、1∶25000、1∶10000、1∶5000、1∶2000、1∶1000、1∶500。      
    > + 算法依据《中华人民共和国国家标准 GB/T 13989-2012 国家基本比例尺地形图分幅和编号》(2012-06-29发布 2012-10-01实施)  
* **Projection-几何要素坐标投影变换类**  
    > 支持高斯-克吕格、球体墨卡托、阿尔勃斯、兰伯特投影正反算。  
* **ProjectionHelper-几何要素坐标投影助手类**  
    > 支持高斯-克吕格、球体墨卡托、阿尔勃斯、兰伯特等投影正反算。  
    用法示例:  
  > ```python
  >   >>> import geowheel.ellipsoid as ellipsoid
  >   >>> print(
  >       ellipsoid.ProjectionHelper(
  >           targetProjection=ellipsoid.ProjectionHelper.definition(projection="GaussKruger", centralMeridian=99)
  >       ).project(
  >           {'type': 'Point', 'coordinates': [100, 36]}
  >       )
  >   )
  >   # {'type': 'Point', 'coordinates': [590165.115456953, 3986005.1900442634]}
  >   >>> print(
  >       ellipsoid.ProjectionHelper(
  >           targetProjection=ellipsoid.ProjectionHelper.definition(projection="GaussKruger", centralMeridian=99)
  >       ).project(
  >           {"type":"MultiPoint","coordinates":[[98.52, 19.61], [100.22, 20.74], [100.97, 21.46]]}
  >       )
  >   )
  >   # {'type': 'MultiPoint', 'coordinates': [[449646.39107651, 2169263.3152799467], [627069.4918831721, 2294770.010626876], [704217.241296021, 2375292.866543003]]}
  >   >>> print(
  >       ellipsoid.ProjectionHelper(
  >           targetProjection=ellipsoid.ProjectionHelper.definition(projection="GaussKruger", centralMeridian=99)
  >       ).project(
  >           {"type":"LineString","coordinates": [[98.919, 44.4074], [98.923, 44.4075]]}
  >       )
  >   )
  >  # {'type': 'LineString', 'coordinates': [[493547.9177849664, 4919094.308987056], [493866.54958314006, 4919105.113591565]]}
  >   >>> print(
  >       ellipsoid.ProjectionHelper(
  >           targetProjection=ellipsoid.ProjectionHelper.definition(projection="GaussKruger", centralMeridian=99)
  >       ).project(
  >           {"type": "GeometryCollection","geometries":[{"type": "Point", "coordinates": [98.81, 37.24]},{"type":"LineString","coordinates": [[98.919, 44.4074], [98.923, 44.4075]]},{"type":"Polygon","coordinates":[[[99.38, 57.322], [100.43, 19.15], [100.194, 20.28], [99.38, 57.322]]]}]}
  >       )
  >   )
  >   # {'type': 'GeometryCollection', 'geometries': [{'type': 'Point', 'coordinates': [483141.07726688863, 4123163.065100722]}, {'type': 'LineString', 'coordinates': [[493547.9177849664, 4919094.308987056], [493866.54958314006, 4919105.113591565]]}, {'type': 'Polygon', 'coordinates': [[[522893.54108479613, 6355836.594960719], [650444.4843643629, 2118888.025401517], [624733.1105818641, 2243814.468236219], [522893.54108479613, 6355836.594960719]]]}]}
  > ```   
* **Astronomy-天文寻星计算类**  
    > 支持太阳、月球和静止轨道地球同步卫星基于地球参照系的相位参数计算。  

## Installation  
> Install geowheel.ellipsoid project with pip
> 
> ### Windows
> ```bash
>   python -m pip install --upgrade ellipsoid 
> ```
> ### Linux
> ```bash
>   python3 -m pip install --upgrade ellipsoid
> ```
> ### MacOS
> ```bash
>   python3 -m pip install --upgrade ellipsoid
> ```

## Usage/Examples

```python
>>> import geowheel.ellipsoid as ellipsoid
>>> print(
    ellipsoid.Topology.check(
        [
            {
                "type": "Polygon",
                "coordinates": [[[0, 0], [10, 0], [10, 10], [10, 0], [0, 0]]]
            }
        ],
        0b1111
    )
)
# {'polygon': [{'flag': 'SelfIntersection', 'type': 'Point', 'coordinates': [10.0, 0.0]}]}
```

## API Reference

### Get help on module geowheel.ellipsoid

```python
>>> help(ellipsoid)
```

* ### Class Geometry(builtins.object) 

*****

***Geometry.dumps***
> ```python
> @classmethod
> def dumps(
>        cls,
>        geometry: dict | list | str,
>        format: str = 'json'
> ) -> str  
> ```
> 将【GeoJson-geometry】几何字典对象序列化转储为指定格式的字符串  
>
> | Parameter | Type          | Description|
> |:----------|:--------------|:-----------|
> | geometry  | dict list str | 几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组|
> | format    | str           | 指定的几何格式,支持:"json/geojson"(默认)、"wkt/wkb"、"gml"、"kml"|
> 
> 返回符合指定格式要求的字符串。失败时抛出异常  

***Geometry.fromGml***
> ```python
> @classmethod
> def fromGml(
>         cls,
>         geometry: str | etree._Element
> ) -> dict
> ```
> 将GML-V3.2几何字符串转换为【GeoJson-geometry】几何字典类型 
>
> | Parameter | Type               | Description    |
> |:----------|:-------------------|:---------------|
> | geometry  | str etree._Element | GML-V3.2几何字符串  |
> 
> 返回【GeoJson-geometry】格式的字典类型对象。失败时抛出异常

***Geometry.fromKml***
> ```python
> @classmethod
> def fromKml(
>         cls,
>         geometry: str | etree._Element
> ) -> dict
> ```
> 将KML几何元素(支持:Point、LineString、Polygon、MultiGeometry、Track)字符串或者XML几何对象转换为【GeoJson-geometry】格式的字典类型对象
>
> | Parameter | Type               | Description    |
> |:----------|:-------------------|:---------------|
> | geometry  | str etree._Element | KML几何元素字符串或者XML几何对象  |
> 
> 返回【GeoJson-geometry】格式的字典类型对象。失败时抛出异常

***Geometry.fromOgr***
> ```python
> @classmethod
> def fromOgr(
>         cls,
>         geometry: ogr.Geometry
> ) -> dict
> ```
> 将【ogr.Geometry】几何对象转换为【GeoJson-geometry】格式的字典类型对象
>
> | Parameter | Type          | Description    |
> |:----------|:--------------|:---------------|
> | geometry  | ogr.Geometry  | 【ogr.Geometry】几何对象  |
> 
> 返回【GeoJson-geometry】格式的字典类型对象。失败时抛出异常

***Geometry.fromShapely***
> ```python
> @classmethod
> def fromShapely(
>         cls,
>         geometry: shapely.geometry
> ) -> dict
> ```
> 将shapely几何对象转换为【GeoJson-geometry】格式的字典类型对象
>
> | Parameter | Type               | Description              |
> |:----------|:-------------------|:-------------------------|
> | geometry  | shapely.geometry   | shapely格式几何(geometry)对象  |
> 
> 返回符合【GeoJson-geometry】格式的字典类型对象,字典中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组。失败时抛出异常

***Geometry.getXY***
> ```python
> @classmethod
> def getXY(
>         cls,
>         geometry: dict | list | str,
>         endpoint: bool = True  
> ) -> list
> ```
> 提取指定几何体的顶点(或端点)坐标并返回可哈希的坐标元组列表
>
> | Parameter | Type          | Description                                                                                                  |
> |:----------|:--------------|:-------------------------------------------------------------------------------------------------------------|
> | geometry  | dict list str | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> | endpoint | bool          | 是否仅提取端点?省略时取默认值:True。注:此选项仅针对线要素和面要素有效 |
> 
> 返回坐标元组列表。失败时抛出异常

***Geometry.loads***
> ```python
> @classmethod
> def loads(
>         cls,
>         coordinates: str | list | dict,
>         code: int | None = -1
> ) -> dict
> ```
> 由符合【WKT/WKB、GeoJson、自由/简约文本】格式的几何坐标串或者符合【GeoJson-geometry】格式的列表及字典对象乃至【shapely.geometry】对象反序列化转换为符合【GeoJson-geometry】格式的字典类型对象。  
> - 注1:针对线和面要素,将自动剔除相邻重复点,面要素的线环将自动封闭。  
> - 注2:针对顶点坐标,要求至少是二维,且前两个维度应为浮点数值,为提升普适度,不对浮点型[x y]的定义域进行约束。  
> - 注3:针对WKB十六进制文本类型与GeometryCollection集合要素格式,将按实际内容解码,无需指定[code]参数。  
> - 注4:如果GeoJson以文本方式输入,其中的对象名必须采用双引号封闭。  
>
> | Parameter   | Type          | Description                                                                                                                     |
> |:------------|:--------------|:--------------------------------------------------------------------------------------------------------------------------------|
> | coordinates | str list dict | 几何坐标参数(不多于4维[x y z m]且要求前2维[x y]为浮点型)。其中,GeoJson格式需具有[方括号]标识,WKT格式需具有(圆括号)标识,自由格式仅识别【单点/单线/单面】几何类型                              |
> | code        | int None      | 几何类型代码:-1=自识别(默认值)、0=单点/多点、1=单线/多线、2=单面或母子面/多面。注:此参数通常仅当输入的坐标为简约格式且期望格式为[多点/多线]时需指定为[0/1],或者当输入的坐标为自由格式时也应指定为[0/1/2],以便消除二义性问题  |
> 
> 返回符合【GeoJson-geometry】格式的字典类型对象,字典中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的浮点型几何坐标数组。失败时抛出异常
> 
> - coordinates 参数格式说明  
>  - 自由文本格式(仅支持2维)  
>     - Point:code参数可为[0]或者[-1]  
>              'x y'  
>              'x,y'  
>     - LineString:code参数可为[1]或者[-1],若code指定为0,便视为多点[MultiPoint]  
>              'x y,x y,...'  
>              'x,y x,y ...'  
>     - Polygon:code参数必须指定为[2]方可视为单面[Polygon],若code指定为0,便视为多点[MultiPoint],若code指定为1,便视为单线[LineString]  
>              'x y,x y,x y,x y,...'  
>              'x,y x,y x,y x,y ...'  
>  - GeoJson  
>    - Point:  
>         [x,y,z,m]  # 简约格式  
>         {"type":"Point","coordinates":[x,y,z,m]}  
>    - MultiPoint:  
>         [[x,y,z,m],[x,y,z,m],...]  # 简约格式  
>         {"type":"MultiPoint","coordinates":[[x,y,z,m],[x,y,z,m],...]}  
>    - LineString:  
>         [[x,y,z,m],[x,y,z,m],[x,y,z,m],[x,y,z,m],...]  # 简约格式  
>         {"type":"LineString","coordinates":[[x,y,z,m],[x,y,z,m],[x,y,z,m],[x,y,z,m],...]}  
>    - MultiLineString:  
>         [[[x,y,z,m],[x,y,z,m],[x,y,z,m]],[[x,y,z,m],[x,y,z,m],[x,y,z,m],...],...]  # 简约格式  
>         {"type":"MultiLineString","coordinates":[[[x,y,z,m],[x,y,z,m],[x,y,z,m]],[[x,y,z,m],[x,y,z,m],[x,y,z,m],...],...]}  
>    - Polygon(单面或母子面):    
>         [[[x,y,z,m],[x,y,z,m],[x,y,z,m],[x,y,z,m],[x,y,z,m],...],...]  # 简约格式  
>         {"type":"Polygon","coordinates":[[[x,y,z,m],[x,y,z,m],[x,y,z,m],[x,y,z,m],[x,y,z,m],...],...]}  
>    - MultiPolygon:  
>         [[[[x,y,z,m],[x,y,z,m],[x,y,z,m],[x,y,z,m],[x,y,z,m],...],...],...]  # 简约格式  
>         {"type":"MultiPolygon","coordinates":[[[[x,y,z,m],[x,y,z,m],[x,y,z,m],[x,y,z,m],[x,y,z,m],...],...],...]}  
>    - GeometryCollection:  
>         {'type': 'GeometryCollection', 'geometries': [{"type":"Point","coordinates":[x,y,z,m]}, {"type":"LineString","coordinates":[[x,y,z,m],[x,y,z,m],[x,y,z,m],[x,y,z,m],...]}, {"type":"Polygon","coordinates":[[[x,y,z,m],[x,y,z,m],[x,y,z,m],[x,y,z,m],[x,y,z,m],...],...]}]}  
>   - WKT(Well-Known Text 采用文本字符串存储)    
>     - Point:  
>         (x y z m)  # 简约格式  
>         POINT(x y z m)  
>     - MultiPoint:  
>         (x y z m,x y z m,...)  # 简约格式  
>         MULTIPOINT(x y z m,x y z m,...)  
>     - LineString:  
>         (x y z m,x y z m,...)  # 简约格式  
>         LINESTRING(x y z m,x y z m,...)  
>     - MultiLineString:  
>         ((x y z m,x y z m,...),...)  # 简约格式  
>         MULTILINESTRING((x y z m,x y z m,...),...)  
>     - Polygon(单面或母子面):  
>         ((x y z m,x y z m,...),...)  # 简约格式  
>         POLYGON((x y z m,x y z m,...),...)  
>     - MultiPolygon:  
>         (((x y z m,x y z m,...),...),...)  
>         MULTIPOLYGON(((x y z m,x y z m,...),...),...)  
>     - GEOMETRYCOLLECTION(不支持简约格式):  
>         GEOMETRYCOLLECTION(POINT(x y z m), LINESTRING(x y z m,x y z m,...), POLYGON((x y z m,x y z m,...),...))  
>   - WKB(Well-known Binary 采用十六进制字节串存储)  
>     b"??..."  # 由诸多[00~FF]构成的字节串   
>   
> 
> - 自由文本格式示例
> ```python
> # Point
> >>> ellipsoid.Geometry.loads('120,38', -1 or 0)   
> >>> ellipsoid.Geometry.loads('120 38', -1 or 0)   
> # {'type': 'Point', 'coordinates': [120, 38]}
> ``` 
> ```python
> # MultiPoint
> >>> ellipsoid.Geometry.loads('120 38,122 39,99 28,120 38', 0)   
> >>> ellipsoid.Geometry.loads('120,38 122,39 99,28 120,38', 0)  
> # {'type': 'MultiPoint', 'coordinates': [[120, 38], [122, 39], [99, 28], [120, 38]]}  
> ``` 
> ```python
> # LineString
> >>> ellipsoid.Geometry.loads('120 38,122 39,99 28,120 38', -1 or 1)   
> >>> ellipsoid.Geometry.loads('120,38 122,39 99,28 120,38', -1 or 1)  
> # {'type': 'LineString', 'coordinates': [[120, 38], [122, 39], [99, 28], [120, 38]]}  
> ```  
> ```python
> # Polygon
> >>> ellipsoid.Geometry.loads('120 38,122 39,99 28,120 38', 2)    
> >>> ellipsoid.Geometry.loads('120,38 122,39 99,28 120,38', 2)   
> # {'type': 'Polygon', 'coordinates': [[[120, 38], [122, 39], [99, 28], [120, 38]]]}    
> ```     
>   
> - GeoJSON 格式示例  
> ```python
> # Point
> >>> ellipsoid.Geometry.loads([-115.81, 37.24],-1 or 0)     
> >>> ellipsoid.Geometry.loads('[-115.81, 37.24]',-1 or 0)    
> >>> ellipsoid.Geometry.loads('{"type": "Point", "coordinates": [-115.81, 37.24]}', -1 or 0)  
> >>> ellipsoid.Geometry.loads({"type": "Point", "coordinates": [-115.81, 37.24]},-1 or 0)  
> # {'type': 'Point', 'coordinates': [-115.81, 37.24]}   
> ```
> ```python
> # MultiPoint / LineString  
> >>> ellipsoid.Geometry.loads([[-155.52, 19.61], [-156.22, 20.74], [-157.97, 21.46]], 0)     
> >>> ellipsoid.Geometry.loads('[[-155.52, 19.61], [-156.22, 20.74], [-157.97, 21.46]]', 0)   
> >>> ellipsoid.Geometry.loads('{"type":"MultiPoint","coordinates":[[-155.52, 19.61], [-156.22, 20.74], [-157.97, 21.46]]}',-1 or 0)  
> >>> ellipsoid.Geometry.loads({"type":"MultiPoint","coordinates":[[-155.52, 19.61], [-156.22, 20.74], [-157.97, 21.46]]},-1 or 0)  
> # {'coordinates': [[-155.52, 19.61], [-156.22, 20.74], [-157.97, 21.46]], 'type': 'MultiPoint'}    
> >>> ellipsoid.Geometry.loads([[-155.52, 19.61], [-156.22, 20.74], [-157.97, 21.46]], -1 or 1)    
> >>> ellipsoid.Geometry.loads('[[-155.52, 19.61], [-156.22, 20.74], [-157.97, 21.46]]', -1 or 1)  
> # {'coordinates': [[-155.52, 19.61], [-156.22, 20.74], [-157.97, 21.46]], 'type': 'LineString'}  
> ```
> ```python
> # LineString   
> >>> ellipsoid.Geometry.loads([[8.919, 44.4074], [8.923, 44.4075]], -1 or 1)  
> >>> ellipsoid.Geometry.loads('[[8.919, 44.4074], [8.923, 44.4075]]', -1 or 1)  
> >>> ellipsoid.Geometry.loads('{"type":"LineString","coordinates": [[8.919, 44.4074], [8.923, 44.4075]]}', -1 or 1)  
> >>> ellipsoid.Geometry.loads({"type":"LineString","coordinates": [[8.919, 44.4074], [8.923, 44.4075]]}, -1 or 1)  
> # {'coordinates': [[8.919, 44.4074], [8.923, 44.4075]], 'type': 'LineString'}    
> ```     
> ```python
> # MultiLineString / Polygon    
> >>> ellipsoid.Geometry.loads([[[3.75, 9.25], [-130.95, 1.52]], [[23.15, -34.25], [-1.35, -4.65], [3.45, 77.95]]], 1)   
> >>> ellipsoid.Geometry.loads('[[[3.75, 9.25], [-130.95, 1.52]], [[23.15, -34.25], [-1.35, -4.65], [3.45, 77.95]]]', 1)   
> >>> ellipsoid.Geometry.loads('{"type":"MultiLineString","coordinates":[[[3.75, 9.25], [-130.95, 1.52]], [[23.15, -34.25], [-1.35, -4.65], [3.45, 77.95]]]}', -1 or 1)  
> >>> ellipsoid.Geometry.loads({"type":"MultiLineString","coordinates":[[[3.75, 9.25], [-130.95, 1.52]], [[23.15, -34.25], [-1.35, -4.65], [3.45, 77.95]]]}, -1 or 1)  
> # {'type': 'MultiLineString', 'coordinates': [[[3.75, 9.25], [-130.95, 1.52]], [[23.15, -34.25], [-1.35, -4.65], [3.45, 77.95]]]}   
> ```         
> ```python
> # no hole within polygon  
> >>> ellipsoid.Geometry.loads([[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38, 57.322]]], -1 or 2)  
> >>> ellipsoid.Geometry.loads('[[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38, 57.322]]]', -1 or 2)  
> >>> ellipsoid.Geometry.loads('{"type":"Polygon","coordinates":[[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38, 57.322]]]}', -1 or 2)  
> >>> ellipsoid.Geometry.loads({"type":"Polygon","coordinates":[[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38, 57.322]]]}, -1 or 2)  
> # {'type': 'Polygon', 'coordinates': [[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38, 57.322]]]}  
> ```          
> ```python
> # hole within polygon   
> >>> ellipsoid.Geometry.loads('{"type":"Polygon","coordinates":[[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38, 57.322]], [[-5.21, 23.51], [15.21, -10.81], [-20.51, 1.51], [-5.21, 23.51]]]}', -1 or 2)  
> >>> ellipsoid.Geometry.loads({"type":"Polygon","coordinates":[[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38, 57.322]], [[-5.21, 23.51], [15.21, -10.81], [-20.51, 1.51], [-5.21, 23.51]]]}, -1 or 2)  
> >>> ellipsoid.Geometry.loads('[[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38, 57.322]], [[-5.21, 23.51], [15.21, -10.81], [-20.51, 1.51], [-5.21, 23.51]]]', -1 or 2)  
> >>> ellipsoid.Geometry.loads([[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38, 57.322]], [[-5.21, 23.51], [15.21, -10.81], [-20.51, 1.51], [-5.21, 23.51]]], -1 or 2)          
> # {'type': 'Polygon', 'coordinates': [[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38, 57.322]], [[-5.21, 23.51], [15.21, -10.81], [-20.51, 1.51], [-5.21, 23.51]]]}  
> ```        
> ```python
> # MultiPolygon   
> >>> ellipsoid.Geometry.loads('{"type":"MultiPolygon","coordinates":[[[[3.78, 9.28], [-130.91, 1.52], [35.12, 72.234], [3.78, 9.28]]], [[[23.18, -34.29], [-1.31, -4.61], [3.41, 77.91], [23.18, -34.29]]]]}', -1 or 2)  
> >>> ellipsoid.Geometry.loads({"type":"MultiPolygon","coordinates":[[[[3.78, 9.28], [-130.91, 1.52], [35.12, 72.234], [3.78, 9.28]]], [[[23.18, -34.29], [-1.31, -4.61], [3.41, 77.91], [23.18, -34.29]]]]}, -1 or 2)  
> >>> ellipsoid.Geometry.loads('[[[[3.78, 9.28], [-130.91, 1.52], [35.12, 72.234], [3.78, 9.28]]], [[[23.18, -34.29], [-1.31, -4.61], [3.41, 77.91], [23.18, -34.29]]]]', -1 or 2)  
> >>> ellipsoid.Geometry.loads([[[[3.78, 9.28], [-130.91, 1.52], [35.12, 72.234], [3.78, 9.28]]], [[[23.18, -34.29], [-1.31, -4.61], [3.41, 77.91], [23.18, -34.29]]]], -1 or 2)           
> # {'type': 'MultiPolygon', 'coordinates': [[[[3.78, 9.28], [-130.91, 1.52], [35.12, 72.234], [3.78, 9.28]]], [[[23.18, -34.29], [-1.31, -4.61], [3.41, 77.91], [23.18, -34.29]]]]}  
> ```        
> ```python
> # GeometryCollection(不支持简约格式且可忽略识别码)    
> >>> ellipsoid.Geometry.loads({"type": "GeometryCollection","geometries":[{"type": "Point", "coordinates": [-115.81, 37.24]},{"type":"LineString","coordinates": [[8.919, 44.4074], [8.923, 44.4075]]},{"type":"Polygon","coordinates":[[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38, 57.322]]]}]})  
> >>> ellipsoid.Geometry.loads('{"type": "GeometryCollection","geometries":[{"type": "Point", "coordinates": [-115.81, 37.24]},{"type":"LineString","coordinates": [[8.919, 44.4074], [8.923, 44.4075]]},{"type":"Polygon","coordinates":[[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38, 57.322]]]}]}')      
> # {'type': 'GeometryCollection', 'geometries': [{'type': 'Point', 'coordinates': [-115.81, 37.24]}, {'type': 'LineString', 'coordinates': [[8.919, 44.4074], [8.923, 44.4075]]}, {'type': 'Polygon', 'coordinates': [[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38, 57.322]]]}]}   
> ```           
>      
> - WKT 格式示例  
> ```python
> # Point  
> >>> ellipsoid.Geometry.loads('POINT(-115.81 37.24)', -1 or 0)   
> >>> ellipsoid.Geometry.loads('(-115.81 37.24)', -1 or 0)   
> # {'type': 'Point', 'coordinates': [-115.81, 37.24]}   
> ``` 
> ```python
> # MultiPoint / LineString     
> >>> ellipsoid.Geometry.loads('MULTIPOINT(-155.52 19.61,-156.22  20.74,-157.97  21.46)', -1 or 0)  
> >>> ellipsoid.Geometry.loads('(-155.52 19.61,-156.22  20.74,-157.97  21.46)', 0)  
> # {'type': 'MultiPoint', 'coordinates': [[-155.52, 19.61], [-156.22, 20.74], [-157.97, 21.46]]}   
> >>> ellipsoid.Geometry.loads('(-155.52 19.61,-156.22  20.74,-157.97  21.46)', -1)   
> # {'type': 'LineString', 'coordinates': [[-155.52, 19.61], [-156.22, 20.74], [-157.97, 21.46]]}  
> ``` 
> ```python
> # LineString   
> >>> ellipsoid.Geometry.loads('LINESTRING(8.919 44.4074,8.923 44.4075)', -1 or 1)    
> >>> ellipsoid.Geometry.loads('(8.919 44.4074,8.923 44.4075)', -1 or 1)   
> # {'type': 'LineString', 'coordinates': [[8.919, 44.4074], [8.923, 44.4075]]}   
> ```  
> ```python
> # MultiLineString / Polygon  
> >>> ellipsoid.Geometry.loads('MULTILINESTRING((3.75 9.25,-130.95 1.52),(23.15 -34.25,-1.35 -4.65,3.45 77.95))', -1 or 1)  
> >>> ellipsoid.Geometry.loads('((3.75 9.25,-130.95 1.52),(23.15 -34.25,-1.35 -4.65,3.45 77.95))', 1)  
> # {'type': 'MultiLineString', 'coordinates': [[[3.75, 9.25], [-130.95, 1.52]], [[23.15, -34.25], [-1.35, -4.65], [3.45, 77.95]]]}  
> >>> ellipsoid.Geometry.loads('((3.75 9.25,-130.95 1.52),(23.15 -34.25,-1.35 -4.65,3.45 77.95))', -1)  
> # {'type': 'Polygon', 'coordinates': [[[3.75, 9.25], [-130.95, 1.52]], [[23.15, -34.25], [-1.35, -4.65], [3.45, 77.95]]]}  
> ```
> ```python
> # no hole within polygon  
> >>> ellipsoid.Geometry.loads('POLYGON((2.38 57.322,-120.43 19.15,23.194 -20.28,2.38 57.322))', -1 or 2)  
> >>> ellipsoid.Geometry.loads('((2.38 57.322,-120.43 19.15,23.194 -20.28,2.38 57.322))', -1 or 2)  
> # {'type': 'Polygon', 'coordinates': [[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38, 57.322]]]}  
> ```      
> ```python
> # hole within polygon   
> >>> ellipsoid.Geometry.loads('POLYGON((2.38 57.322,-120.43 19.15,23.194 -20.28,2.38 57.322),(-5.21 23.51,15.21 -10.81,-20.51 1.51,-5.21 23.51))', -1 or 2)  
> >>> ellipsoid.Geometry.loads('((2.38 57.322,-120.43 19.15,23.194 -20.28,2.38 57.322),(-5.21 23.51,15.21 -10.81,-20.51 1.51,-5.21 23.51))', -1 or 2)  
> # {'type': 'Polygon', 'coordinates': [[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38], [57.322]], [[-5.21, 23.51], [15.21, -10.81], [-20.51, 1.51], [-5.21, 23.51]]]}  
> ```       
> ```python
> # MultiPolygon  
> >>> ellipsoid.Geometry.loads('MULTIPOLYGON(((3.78 9.28,-130.91 1.52,35.12 72.234,3.78 9.28)),((23.18 -34.29,-1.31 -4.61,3.41 77.91,23.18 -34.29)))', -1 or 2)  
> >>> ellipsoid.Geometry.loads('(((3.78 9.28,-130.91 1.52,35.12 72.234,3.78 9.28)),((23.18 -34.29,-1.31 -4.61,3.41 77.91,23.18 -34.29)))', -1 or 2)  
> # {'type': 'MultiPolygon', 'coordinates': [[[[3.78, 9.28], [-130.91, 1.52], [35.12, 72.234], [3.78, 9.28]]], [[[23.18, -34.29], [-1.31, -4.61], [3.41, 77.91], [23.18, -34.29]]]]}  
> ```  
> ```python
> # GeometryCollection(不支持简约格式且应将识别码取默认值[-1])    
> >>> ellipsoid.Geometry.loads('GEOMETRYCOLLECTION (POINT (-115.81 37.24),LINESTRING (8.919 44.4074,8.923 44.4075),POLYGON ((2.38 57.322,-120.43 19.15,23.194 -20.28,2.38 57.322)))',-1)  
> # {'type': 'GeometryCollection', 'geometries': [{'type': 'Point', 'coordinates': [-115.81, 37.24]}, {'type': 'LineString', 'coordinates': [[8.919, 44.4074], [8.923, 44.4075]]}]} 
> ```
>       
> - WKB 格式示例  
> ```python
> # Point   
> >>> ellipsoid.Geometry.toWkb({"type": "Point", "coordinates": [-115.81, 37.24]})  
> # 0101000020E6100000A4703D0AD7F35CC01F85EB51B89E4240   
> SQL> SELECT ST_AsGeoJSON(ST_GeomFromEWKB(E'\\x0101000020E6100000A4703D0AD7F35CC01F85EB51B89E4240'))   
> >>> ellipsoid.Geometry.loads('0101000020E6100000A4703D0AD7F35CC01F85EB51B89E4240')
> # {"type":"Point","coordinates":[-115.81,37.24]}  
> ``` 
> 

***Geometry.rotate***
> ```python
> @classmethod
> def rotate(
>        cls,
>        geometry: dict | list | str,
>        angle: float,
>        origin: str | tuple = (0, 0, 0)
> ) -> shapely.geometry
> ```
> 旋转几何对象  
>
> | Parameter | Type                   | Description                                                                  |
> |:----------|:-----------------------|:-----------------------------------------------------------------------------|
> | geometry  | dict list str          | 几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组                   |
> | angle     | float                  | 旋转角(十进制度格式 - 正值为逆时针旋转,负值为顺时针旋转)                                              |
> | origin    | str tuple = (0, 0, 0)  | 参考原点(旋转中心),可为不超过3维的元组类型点状坐标、几何边框中心'center'、几何质心'centroid',省略时取默认值:(0, 0, 0)  |
> 
> 返回shapely格式几何(geometry)对象。失败时抛出异常

***Geometry.scale***
> ```python
> @classmethod
> def scale(
>         cls,
>         geometry: dict | list | str,
>         xfact: float = 1.0,
>         yfact: float = 1.0,
>         zfact: float = 1.0,
>         origin: str | tuple = (0, 0, 0)
> ) -> shapely.geometry
> ```
> 缩放几何对象  
>
> | Parameter | Type                   | Description                                                                 |
> |:----------|:-----------------------|:----------------------------------------------------------------------------|
> | geometry  | dict list str          | 几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组                  |
> | xfact     | float                  | 横向缩放因子(比例),省略时取默认值:1.0                                                      |
> | yfact     | float                  | 纵向缩放因子(比例),省略时取默认值:1.0                                                      |
> | zfact     | float                  | 竖向缩放因子(比例),省略时取默认值:1.0                                                      |
> | origin    | str tuple = (0, 0, 0)  | 参考原点,可为不超过3维的元组类型点状坐标、几何边框中心'center'、几何质心'centroid',省略时取默认值:(0, 0, 0) |
> 
> 返回shapely格式几何(geometry)对象。失败时抛出异常

***Geometry.skew***
> ```python
> @classmethod
> def skew(
>         cls,
>         geometry: dict | list | str,
>         xs: float = 0.0,
>         ys: float = 0.0,
>         origin: str | tuple = (0, 0, 0)
> ) -> shapely.geometry
> ```
> 扭斜几何对象    
>
> | Parameter | Type                   | Description                                                                 |
> |:----------|:-----------------------|:----------------------------------------------------------------------------|
> | geometry  | dict list str          | 几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组                  |
> | xs        | float                  | 沿横向坐标轴的倾斜角(十进制度格式 - 正值为逆时针旋转,负值为顺时针旋转),省略时取默认值:0.0 |
> | ys        | float                  | 沿纵向坐标轴的倾斜角(十进制度格式 - 正值为逆时针旋转,负值为顺时针旋转),省略时取默认值:0.0 |
> | origin    | str tuple = (0, 0, 0)  | 参考原点,可为不超过3维的元组类型点状坐标、几何边框中心'center'、几何质心'centroid',省略时取默认值:(0, 0, 0) |
> 
> 返回shapely格式几何(geometry)对象。失败时抛出异常

***Geometry.swapXY***
> ```python
> @classmethod
> def swapXY(
>         cls,
>         geometry: dict | list | str
> ) -> dict  
> ```
> 交换指定几何体的顶点坐标[x,y,z,m]中的[x,y]顺序([x,y,z,m] to [y,x,z,m])   
>  
> | Parameter | Type                   | Description                                                 |
> |:----------|:-----------------------|:------------------------------------------------------------|
> | geometry  | dict list str          | 几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> 
> 返回【GeoJson-geometry】格式的字典类型对象。失败时抛出异常

***Geometry.toGml***
> ```python
> @classmethod
> def toGml(
>         cls,
>         geometry: dict | list | str
> ) -> etree._Element  
> ```
> 将【GeoJson-geometry】何字符串或字典对象以及列表对象转换为GML-V3.2格式几何对象  
>  
> | Parameter | Type                   | Description                                                 |
> |:----------|:-----------------------|:------------------------------------------------------------|
> | geometry  | dict list str          | 几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> 
> 返回GML-V3.2格式几何对象(解码为字符串:lxml.etree.tostring(resultGml, pretty_print=True).decode())。失败时抛出异常

***Geometry.toKml***
> ```python
> @classmethod
> def toKml(
>         cls,
>         geometry: dict | list | str
> ) -> etree._Element  
> ```
> 将【GeoJson-geometry】几何字典对象转换为KML格式几何元素对象  
>  
> | Parameter | Type                   | Description                                                 |
> |:----------|:-----------------------|:------------------------------------------------------------|
> | geometry  | dict list str          | 几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> 
> 返回KML格式几何元素对象(解码为字符串:lxml.etree.tostring(resultKml, pretty_print=True).decode())。失败时抛出异常

***Geometry.toOgr***
> ```python
> @classmethod
> def toOgr(
>         cls,
>         geometry: dict | list | str
> ) -> ogr.Geometry
> ```
> 将【GeoJson-geometry】几何字符串或字典对象以及列表对象转换为[OSGEO - GDAL - Geometry]格式几何对象  
>  
> | Parameter | Type                   | Description                                                 |
> |:----------|:-----------------------|:------------------------------------------------------------|
> | geometry  | dict list str          | 几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> 
> 返回[OSGEO - GDAL - Geometry]格式几何对象。失败时抛出异常

***Geometry.toShapely***
> ```python
> @classmethod
> def toShapely(
>         cls,
>         geometry: dict | list | str,
>         srid: int | None = 4326
> ) -> shapely.geometry
> ```
> 将【GeoJson-geometry】几何字符串或字典对象以及列表对象转换为shapely格式几何对象。注:几何坐标最多支持3维  
>  
> | Parameter | Type          | Description                                                       |
> |:----------|:--------------|:------------------------------------------------------------------|
> | geometry  | dict list str | 几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组        |
> | srid      | int None      | 几何投影参照系OGC类型代码,默认值:4326=十进制经纬度格式;设定为0时意指未定义参照系;如果设为None,将不设置投影参量  |
> 
> 返回shapely格式几何(geometry)对象。失败时抛出异常

***Geometry.toSvg***
> ```python
> @classmethod
> def toSvg(
>         cls,
>         geometry: dict | list | str,
>         scale_factor: float = 1.0,
>         color: str = None,
>         opacity: float = None
> ) -> str
> ```
> 将【GeoJson-geometry】几何字符串或字典对象以及列表对象或者【shapely】格式对象转换为SVG格式   
>  
> | Parameter    | Type          | Description                                                |
> |:-------------|:--------------|:-----------------------------------------------------------|
> | geometry     | dict list str | 几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组 |
> | scale_factor | float         | 画笔宽度的缩放因子,默认值:1.0                                          |
> | color        | str           | 画笔颜色或者填充颜色(十六进制字符串),有效几何的默认色:“#66cc99”,无效几何的默认色:“#ff3333”  |
> | opacity      | float         | 色彩透明度(介于[0,1]之间),默认值:0.6(点)、0.8(线面)                        |
> 
> 返回XML格式SVG几何字符串. 失败时抛出异常  

***Geometry.toWkb***
> ```python
> @classmethod
> def toWkb(
>         cls,
>         geometry: dict | list | str,
>         srid: int | None = 4326
> ) -> str
> ```
> 将【GeoJson-geometry】几何字典对象转换为OGC-WKB十六进制几何文本  
>  
> | Parameter | Type          | Description                                                       |
> |:----------|:--------------|:------------------------------------------------------------------|
> | geometry  | dict list str | 几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组        |
> | srid      | int None      | 几何投影参照系OGC类型代码,默认值:4326=十进制经纬度格式;设定为0时意指未定义参照系;如果设为None,将不设置投影参量  |
> 
> 返回OGC-WKB(可包含srid)十六进制几何文本。失败时抛出异常  
>  
> EPSG:4326坐标系下的WKB编码样例:   
>> 单点  
>> ellipsoid.Geometry.toWkb({"type": "Point", "coordinates": [1, 2]})  
>> 0101000020E6100000000000000000F03F0000000000000040  
>  
>> 多点  
>> ellipsoid.Geometry.toWkb({"type": "MultiPoint", "coordinates": [[1, 2], [3, 4]]})  
>> 0104000020E6100000020000000101000000000000000000F03F0000000000000040010100000000000000000008400000000000001040  
>  
>> 单线  
>> ellipsoid.Geometry.toWkb({"type": "LineString", "coordinates": [[1, 2], [3, 4]]})  
>> 0102000020E610000002000000000000000000F03F000000000000004000000000000008400000000000001040  
>  
>> 多线  
>> ellipsoid.Geometry.toWkb({"type": "MultiLineString", "coordinates": [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]})  
>> 0105000020e610000002000000010200000002000000000000000000f03f000000000000004000000000000008400000000000001040010200000002000000000000000000144000000000000018400000000000001c400000000000002040  
>   
>> 单面  
>> ellipsoid.Geometry.toWkb({"type": "Polygon", "coordinates": [[[1, 2], [3, 4]], [[5, 6], [7, 8],[1, 2]]]})  
>> 0103000020E61000000200000002000000000000000000F03F00000000000000400000000000000840000000000000104003000000000000000000144000000000000018400000000000001C400000000000002040000000000000F03F0000000000000040  
>  
>> 母子面  
>> ellipsoid.Geometry.toWkb({"type": "Polygon", "coordinates": [[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38, 57.322]], [[-5.21, 23.51], [15.21, -10.81], [-20.51, 1.51], [-5.21, 23.51]]]})  
>> 0103000020E610000002000000040000000AD7A3703D0A0340F0A7C64B37A94C40EC51B81E851B5EC066666666662633408B6CE7FBA931374048E17A14AE4734C00AD7A3703D0A0340F0A7C64B37A94C4004000000D7A3703D0AD714C0C3F5285C8F823740EC51B81E856B2E401F85EB51B89E25C0C3F5285C8F8234C0295C8FC2F528F83FD7A3703D0AD714C0C3F5285C8F823740  
>  
>> 多面  
>> ellipsoid.Geometry.toWkb({"type": "MultiPolygon", "coordinates": [[[[3.78, 9.28], [-130.91, 1.52], [35.12, 72.234], [3.78, 9.28]]], [[[23.18, -34.29], [-1.31, -4.61], [3.41, 77.91], [23.18, -34.29]]]]})  
>> 0106000020E610000002000000010300000001000000040000003D0AD7A3703D0E408FC2F5285C8F224085EB51B81E5D60C052B81E85EB51F83F8FC2F5285C8F4140E5D022DBF90E52403D0AD7A3703D0E408FC2F5285C8F224001030000000100000004000000AE47E17A142E374085EB51B81E2541C0F6285C8FC2F5F4BF713D0AD7A37012C048E17A14AE470B400AD7A3703D7A5340AE47E17A142E374085EB51B81E2541C0  

***Geometry.toWkt***
> ```python
> @classmethod
> def toWkt(
>         cls,
>         geometry: dict | list | str
> ) -> str 
> ```
> 将【GeoJson-geometry】几何字典对象转换为OGC-WKT(Well-known Text)格式字符串  
>  
> | Parameter | Type                   | Description                                                 |
> |:----------|:-----------------------|:------------------------------------------------------------|
> | geometry  | dict list str          | 几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> 
> 返回WKT格式字符串。失败时抛出异常  

***Geometry.translate***
> ```python
> @classmethod
> def translate(
>         cls,
>         geometry: dict | list | str,
>         xoff: float = 0.0,
>         yoff: float = 0.0,
>         zoff: float = 0.0
> ) -> shapely.geometry
> ```
> 平移几何对象   
>  
> | Parameter | Type          | Description                                                |
> |:----------|:--------------|:-----------------------------------------------------------|
> | geometry  | dict list str | 几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组 |
> | xoff      | float         | 沿横向坐标轴的平移量,省略时取默认值:0.0                                     |
> | yoff      | float         | 沿纵向坐标轴的平移量,省略时取默认值:0.0                                     | 
> | zoff      | float         | 沿纵向坐标轴的平移量,省略时取默认值:0.0                                     |
> 
> 返回shapely格式几何(geometry)对象。失败时抛出异常    

*****
* ### Class MapGrid(builtins.object)

*****

***MapGrid.map***
> ```python
> @classmethod
> def map(
>        cls,
>        longitude: float,
>        latitude: float,
>        scale: int = 1000000
> ) -> dict
> ```
> 由十进制经纬度位置和比例尺分母计算所在比例尺的图幅新旧编号(南半球冠以S前缀,北半球省略N前缀)与边框范围。注:如果指定位置恰好位于图幅边缘,将返回右上角图幅结果信息  
>
> | Parameter | Type  | Description                     |
> |:----------|:------|:--------------------------------|
> | longitude | float | 十进制经度,定义域为:[-180 ~ +180]        |
> | latitude  | float | 十进制纬度,定义域为:[-90 ~ +90]          | 
> | scale     | int   | 比例尺分母,定义域为:[1000000(默认) ~ 500]  |
> 
> 返回所在比例尺的图幅新旧编号与边框范围构成的字典对象,运行失败时抛出异常  
>   
> 示例(位置:114°33′45″,39°22′30″):
>> ```python
>> ellipsoid.MapGrid.map(longitude=114.5625, latitude=39.375, scale=1000000)  
>> # {'new': 'J50', 'old': 'J-50', 'boundary': {'north': 40, 'south': 36, 'west': 114, 'east': 120}}  
>> ellipsoid.MapGrid.map(longitude=114.5625, latitude=39.375, scale=500000)  
>> # {'new': 'J50B001001', 'old': 'J-50-A', 'boundary': {'north': 40.0, 'south': 38.0, 'west': 114.0, 'east': 117.0}}  
>> ellipsoid.MapGrid.map(longitude=114.5625, latitude=39.375, scale=250000)  
>> # {'new': 'J50C001001', 'old': 'J-50-[1]', 'boundary': {'north': 40.0, 'south': 39.0, 'west': 114.0, 'east': 115.5}}  
>> ellipsoid.MapGrid.map(longitude=114.5625, latitude=39.375, scale=200000)   
>> # {'new': 'J-50-(01)', 'old': 'J-50-(01)', 'boundary': {'north': 40.0, 'south': 39.333333333333336, 'west': 114.0, 'east': 115.0}}   
>> ellipsoid.MapGrid.map(longitude=114.5625, latitude=39.375, scale=100000)  
>> # {'new': 'J50D002002', 'old': 'J-50-14', 'boundary': {'north': 39.66666666666667, 'south': 39.333333333333336, 'west': 114.5, 'east': 115.0}}  
>> ellipsoid.MapGrid.map(longitude=114.5625, latitude=39.375, scale=50000)  
>> # {'new': 'J50E004003', 'old': 'J-50-14-C', 'boundary': {'north': 39.5, 'south': 39.333333333333336, 'west': 114.5, 'east': 114.75}}  
>> ellipsoid.MapGrid.map(longitude=114.5625, latitude=39.375, scale=25000)  
>> # {'new': 'J50F008005', 'old': 'J-50-14-C-3', 'boundary': {'north': 39.41666666666667, 'south': 39.333333333333336, 'west': 114.5, 'east': 114.625}}  
>> ellipsoid.MapGrid.map(longitude=114.5625, latitude=39.375, scale=10000)
>> # {'new': 'J50G015010', 'old': 'J-50-14-(50)', 'boundary': {'north': 39.416666666666664, 'south': 39.375, 'west': 114.5625, 'east': 114.625}}  
>> ellipsoid.MapGrid.map(longitude=114.5625, latitude=39.375, scale=5000)
>> # {'new': 'J50H030019', 'old': 'J-50-14-(50)-c', 'boundary': {'north': 39.395833333333336, 'south': 39.375, 'west': 114.5625, 'east': 114.59375}}  
>> ellipsoid.MapGrid.map(longitude=114.5625, latitude=39.375, scale=2000)  
>> # {'new': 'J50I090055', 'old': 'J-50-14-(50)-c-7', 'boundary': {'north': 39.38194444444444, 'south': 39.375, 'west': 114.5625, 'east': 114.57291666666667}}  
>> ellipsoid.MapGrid.map(longitude=114.5625, latitude=39.375, scale=1000)
>> # {'new': 'J50J01800109', 'old': 'J-50-14-(50)-c-7-3', 'boundary': {'north': 39.37847222222222, 'south': 39.375, 'west': 114.5625, 'east': 114.56770833333333}}   
>> ellipsoid.MapGrid.map(longitude=114.5625, latitude=39.375, scale=500)
>> # {'new': 'J50K03600217', 'old': 'J-50-14-(50)-c-7-3-3', 'boundary': {'north': 39.376736111111114, 'south': 39.375, 'west': 114.5625, 'east': 114.56510416666667}}
>> ```

***MapGrid.parse***
> ```python
> @classmethod
> def parse(
>        cls,
>        code: str
> ) -> dict
> ```
> 由国家基本比例尺地形图分幅(新旧)编号解析图幅边界范围和比例尺信息  
>
> | Parameter | Type  | Description            |
> |:----------|:------|:-----------------------|
> | code      | str   | 国家基本比例尺地形图分幅编号(忽略大小写)  |
> 
> 返回图幅边界范围、比例尺构成的字典对象,运行失败时抛出异常  
> 
> 示例:
>> ```python
>> ellipsoid.MapGrid.parse('J50' 或者 'J-50')    
>> # {'scale': 1000000, 'boundary': {'north': 40, 'south': 36, 'west': 114, 'east': 120}}  
>> ellipsoid.MapGrid.parse('J50B001001' 或者 'J-50-A')  
>> # {'scale': 500000, 'boundary': {'north': 40.0, 'south': 38.0, 'west': 114.0, 'east': 117.0}}  
>> ellipsoid.MapGrid.parse('J50C001001' 或者 'J-50-[1]')  
>> # {'scale': 250000, 'boundary': {'north': 40.0, 'south': 39.0, 'west': 114.0, 'east': 115.5}}  
>> ellipsoid.MapGrid.parse('J-50-(01)')   
>> # {'scale': 200000, 'boundary': {'north': 40.0, 'south': 39.333333333333336, 'west': 114.0, 'east': 115.0}}    
>> ellipsoid.MapGrid.parse('J50D002002' 或者 'J-50-14')   
>> # {'scale': 100000, 'boundary': {'north': 39.66666666666667, 'south': 39.333333333333336, 'west': 114.5, 'east': 115.0}}  
>> ellipsoid.MapGrid.parse('J50E004003' 或者 'J-50-14-C')
>> # {'scale': 50000, 'boundary': {'north': 39.5, 'south': 39.333333333333336, 'west': 114.5, 'east': 114.75}}  
>> ellipsoid.MapGrid.parse('J50F008005' 或者 'J-50-14-C-3')
>> # {'scale': 25000, 'boundary': {'north': 39.41666666666667, 'south': 39.333333333333336, 'west': 114.5, 'east': 114.625}}   
>> ellipsoid.MapGrid.parse('J50G015010' 或者 'J-50-14-(50)')
>> # {'scale': 10000, 'boundary': {'north': 39.416666666666664, 'south': 39.375, 'west': 114.5625, 'east': 114.625}}  
>> ellipsoid.MapGrid.parse('J50H030019' 或者 'J-50-14-(50)-c')
>> # {'scale': 5000, 'boundary': {'north': 39.395833333333336, 'south': 39.375, 'west': 114.5625, 'east': 114.59375}}  
>> ellipsoid.MapGrid.parse('J50I090055' 或者 'J-50-14-(50)-c-7')
>> # {'scale': 2000, 'boundary': {'north': 39.38194444444444, 'south': 39.375, 'west': 114.5625, 'east': 114.57291666666667}}  
>> ellipsoid.MapGrid.parse('J50J01800109' 或者 'J-50-14-(50)-c-7-3')
>> # {'scale': 1000, 'boundary': {'north': 39.37847222222222, 'south': 39.375, 'west': 114.5625, 'east': 114.56770833333333}}  
>> ellipsoid.MapGrid.parse('J50K03600217' 或者 'J-50-14-(50)-c-7-3-3')
>> # {'scale': 500, 'boundary': {'north': 39.376736111111114, 'south': 39.375, 'west': 114.5625, 'east': 114.56510416666667}}
>> ```

***MapGrid.grid***
> ```python
> @staticmethod
> def grid(
>        north: float,
>        south: float,
>        west: float,
>        east: float,
>        zoom: int = 0,
>        summary: bool = False
> ) -> Iterator
> ```
> 依据视图窗口边框范围和缩放级获取国家基本比例尺地形图分幅经纬网格线(适宜于GIS图形视窗呈现),视窗边界参数将充当经纬网线段的裁剪框  
>
> | Parameter | Type  | Description                                                                                                                                                               |
> |:----------|:------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
> | north     | float | 视窗北边界坐标(十进制纬度),定义域为:[-90 ~ +90]                                                                                                                                           |
> | south     | float | 视窗南边界坐标(十进制纬度),定义域为:[-90 ~ +90]                                                                                                                                           |
> | west      | float | 视窗西边界坐标(十进制经度),定义域为:[-180 ~ +180]                                                                                                                                         |
> | east      | float | 视窗东边界坐标(十进制经度),定义域为:[-180 ~ +180]                                                                                                                                         |
> | zoom      | int   | 缩放级,默认:0。注:缩放级对应的比例尺为:小于等于5级=1∶1000000;6级=1∶500000;7级=1∶250000;8级=1∶200000;9级=1∶100000;10级=1∶50000;11级=1∶25000;12级=1∶10000;13级=1∶5000;14级=1∶2000;15级=1∶1000;大于等于16级=1∶500 |
> | summary   | bool  | 是否仅返回概要信息,默认:False                                                                                                                                                        |
> 
> 如果summary取默认值False,将返回线段类型标识与经纬网和比例尺分母联合构成的枚举型字典迭代器(Iterator);如果summary设为True,将返回经纬线个数与经纬线步长和比例尺分母联合构成的枚举型字典迭代器(Iterator)。失败时抛出异常  
>  
> 获取经纬网信息示例:
>> ```python
>> [print(line) for line in ellipsoid.MapGrid.grid(40, 20, 80, 100, 0)]  
>> # 运行结果:
>> # {'remarks': 'longitude', 'type': 'LineString', 'coordinates': [[84.0, 20.0], [84.0, 40.0]], 'scale': 1000000}
>> # ......
>> # {'remarks': 'latitude', 'type': 'LineString', 'coordinates': [[80, 20.0], [100, 20.0]], 'scale': 1000000}
>> # ......
>> ```

*****
* ### Class Projection(builtins.object)

*****

***Projection.albers***
> ```python
> @classmethod
> def albers(
>        cls,
>        longitude: float = None,
>        latitude: float = None,
>        centralMeridian: float = 0,
>        originLatitude: float = 0,
>        parallel1: float = 20,
>        parallel2: float = 50,
>        x: float = None,
>        y: float = None,
>        crs: int = 2000
> ) -> tuple
> ```
> 阿尔伯斯球体双标准纬线等积割圆锥投影(Albers Equal Area Projection)正反算函数,优先识别地理经纬度坐标(longitude、latitude)执行正算,其次识别直角坐标(x、y)并执行反算  
>
> | Parameter       | Type  | Description                                                                |
> |:----------------|:------|:---------------------------------------------------------------------------|
> | longitude       | float | 十进制经度,定义域为:[-180 ~ +180]                                                   |
> | latitude        | float | 十进制纬度,定义域为:[-90 ~ +90]                                                     |
> | centralMeridian | float | 中央子午线经度(十进制度格式,默认值:0),定义域为:[-180 ~ +180]                                   |
> | originLatitude  | float | 底点纬度(十进制度);默认值:0,定义域为:[-90 ~ +90]                                          |
> | parallel1       | float | 第一标准纬线(十进制度);默认值:20,定义域为:[-90 ~ +90]                                       |
> | parallel2       | float | 第二标准纬线(十进制度);默认值:50,定义域为:[-90 ~ +90]                                       |
> | x               | float | 米制横坐标                                                                      |
> | y               | float | 米制纵坐标                                                                      |
> | crs             | int   | 坐标参照系年代(1954=北京坐标系;1980=西安坐标系;1984=WGS84坐标系;2000=CGCS2000坐标系,省略取默认值:2000)  |
> 
> 返回正反算结果元组(横坐标,纵坐标),失败时抛出异常

***Projection.centralMeridian***
> ```python
> @classmethod
> def centralMeridian(
>        cls,
>        longitude: float = None,
>        zone: int = None,
>        zoneCode: int = 6
> ) -> float
> ```
> 由指定的经度或者投影带带号计算所处6度或3度投影带中央子午线(经度)。如果同时指定了[longitude]和[zone]参数,将优先依据[longitude]参数计算中央子午线;如果两参数均未指定,便返回None  
>
> | Parameter      | Type  | Description                 |
> |:---------------|:------|:----------------------------|
> | longitude      | float | 经度(十进制度),定义域为:[-180 ~ +180] |
> | zone           | int   | 三度带带号(1~120)或者六度带带号(1~60)   |
> | zoneCode       | int   | 6或3,省略或无效时取默认值:6            |
> 
> 返回中央子午线(十进制度,值域为:[-180 ~ +180])。失败时抛出异常

***Projection.gaussKruger***
> ```python
> @classmethod
> def gaussKruger(
>        cls,
>        centralMeridian: float = None,
>        x: float = None,
>        y: float = None,
>        longitude: float = None,
>        latitude: float = None,
>        crs: int = 2000
> ) -> tuple
> ```
> 高斯克吕格投影正反算函数,优先识别直角坐标(x、y)执行反算,其次识别地理经纬度坐标(longitude、latitude)并执行正算  
>
> | Parameter       | Type  | Description                                                                |
> |:----------------|:------|:---------------------------------------------------------------------------|
> | centralMeridian | float | 中央子午线经度(十进制度格式,省略或空白取默认值:按六度分带自动识别)。注意:比例尺小于1万时通常采用六度分带,大于等于1万时采用三度分带      |
> | x               | float | 纵坐标(米制)指向坐标北,与真北方向相差子午收敛角                                                  |
> | y               | float | 横坐标(米制,可含带号)通用值或自然值                                                        |
> | longitude       | float | 经度(十进制度格式),定义域为:[-180 ~ +180]                                              |
> | latitude        | float | 纬度(十进制度格式),定义域为:[-90 ~ +90]                                                |
> | crs             | int   | 坐标参照系年代(1954=北京坐标系;1980=西安坐标系;1984=WGS84坐标系;2000=CGCS2000坐标系,省略取默认值:2000)  |
> 
> 返回正反算结果元组(横坐标,纵坐标)。正算时返回米制纵坐标和横坐标的(含带号)通用值;反算时返回十进制经纬度。失败时抛出异常

***Projection.lambert***
> ```python
> @classmethod
> def lambert(
>        cls,
>        longitude: float = None,
>        latitude: float = None,
>        centralMeridian: float = 0,
>        originLatitude: float = 0,
>        parallel1: float = 20,
>        parallel2: float = 50,
>        x: float = None,
>        y: float = None,
>        crs: int = 2000
> ) -> tuple
> ```
> 兰伯特双标准纬线等角割圆锥投影(Lambert Conformal Projection)正反算函数,优先识别地理经纬度坐标(longitude、latitude)执行正算,其次识别直角坐标(x、y)并执行反算  
>
> | Parameter       | Type  | Description                                                               |
> |:----------------|:------|:--------------------------------------------------------------------------|
> | longitude       | float | 十进制经度,定义域为:[-180 ~ +180]                                                  |
> | latitude        | float | 十进制纬度,定义域为:[-90 ~ +90]                                                    |
> | centralMeridian | float | 中央子午线经度(十进制度格式,默认值:0),定义域为:[-180 ~ +180]                                  |
> | originLatitude  | float | 底点纬度(十进制度);默认值:0,定义域为:[-90 ~ +90]                                         |
> | parallel1       | float | 第一标准纬线(十进制度);默认值:20,定义域为:[-90 ~ +90]                                      |
> | parallel2       | float | 第二标准纬线(十进制度);默认值:50,定义域为:[-90 ~ +90]                                      |
> | x               | float | 米制横坐标                                                                     |
> | y               | float | 米制纵坐标                                                                     |
> | crs             | int   | 坐标参照系年代(1954=北京坐标系;1980=西安坐标系;1984=WGS84坐标系;2000=CGCS2000坐标系,省略取默认值:2000) |
> 
> 返回正反算结果元组(横坐标,纵坐标)。失败时抛出异常

***Projection.webMercator***
> ```python
> @classmethod
> def webMercator(
>        cls,
>        longitude: float = None,
>        latitude: float = None,
>        x: float = None,
>        y: float = None
> ) -> tuple
> ```
> 球体墨卡托投影(WGS84坐标系)正反算函数,优先识别地理经纬度坐标(longitude、latitude)执行正算,其次识别直角坐标(x、y)并执行反算    
>
> | Parameter       | Type  | Description              |
> |:----------------|:------|:-------------------------|
> | longitude       | float | 十进制经度,定义域为:[-180 ~ +180] |
> | latitude        | float | 十进制纬度,定义域为:[-90 ~ +90]   |
> | x               | float | 米制横坐标                    |
> | y               | float | 米制纵坐标                    |
> 
> 返回正反算结果元组(横坐标,纵坐标)。失败时抛出异常

***Projection.zone***
> ```python
> @classmethod
> def zone(
>        cls,
>        longitude: float,
>        zoneCode: int = 6
> ) -> int
> ```
> 由指定经度计算六度带或者三度带带号(如果指定的经度恰好位于两个投影带的中间,便取右侧带号)  
>
> | Parameter      | Type  | Description                 |
> |:---------------|:------|:----------------------------|
> | longitude      | float | 经度(十进制度),定义域为:[-180 ~ +180] |
> | zoneCode       | int   | 6或3,省略或无效时取默认值:6            |
> 
> 返回六度或三度带带号。失败时抛出异常

***Projection.angle***
> ```python
> @staticmethod
> def angle(
>        deg: float | str = None,
>        dms: float | str = None,
>        digit: int | str = None
> ) -> float | str
> ```
> 十进制角度与六十进制度分秒转换函数,优先识别十进制角度(deg),其次识别六十进制度分秒(dms)  
>
> | Parameter | Type       | Description                                                          |
> |:----------|:-----------|:---------------------------------------------------------------------|
> | deg       | float str  | 十进制角度,定义域为:[-360 ~ +360]。如果同时指定了[deg]和[dms]参数,[deg]参数将优先识别并忽略[dms]参数 |
> | dms       | float str  | 六十进制度分秒,度的定义域为:[-360 ~ +360],格式为:十进制度、度分分秒秒、x度xx分xx秒、x°x′x.x″        |
> | digit     | float str  | 秒值的小数位(0:按四舍五入取整;大于0:按四舍五入取指定位数;忽略时取默认值:双精度最长有效位)                    |
> 
> 返回转换结果(deg -> dms 返回字符串; dms -> deg 返回浮点数值)。失败时抛出异常
> 
> 示例:
>> ```python
>> ellipsoid.Projection.angle(deg=123.456789) 
>> # 123°27′24.440400000002″
>> ellipsoid.Projection.angle(dms='123°27′24.4404″')
>> # 123.456789
>> ellipsoid.Projection.angle(dms='123度27分24.4404秒')
>> # 123.456789
>> ellipsoid.Projection.angle(dms='27分24.4404秒')
>> # 0.456789
>> ellipsoid.Projection.angle(dms='1232724.4404')
>> # 123.456789
>> ```

*****
* ### Class ProjectionHelper(Projection)

*****

***ProjectionHelper()***
> ```python
> def __init__(
>        self,
>        sourceProjection: str | int = None,
>        targetProjection: str | int = None,
>        sourceScale: int = 1,
>        targetScale: int = 1
> )  
> ```
> 实例初始化函数。如果原始与目标投影一致时变换器将设置为:None 
>
> | Parameter        | Type    | Description                                                                                   |
> |:-----------------|:--------|:----------------------------------------------------------------------------------------------|
> | sourceProjection | str int | 原始投影(支持:wkt/proj4/epsg),默认采用经纬度无投影(EPSG:4326)格式。注:此参数内容通常可采用【definition】类函数获取,如果参数不符合规定,便抛出异常 |
> | targetProjection | str int | 目标投影(支持:wkt/proj4/epsg),默认采用经纬度无投影(EPSG:4326)格式。注:此参数内容通常可采用【definition】类函数获取,如果参数不符合规定,便抛出异常 |
> | sourceScale      | int     | 原始比例尺分母(不针对地理坐标系和球体墨卡托),默认:1                                                                  |
> | targetScale      | int     | 目标比例尺分母(不针对地理坐标系和球体墨卡托),默认:1                                                                  |
> 
> 示例:
>> ```python
>> toGaussKruger = ellipsoid.ProjectionHelper(
>>         sourceProjection=4326,
>>         targetProjection=ellipsoid.ProjectionHelper.definition(projection="GaussKruger", centralMeridian=99)
>>     )  
>>   
>> fromGaussKruger = ellipsoid.ProjectionHelper(
>>         sourceProjection=ellipsoid.ProjectionHelper.definition(projection="GaussKruger", centralMeridian=99),
>>         targetProjection=4326
>>     )
>> ```

***ProjectionHelper.definition***
> ```python
> @classmethod
> def definition(
>        cls,
>        projection: str = 'GaussKruger',
>        crs: int = 2000,
>        centralMeridian: float | None = None,
>        originLatitude: float = 0.0,
>        falseEasting: float | None = None,
>        falseNorthing: float = 0.0,
>        standard_parallel_1: float = 25.0,
>        standard_parallel_2: float = 47.0
> ) -> str
> ```
> 定义投影参数。针对中国陆域采用的高斯克吕格(通用横轴墨卡托)投影、双标准纬线阿尔博斯等积或兰伯特等角割圆锥投影以及球体墨卡托投影,可依据指定的参考椭球坐标系代号、中央子午线等参数创建投影变换器所需的投影参数  
>
> | Parameter            | Type       | Description                                                                     |
> |:---------------------|:-----------|:--------------------------------------------------------------------------------|
> | projection           | str        | 投影名称;支持:'GaussKruger'(默认)、'Lambert'、'Albers'、'WebMercator'                      |
> | crs                  | int        | 坐标参照系年代(1954=北京坐标系;1980=西安坐标系;1984=WGS84坐标系;2000=CGCS2000坐标系,省略或无效时取强取默认值:2000) |
> | centralMeridian      | float None | 中央子午线经度(十进制度);针对高斯投影和墨卡托投影,默认:0;其他投影默认:105,定义域为:[-180 ~ +180]                   |
> | originLatitude       | float      | 原点纬度(十进制度);默认值:0,定义域为:[-90 ~ +90]                                               |
> | falseEasting         | float None | 横轴平移量,通常是米制自然值前缀就,针对高斯投影而言,默认:500000,通用值前面不可携带投影带号;其他投影默认:0                     |
> | falseNorthing        | float      | 纵轴平移量,米制,默认:0                                                                   |
> | standard_parallel_1  | float      | 下面第一标准纬线(如:25),定义域为:[-90 ~ +90]                                                 |
> | standard_parallel_2  | float      | 上面第二标准纬线(如:47),定义域为:[-90 ~ +90]                                                 |
> 
> 返回投影变换器所需的投影字符串(wkt格式)。失败时抛出异常  
> 
> 示例:
>> ```python
>> ellipsoid.ProjectionHelper.definition(projection="GaussKruger", centralMeridian=99)  
>> # PROJCS["GRS 1980 / Gauss-Kruger",GEOGCS["GRS 1980",DATUM["GRS_1980",SPHEROID["GRS 1980",6378137.0,298.257222101,AUTHORITY["EPSG","1024"]],AUTHORITY["EPSG","1043"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4490"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0.0],PARAMETER["central_meridian",99],PARAMETER["false_easting",500000.0],PARAMETER["false_northing",0.0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Northing",NORTH],AXIS["Easting",EAST]]  
>> ```

***ProjectionHelper实例.project***
> ```python
> def project(
>        self,
>        geometry: dict
> ) -> dict
> ```
> 坐标几何投影变换  
>
> | Parameter           | Type       | Description                                                                                                                                      |
> |:--------------------|:-----------|:-------------------------------------------------------------------------------------------------------------------------------------------------|
> | geometry            | dict       | 几何字典参数中的【type】成员为几何类型名称(Point、MultiPoint、LineString、MultiLineString、Polygon、MultiPolygon、GeometryCollection),【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> 
> 返回符合【GeoJson-geometry】格式的字典类型对象,字典中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组,失败时抛出异常 
> 
> 示例:
>> ```python
>> toGaussKruger.project({'type': 'Point', 'coordinates': [100, 36]})
>> # {'type': 'Point', 'coordinates': [590165.115456953, 3986005.1900442634]}   
>> fromGaussKruger.project({'type': 'Point', 'coordinates': [590165.115456953, 3986005.1900442634]})  
>> # {'type': 'Point', 'coordinates': [100.0, 36.0]}
>> ```

*****
* ### Class Topology(Geometry)

*****

***Topology.area***
> ```python
> @classmethod
> def area(
>        cls,
>        coordinates: str | list | dict,
>        crs: int = 2000
> ) -> dict
> ```
> 由符合【WKT/WKB、GeoJson、自由/简约文本】格式的多边形坐标串或者符合GeoJson格式的几何字典或坐标列表计算其面积、周长与边界。若整个范围位于同一个六度投影带且指定的坐标系代号属于北京或西安或国家坐标系便按高斯-克吕格投影进行计算,否则尽可能按WGS84下的球体墨卡托投影计算
>
> | Parameter   | Type          | Description                                                                                                                                                                         |
> |:------------|:--------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
> | coordinates | dict list str | 符合【WKT/WKB、GeoJson、自由/简约文本】格式的多边形坐标串或者符合GeoJson格式的几何字典或坐标列表,支持单面、母子面和多面类型。如果是列表或者字典类型,执行完成后可回馈经自动将线环封闭并剔除相邻的重复顶点后的实参结果,也强制将最大面积的环线调整到第一个索引位(充当母区),同时依据右手定则(母区为逆时针,子区为顺时针)调整多边形的旋转方向 |
> | crs         | int           | 坐标参照系年代(1954=北京坐标系;1980=西安坐标系;1984=WGS84坐标系;2000=CGCS2000坐标系,省略取默认值:2000。其他值(比如:0)将不进行投影变换并返回笛卡尔坐标系多边形面积)                                                                           |
> 
> 返回由多边形类型(Polygon/MultiPolygon)、面积(母区扣除所属子区之后的剩余面积,其量纲取决于指定的crs参数值)、周长(母区线环长度,其量纲取决于指定的crs参数值)与边界构成的字典。失败时抛出异常  
> 
> 示例:
>> ```python
>> ellipsoid.Topology.area({"type":"Polygon","coordinates":[[[0, 0], [10, 0], [10, 10], [0, 10],[0, 0]]]}, crs=0)  # 普通坐标系,多边形正常封闭
>> # {'area': 100.0, 'perimeter': 40.0, 'boundary': {'west': 0.0, 'south': 0.0, 'east': 10.0, 'north': 10.0}}  
>> 
>> polygon = {"type":"Polygon","coordinates":[[[0, 0], [10, 0], [10, 10], [10, 10], [0, 10]]]}  # 多边形存在重合点且未封闭
>> ellipsoid.Topology.area(polygon, crs=0)
>> # {'area': 100.0, 'perimeter': 40.0, 'boundary': {'west': 0.0, 'south': 0.0, 'east': 10.0, 'north': 10.0}}
>> # polygon 形参变量已自动更改为:{'type': 'Polygon', 'coordinates': [[[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]]]}  # 多边形重合点已剔除且首尾点封闭
>> 
>> ellipsoid.Topology.area({"type":"Polygon","coordinates":[[[0, 0], [10, 0], [10, 10], [0, 10],[0, 0]]]}, crs=2000) # CGCS2000坐标系
>> # {'area': 1232873617757.2869, 'perimeter': 4441466.499008763, 'boundary': {'west': 0.0, 'south': 0.0, 'east': 10.0, 'north': 10.0}}
>> ```

***Topology.buffer***
> ```python
> @classmethod
> def buffer(
>        cls,
>        geometry: dict | list | str,
>        distance: float,
>        quad_segs: int = 8,
>        cap_style: shapely.BufferCapStyle = 'round',
>        join_style: shapely.BufferJoinStyle = 'round',
>        mitre_limit: float = 5.0,
>        single_sided: bool = False
> ) -> shapely.geometry
> ```
> 利用正负缓冲距离计算指定几何体的缓冲区  
>
> | Parameter     | Type                    | Description                                                                                                 |
> |:--------------|:------------------------|:------------------------------------------------------------------------------------------------------------|
> | geometry      | dict list str           | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组 |
> | distance      | float                   | 缓冲半径是采用闵可夫斯基[和或差]用于计算两个凸包的[并或差]集                                                                            |
> | quad_segs     | int                     | 指定等分圆的弧长对应的线段数,默认值:8                                                                                        |
> | cap_style     | shapely.BufferCapStyle  | 缓冲线端点形状,支持:‘round’(默认)、‘square’、‘flat’                                                                      |
> | join_style    | shapely.BufferJoinStyle | 缓冲线中点的形状,支持:‘round’(默认)、‘square’、‘flat’                                                                     |
> | mitre_limit   | float                   | 点与缓冲顶点的位移限制,超过时将修剪“斜切”连接样式,默认值:5.0                                                                          |
> | single_sided  | bool                    | 是否仅在几何体的某一侧生成缓冲区?默认值:False                                                                                  |
> 
> 返回按指定的缓冲半径进行扩展或收缩后的几何部件,失败时抛出异常 

***Topology.build***
> ```python
> @classmethod
> def build(
>        cls,
>        coordinates: str | list | dict
> ) -> dict
> ```
> 建立拓扑关系,返回结果主要包括通常用于标注几何体的拓扑内点、最大边框范围以及面积和长度与几何类型信息。其中,获取的拓扑内点位置具有几何构图合理性:多点以距离中心位置最近为准,多线以最长线段为准,多面以最大面积的多边形为准且有效回避“湖中岛” 
>
> | Parameter    | Type                    | Description                                                                                                                                       |
> |:-------------|:------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------|
> | coordinates  | dict list str           | 符合【WKT/WKB、GeoJson、自由/简约文本】格式的多边形坐标串或者符合GeoJson格式的几何字典或坐标列表。注1:列表类型不识别【MultiPoint】和【MultiLineString】类型;注2:针对【GeometryCollection】类型的返回值是总边框和总中心位置 |
> 
> 返回由拓扑内点、拓扑边框、拓扑周长、拓扑面积、拓扑长度与几何类型等构成的字典对象。失败时抛出异常  
> 
> 示例:
>> ```python
>> ellipsoid.Topology.build({"type":"Polygon","coordinates":[[[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]]]})
>> # {'centroid': {'x': 5.0, 'y': 5.0}, 'perimeter': 40.0, 'area': 100.0, 'boundary': {'west': 0.0, 'south': 0.0, 'east': 10.0, 'north': 10.0}, 'type': 'Polygon'}
>> ``` 

***Topology.check***
> ```python
> @classmethod
> def check(
>        cls,
>        geometries: list,
>        mask: int = 31
> ) -> dict | None
> ```
> 执行拓扑检查并返回检查结果。
>
> | Parameter  | Type | Description                                                                                                                                                                                  |
> |:-----------|:-----|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
> | geometries | list | GeoJSON几何字符串或字典对象以及列表对象的列表                                                                                                                                                                   |
> | mask       | int  | 拓扑运算掩膜,暂支持的拓扑选项包括:1=00000001=Overlap-重合节点、2=00000010=DangleNode-悬挂节点、4=00000100=PseudoNode-伪节点、8=00001000=SelfIntersection-自相交节点、16=00010000=Intersection-互相交节点。省略时取默认值:31=检查所有项目;0=不检查任何项目 |
> 
> 返回拓扑检查结果字典对象,不执行拓扑检查或者未发现拓扑问题时返回None,失败时抛出异常  
> 结果模板如下:
>> ```python
>> # 点要素类返回的检查结果(重合点问题)模板  
>>   {
>>        'point': [
>>            {'flag': 'Overlap', 'type': 'Point', 'coordinates': [x, y]} 或者 {'flag': 'Overlap', 'type': 'MultiPoint', 'coordinates': [[x, y],...]}
>>        ]
>>   }
>> 
>> # 线要素类返回的检查结果(相邻重合点、自相交、互相交、悬挂节点和伪节点问题)模板  
>>   {
>>        'line': [
>>            {'flag': 'Overlap', 'type': 'Point', 'coordinates': [x, y]} 或者 {'flag': 'Overlap', 'type': 'MultiPoint', 'coordinates': [[x, y],...]}
>>            {'flag': 'SelfIntersection', 'type': 'Point', 'coordinates': [x, y]} 或者 {'flag': 'SelfIntersection', 'type': 'MultiPoint', 'coordinates': [[x, y],...]}
>>            {'flag': 'Intersection', 'type': 'Point', 'coordinates': [x, y]} 或者 {'flag': 'Intersection', 'type': 'MultiPoint', 'coordinates': [[x, y],...]}
>>            {'flag': 'DangleNode', 'type': 'Point', 'coordinates': [x, y]} 或者 {'flag': 'DangleNode', 'type': 'MultiPoint', 'coordinates': [[x, y],...]}
>>            {'flag': 'PseudoNode', 'type': 'Point', 'coordinates': [x, y]} 或者 {'flag': 'PseudoNode', 'type': 'MultiPoint', 'coordinates': [[x, y],...]}
>>        ]
>>   }
>> # 注:封闭的线要素首尾点将视为伪节点,不按自相交问题对待
>> 
>> # 面要素类返回的检查结果(相邻重合点、自相交、互相交、未封闭的悬挂节点问题)模板
>>   {
>>        'polygon': [
>>            {'flag': 'Overlap', 'type': 'Point', 'coordinates': [x, y]} 或者 {'flag': 'Overlap', 'type': 'MultiPoint', 'coordinates': [[x, y],...]}
>>            {'flag': 'SelfIntersection', 'type': 'Point', 'coordinates': [x, y]} 或者 {'flag': 'SelfIntersection', 'type': 'MultiPoint', 'coordinates': [[x, y],...]}
>>            {'flag': 'Intersection', 'type': 'Point', 'coordinates': [x, y]} 或者 {'flag': 'Intersection', 'type': 'MultiPoint', 'coordinates': [[x, y],...]}
>>            {'flag': 'DangleNode', 'type': 'Point', 'coordinates': [x, y]} 或者 {'flag': 'DangleNode', 'type': 'MultiPoint', 'coordinates': [[x, y],...]}
>>        ]
>>   }
>> ``` 
> 
> 示例:
>> ```python
>> ellipsoid.Topology.check(
>>         [
>>              {"type":"MultiPoint","coordinates":[[0, 0], [1, 1], [1, 1]]},
>>              {"type":"Polygon","coordinates":[[[0, 0], [10, 0], [10, 10], [10, 10], [0, 10]]]}
>>         ]
>>    )
>> #  {
>> #       'point': 
>> #            [
>> #                {'flag': 'Overlap', 'type': 'Point', 'coordinates': [1.0, 1.0]}
>> #            ], 
>> #       'polygon': 
>> #            [
>> #                {'flag': 'Overlap', 'type': 'Point', 'coordinates': [10, 10]}, 
>> #                {'flag': 'DangleNode', 'type': 'MultiPoint', 'coordinates': [[0.0, 0.0], [0.0, 10.0]]}
>> #            ]
>> #  }
>> ``` 

***Topology.clearance***
> ```python
> @classmethod
> def clearance(
>         cls,
>         geometry: dict | list | str
> ) -> float
> ```
> 依据指定几何中的顶点密度计算最小容差距离,此距离是指如果移动顶点便会造成几何失真   
>  
> | Parameter | Type                   | Description                                                 |
> |:----------|:-----------------------|:------------------------------------------------------------|
> | geometry  | dict list str          | 几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> 
> 返回最小容差距离,失败时抛出异常(包括无穷大、无穷小和非数值)

***Topology.clip***
> ```python
> @classmethod
> def clip(
>         cls,
>         geometry: dict | list | str,
>         west: float,
>         south: float,
>         east: float,
>         north: float
> ) -> shapely.geometry
> ```
> 利用指定的矩形边界对指定的几何进行裁剪。裁剪后的几何可能不严格符合拓扑要求
>  
> | Parameter | Type          | Description                                                                                                 |
> |:----------|:--------------|:------------------------------------------------------------------------------------------------------------|
> | geometry  | dict list str | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组 |
> | west      | float         | 西边界                                                                                                         |
> | south     | float         | 南边界                                                                                                         |
> | east      | float         | 东边界                                                                                                         |
> | north     | float         | 北边界                                                                                                         |
> 
> 返回裁剪后的几何部件,失败时抛出异常

***Topology.contains***
> ```python
> @classmethod
> def contains(
>         cls,
>         a: dict | list | str,
>         b: dict | list | str
> ) -> bool
> ```
> 判断[a]几何是否将[b]几何完全包含。注:contains(a, b) == within(b, a)
>  
> | Parameter | Type           | Description                                                                                                  |
> |:----------|:---------------|:-------------------------------------------------------------------------------------------------------------|
> | a         | dict list str  | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> | b         | dict list str  | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> 
> 返回是否包含的逻辑值,失败时抛出异常
> 
> 示例:
>> ```python
>> ellipsoid.Topology.contains(
>>     a={"type": "LineString", "coordinates": [[0, 0], [1, 1]]},
>>     b={'type': 'Point', 'coordinates': [0.5, 0.5]}
>> )
>> # True
>> ``` 

***Topology.containsPoint***
> ```python
> @classmethod
> def containsPoint(
>         cls,
>         geometry: dict | list | str,
>         longitude: float,
>         latitude: float
> ) -> bool
> ```
> 判断[geometry]几何是否包含点[longitude,latitude]几何
>  
> | Parameter | Type          | Description                                                                                                 |
> |:----------|:--------------|:------------------------------------------------------------------------------------------------------------|
> | geometry  | dict list str | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组 |
> | longitude | float         | 十进制经度,定义域为:[-180 ~ +180]                                                                                    |
> | latitude  | float         | 十进制纬度,定义域为:[-90 ~ +90]                                                                                      |
> 
> 返回是否包含的逻辑值,失败时抛出异常
> 
> 示例:
>> ```python
>> ellipsoid.Topology.containsPoint(
>>     geometry={"type": "LineString", "coordinates": [[0, 0], [1, 1]]},
>>     0.5, 0.5
>> )
>> # True
>> ``` 

***Topology.convexHull***
> ```python
> @classmethod
> def convexHull(
>         cls,
>         geometry: dict | list | str
> ) -> shapely.geometry
> ```
> 产生指定几何体的凸包几何对象
>  
> | Parameter | Type          | Description                                                                                                 |
> |:----------|:--------------|:------------------------------------------------------------------------------------------------------------|
> | geometry  | dict list str | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组 |
> 
> 返回凸包几何对象,失败时抛出异常
> 
> 示例:
>> ```python
>> ellipsoid.Topology.convexHull(
>>     {"type":"MultiPoint","coordinates":[[0, 0], [10, 0], [20, 10]]}
>> )
>> # POLYGON ((0 0, 20 10, 10 0, 0 0))
>> ``` 

***Topology.covers***
> ```python
> @classmethod
> def covers(
>         cls,
>         a: dict | list | str,
>         b: dict | list | str
> ) -> bool
> ```
> 判断[a]几何是否将[b]几何完全覆盖
>  
> | Parameter | Type           | Description                                                                                                  |
> |:----------|:---------------|:-------------------------------------------------------------------------------------------------------------|
> | a         | dict list str  | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> | b         | dict list str  | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> 
> 返回是否覆盖的逻辑值,失败时抛出异常

***Topology.crosses***
> ```python
> @classmethod
> def crosses(
>         cls,
>         a: dict | list | str,
>         b: dict | list | str
> ) -> bool
> ```
> 判断[a]几何与[b]几何在空间上是否交叉横跨
>  
> | Parameter | Type           | Description                                                                                                  |
> |:----------|:---------------|:-------------------------------------------------------------------------------------------------------------|
> | a         | dict list str  | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> | b         | dict list str  | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> 
> 返回是否交叉横跨的逻辑值,失败时抛出异常
> 
> 示例:
>> ```python
>> ellipsoid.Topology.crosses(
>>     {"type": "LineString", "coordinates": [[0, 0], [1, 1]]},
>>     {"type": "LineString", "coordinates": [[0, 1], [1, 0]]}
>> )
>> # True
>> ``` 

***Topology.difference***
> ```python
> @classmethod
> def difference(
>         cls,
>         a: dict | list | str,
>         b: dict | list | str
> ) -> shapely.geometry
> ```
> 获取[a]几何中与[b]几何不同的几何部件
>  
> | Parameter | Type           | Description                                                                                                  |
> |:----------|:---------------|:-------------------------------------------------------------------------------------------------------------|
> | a         | dict list str  | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> | b         | dict list str  | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> 
> 返回差异化几何部件,失败时抛出异常
> 
> 示例:
>> ```python
>> ellipsoid.Topology.difference(
>>     {"type": "LineString", "coordinates": [[0, 0], [1, 1]]},
>>     {"type": "LineString", "coordinates": [[0, 1], [1, 0]]}
>> )
>> # MULTILINESTRING ((0 0, 0.5 0.5), (0.5 0.5, 1 1))
>> ``` 

***Topology.distanceOnLine***
> ```python
> @classmethod
> def distanceOnLine(
>         cls,
>         line: dict | list | str,
>         point: dict | list | str
> ) -> float
> ```
> 返回从线起点出发沿线要素至指定点的距离,如果点不在线上,将返回无效数值
>  
> | Parameter | Type           | Description                                                                                                     |
> |:----------|:---------------|:----------------------------------------------------------------------------------------------------------------|
> | line      | dict list str  | 线要素,GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组 |
> | point     | dict list str  | 点要素,GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组 |
> 
> 返回线上点距起点的距离,失败时抛出异常
> 
> 示例:
>> ```python
>> ellipsoid.Topology.distanceOnLine(
>>     {"type": "LineString", "coordinates": [[0, 0], [1, 1]]},
>>     {"type": "Point", "coordinates": [0.5, 0.5]}
>> )
>> # 0.7071067811865476
>> ``` 

***Topology.equals***
> ```python
> @classmethod
> def equals(
>         cls,
>         a: dict | list | str,
>         b: dict | list | str
> ) -> bool
> ```
> 判断[a]几何是否与[b]几何视觉效果一致
>  
> | Parameter | Type           | Description                                                                                                  |
> |:----------|:---------------|:-------------------------------------------------------------------------------------------------------------|
> | a         | dict list str  | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> | b         | dict list str  | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> 
> 返回视觉效果是否一致的逻辑值,失败时抛出异常

***Topology.equal***
> ```python
> @classmethod
> def equal(
>         cls,
>         a: dict | list | str,
>         b: dict | list | str
> ) -> bool
> ```
> 判断[a]几何是否与[b]几何严格一致
>  
> | Parameter | Type           | Description                                                                                                  |
> |:----------|:---------------|:-------------------------------------------------------------------------------------------------------------|
> | a         | dict list str  | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> | b         | dict list str  | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> 
> 返回是否一致的逻辑值,失败时抛出异常

***Topology.intersection***
> ```python
> @classmethod
> def intersection(
>         cls,
>         a: dict | list | str,
>         b: dict | list | str
> ) -> shapely.geometry
> ```
> 获取[a]几何与[b]几何的交点几何
>  
> | Parameter | Type           | Description                                                                                                  |
> |:----------|:---------------|:-------------------------------------------------------------------------------------------------------------|
> | a         | dict list str  | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> | b         | dict list str  | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> 
> 返回返回交点几何,如果不相交返回None。失败时抛出异常
> 
> 示例:
>> ```python
>> ellipsoid.Topology.intersection(
>>     '0 0,10 0,10 10,0 10,0 0',  # 线要素自由格式
>>     '5 5,15 5,15 15,5 15,5 5'   # 线要素自由格式
>> )
>> # MULTIPOINT (5 10, 10 5)
>> ``` 

***Topology.intersections***
> ```python
> @classmethod
> def intersections(
>        cls,
>        geometries: list
> ) -> shapely.geometry
> ```
> 获取[geometries]几何列表中的所有几何部件的交点
>
> | Parameter  | Type | Description                 |
> |:-----------|:-----|:----------------------------|
> | geometries | list | GeoJSON几何字符串或字典对象以及列表对象的列表  |
> 
> 返回交点几何,失败时抛出异常

***Topology.intersects***
> ```python
> @classmethod
> def intersects(
>         cls,
>         a: dict | list | str,
>         b: dict | list | str
> ) -> bool
> ```
> 判断[a]几何与[b]几何在空间上是否相交(包括:叠加、接壤、包含)。注:disjoint(A, B) == ~intersects(A, B)
>  
> | Parameter | Type           | Description                                                                                                  |
> |:----------|:---------------|:-------------------------------------------------------------------------------------------------------------|
> | a         | dict list str  | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> | b         | dict list str  | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> 
> 返回是否相交的逻辑值,失败时抛出异常
> 
> 示例:
>> ```python
>> ellipsoid.Topology.intersects(
>>     {"type": "LineString", "coordinates": [[0, 0], [1, 1]]},
>>     {"type": "LineString", "coordinates": [[0, 1], [1, 0]]}
>> )
>> # True
>> ``` 

***Topology.intersectsPoint***
> ```python
> @classmethod
> def intersectsPoint(
>         cls,
>         geometry: dict | list | str,
>         longitude: float,
>         latitude: float
> ) -> bool
> ```
> 判断[geometry]几何是否与点[longitude,latitude]几何相交
>  
> | Parameter | Type          | Description                                                                                                 |
> |:----------|:--------------|:------------------------------------------------------------------------------------------------------------|
> | geometry  | dict list str | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组 |
> | longitude | float         | 十进制经度,定义域为:[-180 ~ +180]                                                                                    |
> | latitude  | float         | 十进制纬度,定义域为:[-90 ~ +90]                                                                                      |
> 
> 返回是否相交的逻辑值,失败时抛出异常

***Topology.length***
> ```python
> @classmethod
> def length(
>        cls,
>        coordinates: str | list | dict,
>        crs: int = 2000
> ) -> dict
> ```
> 由符合【WKT/WKB、GeoJson、自由/简约文本】格式的折线坐标串或者符合GeoJson格式的几何字典或坐标列表计算其长度(或周长)及边界。若连续的两个顶点位于同一个投影带且指定的坐标系代号属于北京或西安或国家坐标系便按高斯-克吕格投影进行计算,不在同一个投影带按椭球计算曲线长度
>
> | Parameter   | Type          | Description                                                                                                    |
> |:------------|:--------------|:---------------------------------------------------------------------------------------------------------------|
> | coordinates | dict list str | 符合【WKT/WKB、GeoJson、自由/简约文本】格式的折线坐标串或者符合GeoJson格式的几何字典或坐标列表,支持单线、多线或者单面类型。如果是列表或者字典类型,执行完成后可回馈经剔除相邻的重复顶点后的实参结果  |
> | crs         | int           | 坐标参照系年代(1954=北京坐标系;1980=西安坐标系;1984=WGS84坐标系;2000=CGCS2000坐标系,省略取默认值:2000。其他值(比如:0)将不进行投影变换并返回笛卡尔坐标系多边形面积)      |
> 
> 返回长度与边界构成的字典,长度量纲取决于指定的crs参数值,多线类型返回所有折线的累计长度,若计算周长应确保折线为封闭线环。失败时抛出异常 
> 
> 示例:
>> ```python
>> ellipsoid.Topology.length(coordinates={"type": "LineString", "coordinates": [[0, 0], [10, 0], [10, 10]]}, crs=0)
>> # {'length': 20.0, 'boundary': {'west': 0.0, 'south': 0.0, 'east': 10.0, 'north': 10.0}}
>> 
>> ellipsoid.Topology.length(coordinates={"type": "LineString", "coordinates": [[0, 0], [10, 0], [10, 10]]}, crs=2000)
>> # {'length': 2219217.1822485896, 'boundary': {'west': 0.0, 'south': 0.0, 'east': 10.0, 'north': 10.0}}
>> ```

***Topology.overlaps***
> ```python
> @classmethod
> def overlaps(
>         cls,
>         a: dict | list | str,
>         b: dict | list | str
> ) -> bool
> ```
> 判断[a]几何与[b]几何在空间上是否重叠(重叠是指部分重合,如果完全重合就称为相等)
>  
> | Parameter | Type           | Description                                                                                                  |
> |:----------|:---------------|:-------------------------------------------------------------------------------------------------------------|
> | a         | dict list str  | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> | b         | dict list str  | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> 
> 返回是否重叠的逻辑值,失败时抛出异常

***Topology.pointOnLine***
> ```python
> @classmethod
> def pointOnLine(
>         cls,
>         line: dict | list | str,
>         distance: float
> ) -> shapely.geometry.point
> ```
> 返回从线起点出发沿线要素至指定点的距离,如果点不在线上,将返回无效数值
>  
> | Parameter | Type          | Description                                                                                                     |
> |:----------|:--------------|:----------------------------------------------------------------------------------------------------------------|
> | line      | dict list str | 线要素,GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组 |
> | distance  | float         | 距起点或末点的距离,正值从起点开始,负值从末点开始,超出范围将取边界值                                                                             |
> 
> 返回插值点,失败时抛出异常
> 
> 示例:
>> ```python
>> ellipsoid.Topology.pointOnLine(
>>     {"type": "LineString", "coordinates": [[0, 0], [10, 0], [10, 10]]},
>>     12
>> )
>> # POINT (10 2)
>> ``` 

***Topology.rectangle***
> ```python
> @classmethod
> def rectangle(
>         cls,
>         geometry: dict | list | str
> ) -> shapely.geometry
> ```
> 生成包含指定几何体的最小倾斜矩形几何部件
>  
> | Parameter | Type          | Description                                                                                                 |
> |:----------|:--------------|:------------------------------------------------------------------------------------------------------------|
> | geometry  | dict list str | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组 |
> 
> 返回最小倾斜矩形几何部件,失败时抛出异常

***Topology.relate***
> ```python
> @classmethod
> def relate(
>         cls,
>         a: dict | list | str,
>         b: dict | list | str
> ) -> str
> ```
> 生成两几何体的“内部,边界,外部”三者构成的空间关系模型(Dimensionally Extended 9-Intersection Model - DE9IM) 的(3×3)矩阵表示形式。  
> 采用维度表示相交(重合)部分的数值(0=点;1=线;2=面;-1=无)并形成3×3矩阵:  
>   ①②③  
>   ④⑤⑥  
>   ⑦⑧⑨  
> 返回的字符串是空间关系谓词矩阵中①~⑨的值(T=True、F=False),占位符说明如下:  
>   T = 相交部分维度为 0、1、2  
>   F = 相交部分维度 < 0  
>   \* = 相交部分维度为任意值  
>   0 = 相交部分维度为 0  
>   1 = 相交部分维度为 1  
>   2 = 相交部分维度为 2  
> 例如:  
>   Equals    -> T\*F\*\*FFF*  
>   Disjoint  -> FF\*FF****  
>   Contains  -> T*****FF*  
>  
> | Parameter | Type           | Description                                                                                                  |
> |:----------|:---------------|:-------------------------------------------------------------------------------------------------------------|
> | a         | dict list str  | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> | b         | dict list str  | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> 
> 返回两几何体的“内部,边界,外部”三者构成的空间关系模型(3×3)矩阵字符串,失败时抛出异常
> 
> 示例:
>> ```python
>> ellipsoid.Topology.relate(
>>     {"type": "LineString", "coordinates": [[0, 0], [10, 10]]},
>>     {"type": "LineString", "coordinates": [[10, 0], [0, 10]]}
>> )
>> # 0F1FF0102
>> ``` 

***Topology.repair***
> ```python
> @classmethod
> def repair(
>         cls,
>         geometry: dict | list | str
> ) -> shapely.geometry
> ```
> 修复几何要素
>  
> | Parameter | Type          | Description                                                                                                 |
> |:----------|:--------------|:------------------------------------------------------------------------------------------------------------|
> | geometry  | dict list str | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组 |
> 
> 返回修复后的几何部件,失败时抛出异常
> 
> 示例:
>> ```python
>> ellipsoid.Topology.repair(
>>     '0 0,10 0,10 0,10 10,0 0'  # 自由格式的线要素,存在重叠点问题
>> )
>> # LINESTRING (0 0, 10 0, 10 10, 0 0)
>> ```

***Topology.shortest***
> ```python
> @classmethod
> def shortest(
>         cls,
>         a: dict | list | str,
>         b: dict | list | str
> ) -> shapely.geometry
> ```
> 生成两个几何要素之间的最短线段,此线段从a至b由两个端点构成
>  
> | Parameter | Type           | Description                                                                                                  |
> |:----------|:---------------|:-------------------------------------------------------------------------------------------------------------|
> | a         | dict list str  | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> | b         | dict list str  | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> 
> 返回的最短几何部件(LineString类型)是由两个端点构成的线段,失败时抛出异常
> 
> 示例:
>> ```python
>> ellipsoid.Topology.shortest(
>>     {'type': 'Point', 'coordinates': [0, 0]},
>>     {'coordinates': [[10, 0], [0, 10]], 'type': 'LineString'}
>> )
>> # LINESTRING (0 0, 5 5)
>> ``` 

***Topology.similarity***
> ```python
> @classmethod
> def similarity(
>         cls,
>         a: dict | list | str,
>         b: dict | list | str,
>         densify: float = None
> ) -> float
> ```
> 计算两个几何要素之间的相似度,此值为a中的任意点与b中的最近点之间距离的最大值
>  
> | Parameter | Type          | Description                                                                                                 |
> |:----------|:--------------|:------------------------------------------------------------------------------------------------------------|
> | a         | dict list str | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组 |
> | b         | dict list str | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组 |
> | densify   | float         | 采样密度值,介于[0 1]之间,省略时取默认值:None                                                                                |
> 
> 返回相似度,失败时抛出异常

***Topology.simplify***
> ```python
> @classmethod
> def simplify(
>         cls,
>         geometry: dict | list | str,
>         tolerance: float,
>         preserveTopology: bool = True
> ) -> shapely.geometry
> ```
> 几何抽稀(采用 Douglas-Peucker 算法)
>  
> | Parameter           | Type          | Description                                                                                                     |
> |:--------------------|:--------------|:----------------------------------------------------------------------------------------------------------------|
> | geometry            | dict list str | 线要素,GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组 |
> | tolerance           | float         | 允许的最大几何体移位容差(该值越大顶点数就越少)                                                                                        |
> | preserveTopology    | bool          | 是否避免创建无效的几何图形(耗时检查折叠、线环相交等),默认值:True                                                                            |
> 
> 返回按指定的容差抽稀后的几何部件,失败时抛出异常

***Topology.snap***
> ```python
> @classmethod
> def snap(
>         cls,
>         geometry: dict | list | str,
>         reference: dict | list | str,
>         tolerance: float
> ) -> shapely.geometry
> ```
> 将指定的几何体捕捉到参考几何体的顶点。第一个几何体的顶点将捕捉到第二个几何体顶点并返回新的几何体。如果未发生捕捉,则返回的输入几何图形将保持不变。容差用于控制捕捉的吸附位置,调用方应负责检查和处理因捕捉过多可能会导致创建无效的几何图形
>  
> | Parameter  | Type          | Description                                                                                                 |
> |:-----------|:--------------|:------------------------------------------------------------------------------------------------------------|
> | geometry   | dict list str | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组 |
> | reference  | dict list str | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组 |
> | tolerance  | float         | 允许的最大几何体移位容差(该值越大顶点数就越少)                                                                                    |
> 
> 返回按指定的容差向参考几何靠近后的几何部件,失败时抛出异常

***Topology.touches***
> ```python
> @classmethod
> def touches(
>         cls,
>         a: dict | list | str,
>         b: dict | list | str
> ) -> bool
> ```
> 判断[a]几何与[b]几何在空间上是否接触(两几何的边界存在部分重叠现象,亦即存在公共点或者公共边)
>  
> | Parameter | Type           | Description                                                                                                  |
> |:----------|:---------------|:-------------------------------------------------------------------------------------------------------------|
> | a         | dict list str  | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> | b         | dict list str  | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> 
> 返回是否接触的逻辑值,失败时抛出异常

***Topology.triangulate***
> ```python
> @classmethod
> def triangulate(
>         cls,
>         geometry: dict | list | str,
>         tolerance: float = 0.0,
>         edges: bool = False
> ) -> list
> ```
> 依据指定几何体的所有顶点生成德勒内三角几何(Delaunay triangulation)多边形部件
>  
> | Parameter | Type          | Description                                                                                                 |
> |:----------|:--------------|:------------------------------------------------------------------------------------------------------------|
> | geometry  | dict list str | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组 |
> | tolerance | float         | 捕捉容差用于提高三角剖分计算的稳健性,如果不进行捕捉可取默认值:0.0                                                                         |
> | edges     | bool          | 如果设为默认值:False,将返回多边形三角形列表,否则返回边界线列表                                                                         |
> 
> 返回德勒内三角几何多边形部件列表,失败时抛出异常

***Topology.unions***
> ```python
> @classmethod
> def unions(
>         cls,
>         geometries: list,
>         gridSize: float = None,
>         axis: int = None
> ) -> shapely.geometry
> ```
> 获取[geometries]几何列表中的所有几何归并后的几何部件(可充当自动剪断线、多边形拆分等功能)
>  
> | Parameter  | Type  | Description                            |
> |:-----------|:------|:---------------------------------------|
> | geometries | list  | GeoJSON几何字符串或字典对象以及列表对象类型列表            |
> | gridSize   | float | 网格化融合精度(默认取最高精度),省略时取默认值:None          |
> | axis       | int   | 执行操作的轴,默认在所有轴上执行操作并返回标量值,省略时取默认值:None  |
> 
> 返回归并后的几何部件,无结果时返回None,失败时抛出异常
> 
> 示例:
>> ```python
>> ellipsoid.Topology.unions(
>>     ['0 0,10 0,0 10,10 10,0 0']  # 自由格式线要素数组
>> )
>> # MULTILINESTRING ((0 0, 10 0, 5 5), (5 5, 0 10, 10 10, 5 5), (5 5, 0 0))
>> ``` 

***Topology.union***
> ```python
> @classmethod
> def union(
>         cls,
>         a: dict | list | str,
>         b: dict | list | str
> ) -> shapely.geometry
> ```
> 获取[a]几何与[b]几何合并后的几何部件
>  
> | Parameter | Type           | Description                                                                                                  |
> |:----------|:---------------|:-------------------------------------------------------------------------------------------------------------|
> | a         | dict list str  | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> | b         | dict list str  | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组  |
> 
> 返回合并后的几何部件,失败时抛出异常

***Topology.voronoiDiagram***
> ```python
> @classmethod
> def voronoiDiagram(
>         cls,
>         geometry: dict | list | str,
>         envelope: shapely.geometry = None,
>         tolerance: float = 0.0,
>         edges: bool = False
> ) -> list
> ```
> 利用指定几何体的顶点构造沃罗诺伊图(泰森多边形部件)
>  
> | Parameter | Type             | Description                                                                                                 |
> |:----------|:-----------------|:------------------------------------------------------------------------------------------------------------|
> | geometry  | dict list str    | GeoJSON几何字符串或字典对象以及列表对象,还可支持[shapely.geometry]格式,几何字典参数中的【type】成员为几何类型名称,【coordinates】成员为符合GeoJson格式的几何坐标数组 |
> | envelope  | shapely.geometry | 用于将结果进行裁剪的几何封套,默认值:None                                                                                     |
> | tolerance | float            | 设置用于提高计算稳健性的捕捉容差值,默认值:0.0=不进行捕捉                                                                             |
> | edges     | bool             | 如果设为默认值:False,将返回多边形三角形列表,否则返回边界线列表                                                                         |
> 
> 返回沃罗诺伊图(泰森多边形部件列表),失败时抛出异常

*****
* ### Class Astronomy(builtins.object)  

*****

***Astronomy.UTCtoJulian***  
> ```python  
> @staticmethod  
> def UTCtoJulian(  
>     year: int | str | tuple | datetime = 1970,  
>     month: int = 1,  
>     day: int = 1,  
>     hour: int = 0,  
>     minute: int = 0,  
>     second: float = 0.0  
> ) -> float
> ```
> 天文纪年(UTC公历-年月日时分秒)转儒略日。  
> 注1:UTC是协调世界时(Coordinated Universal Time)的缩写,以前也被称为格林威治标准时间(GMT)  
> 注2:UTC公历1970年1月1日00时00分00秒,相当于北京时间1970年1月1日08时00分00秒,其儒略日数为2440587.5  
>
> | Parameter           | Type                   | Description                                                                     |
> |:--------------------|:-----------------------|:--------------------------------------------------------------------------------|
> | year                | int str tuple datetime | 年,省略时取默认值:1970。注:此参数可为(年,月,日,时,分,秒)构成的元组或为UTC公历datetime类型对象,若符合要求便忽略后续参数,否则抛出异常 |
> | month               | int                    | 月,省略时取默认值:1                                                                     |
> | day                 | int                    | 日,省略时取默认值:1                                                                     |
> | hour                | int                    | 时,省略时取默认值:0                                                                     |
> | minute              | int                    | 分,省略时取默认值:0                                                                     |
> | second              | float                  | 秒,省略时取默认值:0.0                                                                   |
> 
> 返回儒略日(从公元前4713年1月1日正午12点起算的累积天数),失败时抛出异常
> 
> 示例:
>> ```python
>> ellipsoid.Astronomy.UTCtoJulian(
>>     1970, 1, 1, 0, 0, 0
>> )
>> ellipsoid.Astronomy.UTCtoJulian(
>>     (1970, 1, 1, 0, 0, 0)
>> )
>> ellipsoid.Astronomy.UTCtoJulian(  
>>     '1970-1-1T0:00:00+00:00'  
>> )   
>> ellipsoid.Astronomy.UTCtoJulian(  
>>     datetime(1970, 1, 1, 0, 0, 0, tzinfo=pytz.timezone('UTC'))
>> )
>> # 2440587.5  
>> ```

*****

***Astronomy.JulianToUTC***  
> ```python  
> @staticmethod  
> def JulianToUTC(  
>     julian: float = 2440587.5
> ) -> datetime
> ```
> 儒略日转天文纪年(UTC公历)
>
> | Parameter | Type   | Description                                         |
> |:----------|:-------|:----------------------------------------------------|
> | julian    | float  | 儒略日,省略时取默认值:2440587.5(UTC公历1970年1月1日00时00分00秒的儒略日)  |
> 
> 返回天文纪年(UTC公历)
> 
> 示例:
>> ```python
>> ellipsoid.Astronomy.JulianToUTC(
>>     2440587.5
>> )
>> # 1970-01-01 00:00:00+00:00  
>> ```

*****

***Astronomy.sun***  
> ```python  
> @classmethod   
> def sun(  
>     cls,  
>     longitude: float,  
>     latitude: float,  
>     elevation: float = 0.0,  
>     year: int | None = 1970,  
>     month: int | None = 1,  
>     day: int | None = 1,  
>     hour: int | None = 0,  
>     minute: int | None = 0,  
>     second: float | None = 0.0  
> ) -> dict  
> ```
> 依据地理位置和UTC公历(协调世界时)计算太阳相位(真北方位角、水平面仰俯角、日出日落时间戳等)
>
> | Parameter | Type       | Description                                                              |
> |:----------|:-----------|:-------------------------------------------------------------------------|
> | longitude | float      | 十进制经度,定义域为:[-180 ~ +180]                                                 |
> | latitude  | float      | 十进制纬度,定义域为:[-90 ~ +90]                                                   |
> | elevation | float      | 海拔高度(米制),定义域为:[-10000 ~ +10000],省略时取默认值:0.0                              |
> | year      | int None   | 年(1 ~ 9999),省略时取默认值:1970;若设为None,便取当前年份(UTC公历)                           |
> | month     | int None   | 月(1 ~ 12),省略时取默认值:1;若设为None,便取当前月份(UTC公历)                                |
> | day       | int None   | 日(1 ~ 31),省略时取默认值:1;;若设为None,便取当前时间(UTC公历)                               |
> | hour      | int None   | 时(0 ~ 23),省略时取默认值:0;若设为None,便取当前时间(UTC公历)                                |
> | minute    | int None   | 分(0 ~ 59),省略时取默认值:0;若设为None,便取当前时间(UTC公历)                                |
> | second    | float None | 秒(浮点型:0 ~ 59 / 60 / 61)(其中,60或61表示闰秒),省略时取默认值:0.0;若设为None,便取当前时间(UTC公历)  |
> 
> 返回太阳相位字典对象。失败时抛出异常
>  
> 示例: 
>> ```python  
>> ellipsoid.Astronomy.sun(  
>>     101.75232400194169, 36.61087110483754, 2222,  
>>     2024, 7, 22, 4, 0, 0  # 相当于北京时间:2024年7月22日12时0分0秒  
>> )  
>> # {  
>> #     'Body': 'Sun',  
>> #     'TimeStamp': {  
>> #         'UTC': '2024-07-22 04:00:00.000000+00:00',  
>> #         'ServerDateTime': '2024-07-22 12:00:00.000000+08:00',  
>> #         'ServerTimeZone': '中国标准时间'  
>> #     },  
>> #     'Location': {
>> #         'Longitude': 101.75232400194169,
>> #         'Latitude': 36.61087110483754,
>> #         'Elevation': 2222
>> #     },
>> #     'Azimuth': 127.74113964795328,  # 方位角(十进制度),自真北方向顺时针旋转
>> #     'Altitude': 66.12070428489565,  # 仰俯角(十进制度),自水平面之上为正仰角,反之为负俯角
>> #     'Distance': 149598000,  # 视距(KM)
>> #     'Phase': {
>> #         'midnight': '2024-07-21 17:20:33.406157+00:00',  # 午夜
>> #         'nightEnd': '2024-07-21 20:16:13.217144+00:00',  # 拂晓
>> #         'nauticalDawn': '2024-07-21 20:56:43.765055+00:00',  # 黎明开始
>> #         'dawn': '2024-07-21 21:33:26.242346+00:00',  # 黎明结束
>> #         'sunrise': '2024-07-21 22:03:09.763230+00:00',  # 日出开始
>> #         'sunriseEnd': '2024-07-21 22:06:09.262196+00:00',  # 日出结束
>> #         'morning': '2024-07-21 22:40:41.599416+00:00',  # 上午
>> #         'noon': '2024-07-22 05:20:33.406157+00:00',  # 中午
>> #         'evening': '2024-07-22 12:00:25.212898+00:00',  # 下午
>> #         'sunsetStart': '2024-07-22 12:34:57.550119+00:00',  # 日落开始
>> #         'sunset': '2024-07-22 12:37:57.049085+00:00',  # 日落结束
>> #         'dusk': '2024-07-22 13:07:40.569968+00:00',  # 黄昏开始
>> #         'nauticalDusk': '2024-07-22 13:44:23.047260+00:00',  # 黄昏结束
>> #         'night': '2024-07-22 14:24:53.595170+00:00'  # 夜晚
>> #     }
>> # }
>> ```

*****

***Astronomy.moon***  
> ```python  
> @classmethod   
> def moon(  
>     cls,  
>     longitude: float,  
>     latitude: float,  
>     elevation: float = 0.0,  
>     year: int | None = 1970,  
>     month: int | None = 1,  
>     day: int | None = 1,  
>     hour: int | None = 0,  
>     minute: int | None = 0,  
>     second: float | None = 0.0  
> ) -> dict  
> ```
> 依据地理位置和UTC公历(协调世界时)计算月亮相位
>
> | Parameter | Type       | Description                                                              |
> |:----------|:-----------|:-------------------------------------------------------------------------|
> | longitude | float      | 十进制经度,定义域为:[-180 ~ +180]                                                 |
> | latitude  | float      | 十进制纬度,定义域为:[-90 ~ +90]                                                   |
> | elevation | float      | 海拔高度(米制),定义域为:[-10000 ~ +10000],省略时取默认值:0.0                              |
> | year      | int None   | 年(1 ~ 9999),省略时取默认值:1970;若设为None,便取当前年份(UTC公历)                           |
> | month     | int None   | 月(1 ~ 12),省略时取默认值:1;若设为None,便取当前月份(UTC公历)                                |
> | day       | int None   | 日(1 ~ 31),省略时取默认值:1;;若设为None,便取当前时间(UTC公历)                               |
> | hour      | int None   | 时(0 ~ 23),省略时取默认值:0;若设为None,便取当前时间(UTC公历)                                |
> | minute    | int None   | 分(0 ~ 59),省略时取默认值:0;若设为None,便取当前时间(UTC公历)                                |
> | second    | float None | 秒(浮点型:0 ~ 59 / 60 / 61)(其中,60或61表示闰秒),省略时取默认值:0.0;若设为None,便取当前时间(UTC公历)  |
> 
> 返回月亮相位字典对象。失败时抛出异常
>  
> 示例: 
>> ```python  
>> ellipsoid.Astronomy.moon(  
>>     101.75232400194169, 36.61087110483754, 2222,
>>     2024, 7, 22, 14, 0, 0  # 相当于北京时间:2024年7月22日22时0分0秒
>> )  
>> # {
>> #     'Body': 'Moon',
>> #     'TimeStamp': {
>> #         'UTC': '2024-07-22 14:00:00+00:00',
>> #         'ServerDateTime': '2024-07-22 22:00:00+08:00',
>> #         'ServerTimeZone': '中国标准时间'
>> #     },
>> #     'Location': {
>> #         'Longitude': 101.75232400194169,
>> #         'Latitude': 36.61087110483754,
>> #         'Elevation': 2222
>> #     },
>> #     'Azimuth': 120.79256273582314,  # 方位角(十进制度),自真北方向顺时针旋转
>> #     'Altitude': 5.8997720191911736,  # 仰俯角(十进制度),自水平面之上为正仰角,反之为负俯角
>> #     'Distance': 369969.80133619666,  # 视距(KM)
>> #     'Phase': {
>> #         'parallacticAngle': -47.37708070122644,  # 视差角
>> #         'fraction': 0.9833872391333955,  # 充盈度:0.0=新月 1.0=满月
>> #         'phaseName': '残月',  # 朔日 上峨嵋月 上弦月 凸月 满月 残月 下弦月 下峨嵋月 晦日
>> #         'angle': 88.17110226541216,  # 北偏角
>> #         'Rise': '2024-07-23 13:58:53.804315+00:00',  # 月升
>> #         'Set': '2024-07-22 23:49:05.982344+00:00',  # 月落
>> #         'AlwaysUp': False,  # 月显
>> #         'AlwaysDown': False  # 月隐
>> #     }
>> # }
>> ```

*****

***Astronomy.geostationarySatellite***  
> ```python  
> @classmethod   
> def geostationarySatellite(  
>     cls,  
>     longitude: float,  
>     latitude: float,  
>     elevation: float = 0.0,  
>     satelliteLongitude: float = 140.0
> ) -> dict  
> ```
> 依据地面点位置(经度、纬度和海拔高度)以及地球同步卫星经度,计算卫星的真北方位角、仰角和视距
>
> | Parameter           | Type     | Description                                 |
> |:--------------------|:---------|:--------------------------------------------|
> | longitude           | float    | 十进制经度,定义域为:[-180 ~ +180]                    |
> | latitude            | float    | 十进制纬度,定义域为:[-90 ~ +90]                      |
> | elevation           | float    | 海拔高度(米制),定义域为:[-10000 ~ +10000],省略时取默认值:0.0 |
> | satelliteLongitude  | float    | 卫星经度,定义域为:[-180 ~ +180],省略时取默认值:140.0       |
> 
> 返回由卫星的真北方位角、仰角和视距构成的字典对象。失败时抛出异常
>  
> 示例: 
>> ```python  
>> ellipsoid.Astronomy.geostationarySatellite(  
>>     101.75232400194169, 36.61087110483754, 2222,
>>     140.0
>> )  
>> # {
>> #     'Body': 'Geostationary Satellite',
>> #     'Location': {
>> #         'Longitude': 101.75232400194169,
>> #         'Latitude': 36.61087110483754,
>> #         'Elevation': 2222
>> #     },
>> #     'Satellite Longitude': 140.0,
>> #     'Azimuth': 127.2003766284867,  # 方位角(十进制度),自真北方向顺时针旋转
>> #     'Altitude': 31.575385865111475,  # 仰俯角(十进制度),自水平面之上为正仰角,之下为负俯角
>> #     'Distance': 38447.30012331335  # 视距(KM)
>> # }
>> ```

*****
## License  
[MIT](https://choosealicense.com/licenses/mit/)  

## Contributing  
Contributions are always welcome!  

## Authors  
© GeoWheel Studio 2024 @ Xiong'an China 

## Support  
For support, email flylyisflying@gmail.com or join our Community Discussion Channel.  

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "ellipsoid",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "geometry, geojson, gml, kml, topology, projection, mapgrid, astronomy",
    "author": "GeoWheel Studio",
    "author_email": "flylyisflying@gmail.com",
    "download_url": null,
    "platform": null,
    "description": "<table>\n  <tr style=\"border-style: none;\">\n    <td style=\"border-style: none;\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" xml:space=\"preserve\" width=\"100\" height=\"100\" version=\"1.1\" style=\"shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd\"\nviewBox=\"0 0 2315 2315\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <g id=\"geowheel\">\n  <metadata id=\"geowheel-Layer\"/>\n  <path style=\"fill:#CB7D31\" d=\"M209.13 1279.25l26.75 -39.64c11.21,-17.81 16.25,-22.97 43.89,-64.99 8.35,-12.7 29.37,-44.06 38.09,-56.82l43.3 -61.51 55.38 -75.6 42.12 -55.05 36.95 -47.15 -492.14 2.55c0,164.31 81.21,309.7 205.66,398.21z\"/>\n  <path style=\"fill:#0078D7\" d=\"M1130.68 1857.49l-30.56 20.45 -43.04 25.92 -40.52 24.37 -54.64 29.74 -51.29 27.87 -43.49 20.07 -39.02 18.95 -34.56 15.61 -39.03 16.73 -31.36 10.03 -32.86 6.97 -29.17 4.86 -30.79 3.24 -38.8 2.92 -34.12 -1.29 -36.47 -5.68 -26.73 -8.1 -21.88 -9.72 -24.31 -13.78 -21.06 -17.82 -14.59 -14.59 -14.58 -21.06 -11.35 -20.26 -11.39 -27.02 -8.62 -31.27 -4.58 -28.69 -1.67 -34.84 0.57 -30.27 1.57 -26.78 3.2 -24.59 3.1 -22.6 6.48 -29.98 8.91 -29.98 18.45 -50.82 12.87 -31.63 12.15 -26.03 11.35 -25.36 10.81 -26.59 18.64 -45.37 18.63 -43.75 19.77 -41.87 20.34 -43.45 27.58 -51.4 32.25 -58.56 40.08 -68.84 33.77 -52.92 40.41 -64.02 34.55 -53.24 29.6 -44.83 36.6 -52.49 34.75 -45.65 31.6 -39.95 29.69 -34.55 33.57 -37.06 38.69 -40.84 33.69 -36.83 34.03 -33.22 32.41 -30.79 31.41 -29.59 39.28 -33.89 32.5 -28.69 35.37 -30.18 34.13 -28.27 38.23 -29.41 34.59 -28.2 47.8 -34.85 47.81 -31.6 39.7 -25.11 32.7 -20.59 33.46 -19.44 34.93 -18.44 35.84 -20.5 36.94 -19.36 38.04 -17.01 36.41 -15.88 32.03 -13.01 41.71 -16.44 36.07 -11.11 35.65 -8.91 38.09 -7.29 38.89 -5.67 36.74 -1.62 33.75 -0.81 30.79 1.62 27.55 4.86 28.6 7.86 24.87 9.96 19.45 10.54 21.07 15.39 17.01 17.83 14.38 22.03 9.93 20.1 7.29 21.07 7.29 29.17 2.43 17.01 0.81 28.36 -0.81 27.55 -1.83 27.08 -5.26 35.9 -7.96 32.81 -8.36 28.31 -10.25 28.84 -10.66 28.82 -9.98 24.4 -9.19 21.46 -9.69 22.79 -6.19 13.76 33.03 -51.89 -14.79 33.74 18.75 -22.68 19.26 -25.32 16.29 -23.12 14.95 -27.73 13.68 -28.48 11.29 -32.83 10.15 -31.17 8.53 -30.28 8.07 -34.33 4.78 -33.47 3.2 -35.89 0.69 -33.51 -2.07 -29.82 -5.67 -31.6 -7.48 -24.03 -10.34 -23.77 -12.97 -22.69 -17.06 -19.53 -21.02 -17.49 -22.69 -15.4 -20.89 -9.92 -26.78 -9.73 -26.4 -6.48 -25.59 -4.18 -30.79 -3.37 -31.89 -2.46 -31.1 -0.81 -30.94 0.53 -34.7 1.58 -28.7 3.15 -26.17 2.72 -29.21 4.11 -33.07 6.38 -29.7 6.89 -32.84 8.02 -29.98 7.66 -27.12 7.82 -34.03 9.72 -28.27 9.73 -27.64 10.53 -30.65 11.87 -29.3 11.63 -32.94 14.01 -31.07 14.35 -30.85 14.78 -25.87 12.76 -29.17 14.59 -29.98 15.39 -31.6 16.21 -28.36 17.01 -30.79 17.02 -28.36 17.01 -32.6 19.12 -27.36 18.16 -34.03 21.87 -38.08 26.74 -30.74 21.88 -26.79 19.44 -28.85 21.44 -29.36 25.56 -25.77 21.83 -19.58 17.19 -22.02 20.13 -25.32 21.79 -20.87 19.53 -29.17 25.93 -31.6 28.36 -29.98 27.54 -30.98 29.28 -26.23 24.81 -32.6 32.11 -30.7 34.25 -24.52 28.18 -27.07 29.5 -28.12 31.73 -26.75 29.76 -24.32 27.21 -30.91 39.45 -27.27 34.27 -25.92 33.75 -27.21 35.99 -25.51 35.35 -22.83 33.62 -23.01 33.89 -24.96 38.57 -20.13 30.42 -28.79 44.3 -25.77 41.59 -26.33 46.95 -26.54 47.38 -26.21 51.39 -22.9 48.39 -19.86 50.29 -19.95 47.71 -17.22 43.81 -17.17 47.76 -10.58 41.23 -9.67 38.98 -9.22 40.46 -6.99 35.71 -6.48 34.03 -4.86 31.6 -4.86 35.65c0,0 -3.24,25.12 -3.24,29.17 0,4.05 -1.62,38.89 -1.62,38.89l0 17.82 1.62 29.98 4.05 34.03 5.62 24.03 9.41 26.94 11.71 26.82 14.58 29.98 15.7 23.13 16.58 19.52 18.48 16.85 22.16 15.85 23.34 12.89 25.28 8.99 26.74 8.1 25.11 6.48 26.74 4.86 31.6 3.24 30.3 1.01 24.9 -0.04 24.48 -2.87 27.8 -3.58 28.96 -5.36 35.94 -6.71 32.88 -8.63 34.3 -10.89 34.45 -12.39 36.32 -13.73 35.6 -14.53 34.89 -14.64 36.61 -15.16 35.56 -18.59 37.06 -21.44 37.56 -22.63 38.71 -25.63 31.54 -21.84 38.71 -27.89 41.61 -29.13 41.43 -27.15 44.94 -30.89 44.27 -34.15 25.6 -23.68 22.45 -23.19 23.91 -29.23 21.78 -30.2 23.91 -36.19 -45.15 32.33 -37.44 25.34z\"/>\n  <polygon style=\"fill:#CB7D31\" points=\"567.35,1345.25 623.59,1345.95 671.15,1344.93 743.21,1344.93 785.56,1344.93 816.5,1345.86 836.7,1347.32 857.99,1350.44 877.25,1356.19 895.97,1363.42 916.24,1373.46 934.9,1385.12 950.49,1395.48 968.4,1408.6 984.11,1422 998.56,1435.52 1009.18,1447.45 1019.97,1460.48 1027.57,1473.89 1034.88,1487.96 1040.38,1500.2 1045.22,1514.04 1048.63,1528.72 1051.5,1543.23 1053.62,1557.77 1054.93,1573.22 1055.69,1591.55 1056.73,1620.55 1056.73,1671.07 1056.73,1765.42 1057.47,1890.24 1055.98,1942.98 1143.65,1941.5 1216.45,1942.98 1285.55,1941.5 1616.15,1942.24 1616.15,1347.16 1974.23,1344.97 1981.63,1344.36 1988.64,1343.55 1997.71,1341.84 2005.58,1339.42 2012.64,1337.26 2027.64,1331.37 2038.92,1325.99 2050.24,1320.28 2063.72,1313.4 2078.44,1305.52 2090.68,1298.11 2105.05,1289.14 2118.03,1278.75 2131.38,1267.39 2144.81,1256.11 2159.1,1241.64 2173.59,1223.72 2187.46,1205.26 2210.4,1171.73 2229.81,1137.65 2246.49,1103.7 2260.95,1068.52 2272.23,1038.36 2281.81,1006.9 2295.93,957.12 2304.84,916.51 2311.53,880.6 1842.74,879.11 1373.21,879.86 857.62,879.86 830.81,916.6 805.89,952.63 782.58,986.39 757.62,1024.3 735.11,1059.6 714.24,1091.17 691.87,1125.56 667.52,1165.4 643.58,1206.42 616.7,1252.68 592.53,1297.76 \"/>\n </g>\n</svg>\n    </td>\n    <td style=\"border-style: none;color: #47709e; font-weight: bold; font-size: 36px;\">\n      geowheel.ellipsoid / Python\n    </td>\n  </tr>\n</table>\n\n***\n\n\u53c2\u8003\u692d\u7403\u4f53\u57fa\u7840\u8f6f\u4ef6\u5305\u3002\u4e3b\u8981\u5305\u62ec\uff1a  \n* **Geometry-\u51e0\u4f55\u8981\u7d20\u7c7b**  \n    \u652f\u6301\u5730\u5b66\u5b9e\u4f53\u51e0\u4f55\u8981\u7d20\u52a0\u8f7d\u3001\u7f16\u7801\u3001\u8f6c\u6362\u3001\u53d8\u6362\u4e0e\u5e8f\u5217\u5316\uff0c\u51e0\u4f55\u8981\u7d20\u4e3b\u4f53\u91c7\u7528{Python-dict}\u7c7b\u578b\u5b58\u50a8\u5e76\u7b26\u5408{GeoJson-geometry}\u683c\u5f0f\u8981\u6c42\u3002  \n    \u652f\u6301\u7684\u51e0\u4f55\u683c\u5f0f\u5982\u4e0b\uff1a    \n    > + **GeoJSON** - A format for encoding a variety of geographic data structures. RFC 7946 was published in August 2016 and is the new standard specification of the GeoJSON format.\n    > + **WKT** - ISO 19162:2015(E) - Well-known Text (WKT) offers a compact machine- and human-readable representation of geometric objects.\n    > + **WKB** - The well-known binary (WKB) representation for OGC geometry provides a portable representation of a geometry value as a contiguous stream of bytes.\n    > + **GML** - ISO 19136:2007 - The Geography Markup Language (GML) is an XML grammar for expressing geographical features.\n    > + **KML** - An XML language focused on geographic visualization, including annotation of maps and images. Geographic visualization includes not only the presentation of graphical data on the globe, but also the control of the user\u2019s navigation in the sense of where to go and where to look.\n    > + **Shapely** - A Python package for set-theoretic analysis and manipulation of planar features using functions from the well known and widely deployed GEOS library.\n    > + **GDAL/OGR** - A vector geospatial geometric data formats based on Geospatial Data Abstraction Library (GDAL/OGR).\n    \n    \u652f\u6301\u7684\u51e0\u4f55\u7c7b\u578b\u5982\u4e0b\uff1a  \n    > + **Point** - A geometry type that represents a single coordinate with x,y and possibly z,m values.\n    > + **LineString** - A geometry type composed of one or more line segments.\n    > + **Polygon** - A geometry type representing an area that is enclosed by a linear ring.\n    > + **MultiPoint** - A collection of one or more Points.\n    > + **MultiLineString** - A collection of one or more LineStrings.\n    > + **MultiPolygon** - A collection of one or more Polygons.\n    > + **GeometryCollection** - A collection of one or more geometries that may contain more than one type of geometry.\n* **Topology-\u51e0\u4f55\u8981\u7d20\u62d3\u6251\u7c7b**  \n    > \u652f\u6301\u62d3\u6251\u521b\u5efa\u3001\u62d3\u6251\u68c0\u67e5\u3001\u9762\u79ef\u4e0e\u957f\u5ea6\u8ba1\u7b97\u548c\u8bf8\u591a\u7a7a\u95f4\u8fd0\u7b97\u529f\u80fd\u3002  \n* **MapGrid-\u56fd\u9645\u6807\u51c6\u6bd4\u4f8b\u5c3a\u56fe\u5e45\u5206\u5e45\u7f51\u683c\u4e0e\u7f16\u53f7\u7c7b**  \n    > + \u652f\u6301\u6bd4\u4f8b\u5c3a\uff1a1\u22361000000\u30011\u2236500000\u30011\u2236250000\u30011\u2236200000\uff08\u975e\u56fd\u9645\u6807\u51c6\uff09\u30011\u2236100000\u30011\u223650000\u30011\u223625000\u30011\u223610000\u30011\u22365000\u30011\u22362000\u30011\u22361000\u30011\u2236500\u3002      \n    > + \u7b97\u6cd5\u4f9d\u636e\u300a\u4e2d\u534e\u4eba\u6c11\u5171\u548c\u56fd\u56fd\u5bb6\u6807\u51c6 GB/T 13989-2012 \u56fd\u5bb6\u57fa\u672c\u6bd4\u4f8b\u5c3a\u5730\u5f62\u56fe\u5206\u5e45\u548c\u7f16\u53f7\u300b\uff082012-06-29\u53d1\u5e03 2012-10-01\u5b9e\u65bd\uff09  \n* **Projection-\u51e0\u4f55\u8981\u7d20\u5750\u6807\u6295\u5f71\u53d8\u6362\u7c7b**  \n    > \u652f\u6301\u9ad8\u65af-\u514b\u5415\u683c\u3001\u7403\u4f53\u58a8\u5361\u6258\u3001\u963f\u5c14\u52c3\u65af\u3001\u5170\u4f2f\u7279\u6295\u5f71\u6b63\u53cd\u7b97\u3002  \n* **ProjectionHelper-\u51e0\u4f55\u8981\u7d20\u5750\u6807\u6295\u5f71\u52a9\u624b\u7c7b**  \n    > \u652f\u6301\u9ad8\u65af-\u514b\u5415\u683c\u3001\u7403\u4f53\u58a8\u5361\u6258\u3001\u963f\u5c14\u52c3\u65af\u3001\u5170\u4f2f\u7279\u7b49\u6295\u5f71\u6b63\u53cd\u7b97\u3002  \n    \u7528\u6cd5\u793a\u4f8b\uff1a  \n  > ```python\n  >   >>> import geowheel.ellipsoid as ellipsoid\n  >   >>> print(\n  >       ellipsoid.ProjectionHelper(\n  >           targetProjection=ellipsoid.ProjectionHelper.definition(projection=\"GaussKruger\", centralMeridian=99)\n  >       ).project(\n  >           {'type': 'Point', 'coordinates': [100, 36]}\n  >       )\n  >   )\n  >   # {'type': 'Point', 'coordinates': [590165.115456953, 3986005.1900442634]}\n  >   >>> print(\n  >       ellipsoid.ProjectionHelper(\n  >           targetProjection=ellipsoid.ProjectionHelper.definition(projection=\"GaussKruger\", centralMeridian=99)\n  >       ).project(\n  >           {\"type\":\"MultiPoint\",\"coordinates\":[[98.52, 19.61], [100.22, 20.74], [100.97, 21.46]]}\n  >       )\n  >   )\n  >   # {'type': 'MultiPoint', 'coordinates': [[449646.39107651, 2169263.3152799467], [627069.4918831721, 2294770.010626876], [704217.241296021, 2375292.866543003]]}\n  >   >>> print(\n  >       ellipsoid.ProjectionHelper(\n  >           targetProjection=ellipsoid.ProjectionHelper.definition(projection=\"GaussKruger\", centralMeridian=99)\n  >       ).project(\n  >           {\"type\":\"LineString\",\"coordinates\": [[98.919, 44.4074], [98.923, 44.4075]]}\n  >       )\n  >   )\n  >  # {'type': 'LineString', 'coordinates': [[493547.9177849664, 4919094.308987056], [493866.54958314006, 4919105.113591565]]}\n  >   >>> print(\n  >       ellipsoid.ProjectionHelper(\n  >           targetProjection=ellipsoid.ProjectionHelper.definition(projection=\"GaussKruger\", centralMeridian=99)\n  >       ).project(\n  >           {\"type\": \"GeometryCollection\",\"geometries\":[{\"type\": \"Point\", \"coordinates\": [98.81, 37.24]},{\"type\":\"LineString\",\"coordinates\": [[98.919, 44.4074], [98.923, 44.4075]]},{\"type\":\"Polygon\",\"coordinates\":[[[99.38, 57.322], [100.43, 19.15], [100.194, 20.28], [99.38, 57.322]]]}]}\n  >       )\n  >   )\n  >   # {'type': 'GeometryCollection', 'geometries': [{'type': 'Point', 'coordinates': [483141.07726688863, 4123163.065100722]}, {'type': 'LineString', 'coordinates': [[493547.9177849664, 4919094.308987056], [493866.54958314006, 4919105.113591565]]}, {'type': 'Polygon', 'coordinates': [[[522893.54108479613, 6355836.594960719], [650444.4843643629, 2118888.025401517], [624733.1105818641, 2243814.468236219], [522893.54108479613, 6355836.594960719]]]}]}\n  > ```   \n* **Astronomy-\u5929\u6587\u5bfb\u661f\u8ba1\u7b97\u7c7b**  \n    > \u652f\u6301\u592a\u9633\u3001\u6708\u7403\u548c\u9759\u6b62\u8f68\u9053\u5730\u7403\u540c\u6b65\u536b\u661f\u57fa\u4e8e\u5730\u7403\u53c2\u7167\u7cfb\u7684\u76f8\u4f4d\u53c2\u6570\u8ba1\u7b97\u3002  \n\n## Installation  \n> Install geowheel.ellipsoid project with pip\n> \n> ### Windows\n> ```bash\n>   python -m pip install --upgrade ellipsoid \n> ```\n> ### Linux\n> ```bash\n>   python3 -m pip install --upgrade ellipsoid\n> ```\n> ### MacOS\n> ```bash\n>   python3 -m pip install --upgrade ellipsoid\n> ```\n\n## Usage/Examples\n\n```python\n>>> import geowheel.ellipsoid as ellipsoid\n>>> print(\n    ellipsoid.Topology.check(\n        [\n            {\n                \"type\": \"Polygon\",\n                \"coordinates\": [[[0, 0], [10, 0], [10, 10], [10, 0], [0, 0]]]\n            }\n        ],\n        0b1111\n    )\n)\n# {'polygon': [{'flag': 'SelfIntersection', 'type': 'Point', 'coordinates': [10.0, 0.0]}]}\n```\n\n## API Reference\n\n### Get help on module geowheel.ellipsoid\n\n```python\n>>> help(ellipsoid)\n```\n\n* ### Class Geometry(builtins.object) \n\n*****\n\n***Geometry.dumps***\n> ```python\n> @classmethod\n> def dumps(\n>        cls,\n>        geometry: dict | list | str,\n>        format: str = 'json'\n> ) -> str  \n> ```\n> \u5c06\u3010GeoJson-geometry\u3011\u51e0\u4f55\u5b57\u5178\u5bf9\u8c61\u5e8f\u5217\u5316\u8f6c\u50a8\u4e3a\u6307\u5b9a\u683c\u5f0f\u7684\u5b57\u7b26\u4e32  \n>\n> | Parameter | Type          | Description|\n> |:----------|:--------------|:-----------|\n> | geometry  | dict list str | \u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4|\n> | format    | str           | \u6307\u5b9a\u7684\u51e0\u4f55\u683c\u5f0f\uff0c\u652f\u6301\uff1a\"json/geojson\"\uff08\u9ed8\u8ba4\uff09\u3001\"wkt/wkb\"\u3001\"gml\"\u3001\"kml\"|\n> \n> \u8fd4\u56de\u7b26\u5408\u6307\u5b9a\u683c\u5f0f\u8981\u6c42\u7684\u5b57\u7b26\u4e32\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38  \n\n***Geometry.fromGml***\n> ```python\n> @classmethod\n> def fromGml(\n>         cls,\n>         geometry: str | etree._Element\n> ) -> dict\n> ```\n> \u5c06GML-V3.2\u51e0\u4f55\u5b57\u7b26\u4e32\u8f6c\u6362\u4e3a\u3010GeoJson-geometry\u3011\u51e0\u4f55\u5b57\u5178\u7c7b\u578b \n>\n> | Parameter | Type               | Description    |\n> |:----------|:-------------------|:---------------|\n> | geometry  | str etree._Element | GML-V3.2\u51e0\u4f55\u5b57\u7b26\u4e32  |\n> \n> \u8fd4\u56de\u3010GeoJson-geometry\u3011\u683c\u5f0f\u7684\u5b57\u5178\u7c7b\u578b\u5bf9\u8c61\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Geometry.fromKml***\n> ```python\n> @classmethod\n> def fromKml(\n>         cls,\n>         geometry: str | etree._Element\n> ) -> dict\n> ```\n> \u5c06KML\u51e0\u4f55\u5143\u7d20\uff08\u652f\u6301\uff1aPoint\u3001LineString\u3001Polygon\u3001MultiGeometry\u3001Track\uff09\u5b57\u7b26\u4e32\u6216\u8005XML\u51e0\u4f55\u5bf9\u8c61\u8f6c\u6362\u4e3a\u3010GeoJson-geometry\u3011\u683c\u5f0f\u7684\u5b57\u5178\u7c7b\u578b\u5bf9\u8c61\n>\n> | Parameter | Type               | Description    |\n> |:----------|:-------------------|:---------------|\n> | geometry  | str etree._Element | KML\u51e0\u4f55\u5143\u7d20\u5b57\u7b26\u4e32\u6216\u8005XML\u51e0\u4f55\u5bf9\u8c61  |\n> \n> \u8fd4\u56de\u3010GeoJson-geometry\u3011\u683c\u5f0f\u7684\u5b57\u5178\u7c7b\u578b\u5bf9\u8c61\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Geometry.fromOgr***\n> ```python\n> @classmethod\n> def fromOgr(\n>         cls,\n>         geometry: ogr.Geometry\n> ) -> dict\n> ```\n> \u5c06\u3010ogr.Geometry\u3011\u51e0\u4f55\u5bf9\u8c61\u8f6c\u6362\u4e3a\u3010GeoJson-geometry\u3011\u683c\u5f0f\u7684\u5b57\u5178\u7c7b\u578b\u5bf9\u8c61\n>\n> | Parameter | Type          | Description    |\n> |:----------|:--------------|:---------------|\n> | geometry  | ogr.Geometry  | \u3010ogr.Geometry\u3011\u51e0\u4f55\u5bf9\u8c61  |\n> \n> \u8fd4\u56de\u3010GeoJson-geometry\u3011\u683c\u5f0f\u7684\u5b57\u5178\u7c7b\u578b\u5bf9\u8c61\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Geometry.fromShapely***\n> ```python\n> @classmethod\n> def fromShapely(\n>         cls,\n>         geometry: shapely.geometry\n> ) -> dict\n> ```\n> \u5c06shapely\u51e0\u4f55\u5bf9\u8c61\u8f6c\u6362\u4e3a\u3010GeoJson-geometry\u3011\u683c\u5f0f\u7684\u5b57\u5178\u7c7b\u578b\u5bf9\u8c61\n>\n> | Parameter | Type               | Description              |\n> |:----------|:-------------------|:-------------------------|\n> | geometry  | shapely.geometry   | shapely\u683c\u5f0f\u51e0\u4f55\uff08geometry\uff09\u5bf9\u8c61  |\n> \n> \u8fd4\u56de\u7b26\u5408\u3010GeoJson-geometry\u3011\u683c\u5f0f\u7684\u5b57\u5178\u7c7b\u578b\u5bf9\u8c61\uff0c\u5b57\u5178\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Geometry.getXY***\n> ```python\n> @classmethod\n> def getXY(\n>         cls,\n>         geometry: dict | list | str,\n>         endpoint: bool = True  \n> ) -> list\n> ```\n> \u63d0\u53d6\u6307\u5b9a\u51e0\u4f55\u4f53\u7684\u9876\u70b9\uff08\u6216\u7aef\u70b9\uff09\u5750\u6807\u5e76\u8fd4\u56de\u53ef\u54c8\u5e0c\u7684\u5750\u6807\u5143\u7ec4\u5217\u8868\n>\n> | Parameter | Type          | Description                                                                                                  |\n> |:----------|:--------------|:-------------------------------------------------------------------------------------------------------------|\n> | geometry  | dict list str | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> | endpoint | bool          | \u662f\u5426\u4ec5\u63d0\u53d6\u7aef\u70b9\uff1f\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1aTrue\u3002\u6ce8\uff1a\u6b64\u9009\u9879\u4ec5\u9488\u5bf9\u7ebf\u8981\u7d20\u548c\u9762\u8981\u7d20\u6709\u6548 |\n> \n> \u8fd4\u56de\u5750\u6807\u5143\u7ec4\u5217\u8868\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Geometry.loads***\n> ```python\n> @classmethod\n> def loads(\n>         cls,\n>         coordinates: str | list | dict,\n>         code: int | None = -1\n> ) -> dict\n> ```\n> \u7531\u7b26\u5408\u3010WKT/WKB\u3001GeoJson\u3001\u81ea\u7531/\u7b80\u7ea6\u6587\u672c\u3011\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u4e32\u6216\u8005\u7b26\u5408\u3010GeoJson-geometry\u3011\u683c\u5f0f\u7684\u5217\u8868\u53ca\u5b57\u5178\u5bf9\u8c61\u4e43\u81f3\u3010shapely.geometry\u3011\u5bf9\u8c61\u53cd\u5e8f\u5217\u5316\u8f6c\u6362\u4e3a\u7b26\u5408\u3010GeoJson-geometry\u3011\u683c\u5f0f\u7684\u5b57\u5178\u7c7b\u578b\u5bf9\u8c61\u3002  \n> - \u6ce81\uff1a\u9488\u5bf9\u7ebf\u548c\u9762\u8981\u7d20\uff0c\u5c06\u81ea\u52a8\u5254\u9664\u76f8\u90bb\u91cd\u590d\u70b9\uff0c\u9762\u8981\u7d20\u7684\u7ebf\u73af\u5c06\u81ea\u52a8\u5c01\u95ed\u3002  \n> - \u6ce82\uff1a\u9488\u5bf9\u9876\u70b9\u5750\u6807\uff0c\u8981\u6c42\u81f3\u5c11\u662f\u4e8c\u7ef4\uff0c\u4e14\u524d\u4e24\u4e2a\u7ef4\u5ea6\u5e94\u4e3a\u6d6e\u70b9\u6570\u503c\uff0c\u4e3a\u63d0\u5347\u666e\u9002\u5ea6\uff0c\u4e0d\u5bf9\u6d6e\u70b9\u578b[x y]\u7684\u5b9a\u4e49\u57df\u8fdb\u884c\u7ea6\u675f\u3002  \n> - \u6ce83\uff1a\u9488\u5bf9WKB\u5341\u516d\u8fdb\u5236\u6587\u672c\u7c7b\u578b\u4e0eGeometryCollection\u96c6\u5408\u8981\u7d20\u683c\u5f0f\uff0c\u5c06\u6309\u5b9e\u9645\u5185\u5bb9\u89e3\u7801\uff0c\u65e0\u9700\u6307\u5b9a[code]\u53c2\u6570\u3002  \n> - \u6ce84\uff1a\u5982\u679cGeoJson\u4ee5\u6587\u672c\u65b9\u5f0f\u8f93\u5165\uff0c\u5176\u4e2d\u7684\u5bf9\u8c61\u540d\u5fc5\u987b\u91c7\u7528\u53cc\u5f15\u53f7\u5c01\u95ed\u3002  \n>\n> | Parameter   | Type          | Description                                                                                                                     |\n> |:------------|:--------------|:--------------------------------------------------------------------------------------------------------------------------------|\n> | coordinates | str list dict | \u51e0\u4f55\u5750\u6807\u53c2\u6570\uff08\u4e0d\u591a\u4e8e4\u7ef4[x y z m]\u4e14\u8981\u6c42\u524d2\u7ef4[x y]\u4e3a\u6d6e\u70b9\u578b\uff09\u3002\u5176\u4e2d\uff0cGeoJson\u683c\u5f0f\u9700\u5177\u6709[\u65b9\u62ec\u53f7]\u6807\u8bc6\uff0cWKT\u683c\u5f0f\u9700\u5177\u6709(\u5706\u62ec\u53f7)\u6807\u8bc6\uff0c\u81ea\u7531\u683c\u5f0f\u4ec5\u8bc6\u522b\u3010\u5355\u70b9/\u5355\u7ebf/\u5355\u9762\u3011\u51e0\u4f55\u7c7b\u578b                              |\n> | code        | int None      | \u51e0\u4f55\u7c7b\u578b\u4ee3\u7801\uff1a-1=\u81ea\u8bc6\u522b\uff08\u9ed8\u8ba4\u503c\uff09\u30010=\u5355\u70b9/\u591a\u70b9\u30011=\u5355\u7ebf/\u591a\u7ebf\u30012=\u5355\u9762\u6216\u6bcd\u5b50\u9762/\u591a\u9762\u3002\u6ce8\uff1a\u6b64\u53c2\u6570\u901a\u5e38\u4ec5\u5f53\u8f93\u5165\u7684\u5750\u6807\u4e3a\u7b80\u7ea6\u683c\u5f0f\u4e14\u671f\u671b\u683c\u5f0f\u4e3a[\u591a\u70b9/\u591a\u7ebf]\u65f6\u9700\u6307\u5b9a\u4e3a[0/1]\uff0c\u6216\u8005\u5f53\u8f93\u5165\u7684\u5750\u6807\u4e3a\u81ea\u7531\u683c\u5f0f\u65f6\u4e5f\u5e94\u6307\u5b9a\u4e3a[0/1/2]\uff0c\u4ee5\u4fbf\u6d88\u9664\u4e8c\u4e49\u6027\u95ee\u9898  |\n> \n> \u8fd4\u56de\u7b26\u5408\u3010GeoJson-geometry\u3011\u683c\u5f0f\u7684\u5b57\u5178\u7c7b\u578b\u5bf9\u8c61\uff0c\u5b57\u5178\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u6d6e\u70b9\u578b\u51e0\u4f55\u5750\u6807\u6570\u7ec4\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n> \n> - coordinates \u53c2\u6570\u683c\u5f0f\u8bf4\u660e  \n>  - \u81ea\u7531\u6587\u672c\u683c\u5f0f\uff08\u4ec5\u652f\u63012\u7ef4\uff09  \n>     - Point\uff1acode\u53c2\u6570\u53ef\u4e3a[0]\u6216\u8005[-1]  \n>              'x y'  \n>              'x,y'  \n>     - LineString\uff1acode\u53c2\u6570\u53ef\u4e3a[1]\u6216\u8005[-1]\uff0c\u82e5code\u6307\u5b9a\u4e3a0\uff0c\u4fbf\u89c6\u4e3a\u591a\u70b9[MultiPoint]  \n>              'x y,x y,...'  \n>              'x,y x,y ...'  \n>     - Polygon\uff1acode\u53c2\u6570\u5fc5\u987b\u6307\u5b9a\u4e3a[2]\u65b9\u53ef\u89c6\u4e3a\u5355\u9762[Polygon]\uff0c\u82e5code\u6307\u5b9a\u4e3a0\uff0c\u4fbf\u89c6\u4e3a\u591a\u70b9[MultiPoint]\uff0c\u82e5code\u6307\u5b9a\u4e3a1\uff0c\u4fbf\u89c6\u4e3a\u5355\u7ebf[LineString]  \n>              'x y,x y,x y,x y,...'  \n>              'x,y x,y x,y x,y ...'  \n>  - GeoJson  \n>    - Point\uff1a  \n>         [x,y,z,m]  # \u7b80\u7ea6\u683c\u5f0f  \n>         {\"type\":\"Point\",\"coordinates\":[x,y,z,m]}  \n>    - MultiPoint\uff1a  \n>         [[x,y,z,m],[x,y,z,m],...]  # \u7b80\u7ea6\u683c\u5f0f  \n>         {\"type\":\"MultiPoint\",\"coordinates\":[[x,y,z,m],[x,y,z,m],...]}  \n>    - LineString\uff1a  \n>         [[x,y,z,m],[x,y,z,m],[x,y,z,m],[x,y,z,m],...]  # \u7b80\u7ea6\u683c\u5f0f  \n>         {\"type\":\"LineString\",\"coordinates\":[[x,y,z,m],[x,y,z,m],[x,y,z,m],[x,y,z,m],...]}  \n>    - MultiLineString\uff1a  \n>         [[[x,y,z,m],[x,y,z,m],[x,y,z,m]],[[x,y,z,m],[x,y,z,m],[x,y,z,m],...],...]  # \u7b80\u7ea6\u683c\u5f0f  \n>         {\"type\":\"MultiLineString\",\"coordinates\":[[[x,y,z,m],[x,y,z,m],[x,y,z,m]],[[x,y,z,m],[x,y,z,m],[x,y,z,m],...],...]}  \n>    - Polygon\uff08\u5355\u9762\u6216\u6bcd\u5b50\u9762\uff09\uff1a    \n>         [[[x,y,z,m],[x,y,z,m],[x,y,z,m],[x,y,z,m],[x,y,z,m],...],...]  # \u7b80\u7ea6\u683c\u5f0f  \n>         {\"type\":\"Polygon\",\"coordinates\":[[[x,y,z,m],[x,y,z,m],[x,y,z,m],[x,y,z,m],[x,y,z,m],...],...]}  \n>    - MultiPolygon\uff1a  \n>         [[[[x,y,z,m],[x,y,z,m],[x,y,z,m],[x,y,z,m],[x,y,z,m],...],...],...]  # \u7b80\u7ea6\u683c\u5f0f  \n>         {\"type\":\"MultiPolygon\",\"coordinates\":[[[[x,y,z,m],[x,y,z,m],[x,y,z,m],[x,y,z,m],[x,y,z,m],...],...],...]}  \n>    - GeometryCollection\uff1a  \n>         {'type': 'GeometryCollection', 'geometries': [{\"type\":\"Point\",\"coordinates\":[x,y,z,m]}, {\"type\":\"LineString\",\"coordinates\":[[x,y,z,m],[x,y,z,m],[x,y,z,m],[x,y,z,m],...]}, {\"type\":\"Polygon\",\"coordinates\":[[[x,y,z,m],[x,y,z,m],[x,y,z,m],[x,y,z,m],[x,y,z,m],...],...]}]}  \n>   - WKT\uff08Well-Known Text \u91c7\u7528\u6587\u672c\u5b57\u7b26\u4e32\u5b58\u50a8\uff09    \n>     - Point\uff1a  \n>         (x y z m)  # \u7b80\u7ea6\u683c\u5f0f  \n>         POINT(x y z m)  \n>     - MultiPoint\uff1a  \n>         (x y z m,x y z m,...)  # \u7b80\u7ea6\u683c\u5f0f  \n>         MULTIPOINT(x y z m,x y z m,...)  \n>     - LineString\uff1a  \n>         (x y z m,x y z m,...)  # \u7b80\u7ea6\u683c\u5f0f  \n>         LINESTRING(x y z m,x y z m,...)  \n>     - MultiLineString\uff1a  \n>         ((x y z m,x y z m,...),...)  # \u7b80\u7ea6\u683c\u5f0f  \n>         MULTILINESTRING((x y z m,x y z m,...),...)  \n>     - Polygon\uff08\u5355\u9762\u6216\u6bcd\u5b50\u9762\uff09\uff1a  \n>         ((x y z m,x y z m,...),...)  # \u7b80\u7ea6\u683c\u5f0f  \n>         POLYGON((x y z m,x y z m,...),...)  \n>     - MultiPolygon\uff1a  \n>         (((x y z m,x y z m,...),...),...)  \n>         MULTIPOLYGON(((x y z m,x y z m,...),...),...)  \n>     - GEOMETRYCOLLECTION\uff08\u4e0d\u652f\u6301\u7b80\u7ea6\u683c\u5f0f\uff09\uff1a  \n>         GEOMETRYCOLLECTION(POINT(x y z m), LINESTRING(x y z m,x y z m,...), POLYGON((x y z m,x y z m,...),...))  \n>   - WKB\uff08Well-known Binary \u91c7\u7528\u5341\u516d\u8fdb\u5236\u5b57\u8282\u4e32\u5b58\u50a8\uff09  \n>     b\"??...\"  # \u7531\u8bf8\u591a[00\uff5eFF]\u6784\u6210\u7684\u5b57\u8282\u4e32   \n>   \n> \n> - \u81ea\u7531\u6587\u672c\u683c\u5f0f\u793a\u4f8b\n> ```python\n> # Point\n> >>> ellipsoid.Geometry.loads('120,38', -1 or 0)   \n> >>> ellipsoid.Geometry.loads('120 38', -1 or 0)   \n> # {'type': 'Point', 'coordinates': [120, 38]}\n> ``` \n> ```python\n> # MultiPoint\n> >>> ellipsoid.Geometry.loads('120 38,122 39,99 28,120 38', 0)   \n> >>> ellipsoid.Geometry.loads('120,38 122,39 99,28 120,38', 0)  \n> # {'type': 'MultiPoint', 'coordinates': [[120, 38], [122, 39], [99, 28], [120, 38]]}  \n> ``` \n> ```python\n> # LineString\n> >>> ellipsoid.Geometry.loads('120 38,122 39,99 28,120 38', -1 or 1)   \n> >>> ellipsoid.Geometry.loads('120,38 122,39 99,28 120,38', -1 or 1)  \n> # {'type': 'LineString', 'coordinates': [[120, 38], [122, 39], [99, 28], [120, 38]]}  \n> ```  \n> ```python\n> # Polygon\n> >>> ellipsoid.Geometry.loads('120 38,122 39,99 28,120 38', 2)    \n> >>> ellipsoid.Geometry.loads('120,38 122,39 99,28 120,38', 2)   \n> # {'type': 'Polygon', 'coordinates': [[[120, 38], [122, 39], [99, 28], [120, 38]]]}    \n> ```     \n>   \n> - GeoJSON \u683c\u5f0f\u793a\u4f8b  \n> ```python\n> # Point\n> >>> ellipsoid.Geometry.loads([-115.81, 37.24],-1 or 0)     \n> >>> ellipsoid.Geometry.loads('[-115.81, 37.24]',-1 or 0)    \n> >>> ellipsoid.Geometry.loads('{\"type\": \"Point\", \"coordinates\": [-115.81, 37.24]}', -1 or 0)  \n> >>> ellipsoid.Geometry.loads({\"type\": \"Point\", \"coordinates\": [-115.81, 37.24]},-1 or 0)  \n> # {'type': 'Point', 'coordinates': [-115.81, 37.24]}   \n> ```\n> ```python\n> # MultiPoint / LineString  \n> >>> ellipsoid.Geometry.loads([[-155.52, 19.61], [-156.22, 20.74], [-157.97, 21.46]], 0)     \n> >>> ellipsoid.Geometry.loads('[[-155.52, 19.61], [-156.22, 20.74], [-157.97, 21.46]]', 0)   \n> >>> ellipsoid.Geometry.loads('{\"type\":\"MultiPoint\",\"coordinates\":[[-155.52, 19.61], [-156.22, 20.74], [-157.97, 21.46]]}',-1 or 0)  \n> >>> ellipsoid.Geometry.loads({\"type\":\"MultiPoint\",\"coordinates\":[[-155.52, 19.61], [-156.22, 20.74], [-157.97, 21.46]]},-1 or 0)  \n> # {'coordinates': [[-155.52, 19.61], [-156.22, 20.74], [-157.97, 21.46]], 'type': 'MultiPoint'}    \n> >>> ellipsoid.Geometry.loads([[-155.52, 19.61], [-156.22, 20.74], [-157.97, 21.46]], -1 or 1)    \n> >>> ellipsoid.Geometry.loads('[[-155.52, 19.61], [-156.22, 20.74], [-157.97, 21.46]]', -1 or 1)  \n> # {'coordinates': [[-155.52, 19.61], [-156.22, 20.74], [-157.97, 21.46]], 'type': 'LineString'}  \n> ```\n> ```python\n> # LineString   \n> >>> ellipsoid.Geometry.loads([[8.919, 44.4074], [8.923, 44.4075]], -1 or 1)  \n> >>> ellipsoid.Geometry.loads('[[8.919, 44.4074], [8.923, 44.4075]]', -1 or 1)  \n> >>> ellipsoid.Geometry.loads('{\"type\":\"LineString\",\"coordinates\": [[8.919, 44.4074], [8.923, 44.4075]]}', -1 or 1)  \n> >>> ellipsoid.Geometry.loads({\"type\":\"LineString\",\"coordinates\": [[8.919, 44.4074], [8.923, 44.4075]]}, -1 or 1)  \n> # {'coordinates': [[8.919, 44.4074], [8.923, 44.4075]], 'type': 'LineString'}    \n> ```     \n> ```python\n> # MultiLineString / Polygon    \n> >>> ellipsoid.Geometry.loads([[[3.75, 9.25], [-130.95, 1.52]], [[23.15, -34.25], [-1.35, -4.65], [3.45, 77.95]]], 1)   \n> >>> ellipsoid.Geometry.loads('[[[3.75, 9.25], [-130.95, 1.52]], [[23.15, -34.25], [-1.35, -4.65], [3.45, 77.95]]]', 1)   \n> >>> ellipsoid.Geometry.loads('{\"type\":\"MultiLineString\",\"coordinates\":[[[3.75, 9.25], [-130.95, 1.52]], [[23.15, -34.25], [-1.35, -4.65], [3.45, 77.95]]]}', -1 or 1)  \n> >>> ellipsoid.Geometry.loads({\"type\":\"MultiLineString\",\"coordinates\":[[[3.75, 9.25], [-130.95, 1.52]], [[23.15, -34.25], [-1.35, -4.65], [3.45, 77.95]]]}, -1 or 1)  \n> # {'type': 'MultiLineString', 'coordinates': [[[3.75, 9.25], [-130.95, 1.52]], [[23.15, -34.25], [-1.35, -4.65], [3.45, 77.95]]]}   \n> ```         \n> ```python\n> # no hole within polygon  \n> >>> ellipsoid.Geometry.loads([[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38, 57.322]]], -1 or 2)  \n> >>> ellipsoid.Geometry.loads('[[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38, 57.322]]]', -1 or 2)  \n> >>> ellipsoid.Geometry.loads('{\"type\":\"Polygon\",\"coordinates\":[[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38, 57.322]]]}', -1 or 2)  \n> >>> ellipsoid.Geometry.loads({\"type\":\"Polygon\",\"coordinates\":[[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38, 57.322]]]}, -1 or 2)  \n> # {'type': 'Polygon', 'coordinates': [[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38, 57.322]]]}  \n> ```          \n> ```python\n> # hole within polygon   \n> >>> ellipsoid.Geometry.loads('{\"type\":\"Polygon\",\"coordinates\":[[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38, 57.322]], [[-5.21, 23.51], [15.21, -10.81], [-20.51, 1.51], [-5.21, 23.51]]]}', -1 or 2)  \n> >>> ellipsoid.Geometry.loads({\"type\":\"Polygon\",\"coordinates\":[[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38, 57.322]], [[-5.21, 23.51], [15.21, -10.81], [-20.51, 1.51], [-5.21, 23.51]]]}, -1 or 2)  \n> >>> ellipsoid.Geometry.loads('[[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38, 57.322]], [[-5.21, 23.51], [15.21, -10.81], [-20.51, 1.51], [-5.21, 23.51]]]', -1 or 2)  \n> >>> ellipsoid.Geometry.loads([[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38, 57.322]], [[-5.21, 23.51], [15.21, -10.81], [-20.51, 1.51], [-5.21, 23.51]]], -1 or 2)          \n> # {'type': 'Polygon', 'coordinates': [[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38, 57.322]], [[-5.21, 23.51], [15.21, -10.81], [-20.51, 1.51], [-5.21, 23.51]]]}  \n> ```        \n> ```python\n> # MultiPolygon   \n> >>> ellipsoid.Geometry.loads('{\"type\":\"MultiPolygon\",\"coordinates\":[[[[3.78, 9.28], [-130.91, 1.52], [35.12, 72.234], [3.78, 9.28]]], [[[23.18, -34.29], [-1.31, -4.61], [3.41, 77.91], [23.18, -34.29]]]]}', -1 or 2)  \n> >>> ellipsoid.Geometry.loads({\"type\":\"MultiPolygon\",\"coordinates\":[[[[3.78, 9.28], [-130.91, 1.52], [35.12, 72.234], [3.78, 9.28]]], [[[23.18, -34.29], [-1.31, -4.61], [3.41, 77.91], [23.18, -34.29]]]]}, -1 or 2)  \n> >>> ellipsoid.Geometry.loads('[[[[3.78, 9.28], [-130.91, 1.52], [35.12, 72.234], [3.78, 9.28]]], [[[23.18, -34.29], [-1.31, -4.61], [3.41, 77.91], [23.18, -34.29]]]]', -1 or 2)  \n> >>> ellipsoid.Geometry.loads([[[[3.78, 9.28], [-130.91, 1.52], [35.12, 72.234], [3.78, 9.28]]], [[[23.18, -34.29], [-1.31, -4.61], [3.41, 77.91], [23.18, -34.29]]]], -1 or 2)           \n> # {'type': 'MultiPolygon', 'coordinates': [[[[3.78, 9.28], [-130.91, 1.52], [35.12, 72.234], [3.78, 9.28]]], [[[23.18, -34.29], [-1.31, -4.61], [3.41, 77.91], [23.18, -34.29]]]]}  \n> ```        \n> ```python\n> # GeometryCollection\uff08\u4e0d\u652f\u6301\u7b80\u7ea6\u683c\u5f0f\u4e14\u53ef\u5ffd\u7565\u8bc6\u522b\u7801\uff09    \n> >>> ellipsoid.Geometry.loads({\"type\": \"GeometryCollection\",\"geometries\":[{\"type\": \"Point\", \"coordinates\": [-115.81, 37.24]},{\"type\":\"LineString\",\"coordinates\": [[8.919, 44.4074], [8.923, 44.4075]]},{\"type\":\"Polygon\",\"coordinates\":[[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38, 57.322]]]}]})  \n> >>> ellipsoid.Geometry.loads('{\"type\": \"GeometryCollection\",\"geometries\":[{\"type\": \"Point\", \"coordinates\": [-115.81, 37.24]},{\"type\":\"LineString\",\"coordinates\": [[8.919, 44.4074], [8.923, 44.4075]]},{\"type\":\"Polygon\",\"coordinates\":[[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38, 57.322]]]}]}')      \n> # {'type': 'GeometryCollection', 'geometries': [{'type': 'Point', 'coordinates': [-115.81, 37.24]}, {'type': 'LineString', 'coordinates': [[8.919, 44.4074], [8.923, 44.4075]]}, {'type': 'Polygon', 'coordinates': [[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38, 57.322]]]}]}   \n> ```           \n>      \n> - WKT \u683c\u5f0f\u793a\u4f8b  \n> ```python\n> # Point  \n> >>> ellipsoid.Geometry.loads('POINT(-115.81 37.24)', -1 or 0)   \n> >>> ellipsoid.Geometry.loads('(-115.81 37.24)', -1 or 0)   \n> # {'type': 'Point', 'coordinates': [-115.81, 37.24]}   \n> ``` \n> ```python\n> # MultiPoint / LineString     \n> >>> ellipsoid.Geometry.loads('MULTIPOINT(-155.52 19.61,-156.22  20.74,-157.97  21.46)', -1 or 0)  \n> >>> ellipsoid.Geometry.loads('(-155.52 19.61,-156.22  20.74,-157.97  21.46)', 0)  \n> # {'type': 'MultiPoint', 'coordinates': [[-155.52, 19.61], [-156.22, 20.74], [-157.97, 21.46]]}   \n> >>> ellipsoid.Geometry.loads('(-155.52 19.61,-156.22  20.74,-157.97  21.46)', -1)   \n> # {'type': 'LineString', 'coordinates': [[-155.52, 19.61], [-156.22, 20.74], [-157.97, 21.46]]}  \n> ``` \n> ```python\n> # LineString   \n> >>> ellipsoid.Geometry.loads('LINESTRING(8.919 44.4074,8.923 44.4075)', -1 or 1)    \n> >>> ellipsoid.Geometry.loads('(8.919 44.4074,8.923 44.4075)', -1 or 1)   \n> # {'type': 'LineString', 'coordinates': [[8.919, 44.4074], [8.923, 44.4075]]}   \n> ```  \n> ```python\n> # MultiLineString / Polygon  \n> >>> ellipsoid.Geometry.loads('MULTILINESTRING((3.75 9.25,-130.95 1.52),(23.15 -34.25,-1.35 -4.65,3.45 77.95))', -1 or 1)  \n> >>> ellipsoid.Geometry.loads('((3.75 9.25,-130.95 1.52),(23.15 -34.25,-1.35 -4.65,3.45 77.95))', 1)  \n> # {'type': 'MultiLineString', 'coordinates': [[[3.75, 9.25], [-130.95, 1.52]], [[23.15, -34.25], [-1.35, -4.65], [3.45, 77.95]]]}  \n> >>> ellipsoid.Geometry.loads('((3.75 9.25,-130.95 1.52),(23.15 -34.25,-1.35 -4.65,3.45 77.95))', -1)  \n> # {'type': 'Polygon', 'coordinates': [[[3.75, 9.25], [-130.95, 1.52]], [[23.15, -34.25], [-1.35, -4.65], [3.45, 77.95]]]}  \n> ```\n> ```python\n> # no hole within polygon  \n> >>> ellipsoid.Geometry.loads('POLYGON((2.38 57.322,-120.43 19.15,23.194 -20.28,2.38 57.322))', -1 or 2)  \n> >>> ellipsoid.Geometry.loads('((2.38 57.322,-120.43 19.15,23.194 -20.28,2.38 57.322))', -1 or 2)  \n> # {'type': 'Polygon', 'coordinates': [[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38, 57.322]]]}  \n> ```      \n> ```python\n> # hole within polygon   \n> >>> ellipsoid.Geometry.loads('POLYGON((2.38 57.322,-120.43 19.15,23.194 -20.28,2.38 57.322),(-5.21 23.51,15.21 -10.81,-20.51 1.51,-5.21 23.51))', -1 or 2)  \n> >>> ellipsoid.Geometry.loads('((2.38 57.322,-120.43 19.15,23.194 -20.28,2.38 57.322),(-5.21 23.51,15.21 -10.81,-20.51 1.51,-5.21 23.51))', -1 or 2)  \n> # {'type': 'Polygon', 'coordinates': [[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38], [57.322]], [[-5.21, 23.51], [15.21, -10.81], [-20.51, 1.51], [-5.21, 23.51]]]}  \n> ```       \n> ```python\n> # MultiPolygon  \n> >>> ellipsoid.Geometry.loads('MULTIPOLYGON(((3.78 9.28,-130.91 1.52,35.12 72.234,3.78 9.28)),((23.18 -34.29,-1.31 -4.61,3.41 77.91,23.18 -34.29)))', -1 or 2)  \n> >>> ellipsoid.Geometry.loads('(((3.78 9.28,-130.91 1.52,35.12 72.234,3.78 9.28)),((23.18 -34.29,-1.31 -4.61,3.41 77.91,23.18 -34.29)))', -1 or 2)  \n> # {'type': 'MultiPolygon', 'coordinates': [[[[3.78, 9.28], [-130.91, 1.52], [35.12, 72.234], [3.78, 9.28]]], [[[23.18, -34.29], [-1.31, -4.61], [3.41, 77.91], [23.18, -34.29]]]]}  \n> ```  \n> ```python\n> # GeometryCollection\uff08\u4e0d\u652f\u6301\u7b80\u7ea6\u683c\u5f0f\u4e14\u5e94\u5c06\u8bc6\u522b\u7801\u53d6\u9ed8\u8ba4\u503c[-1]\uff09    \n> >>> ellipsoid.Geometry.loads('GEOMETRYCOLLECTION (POINT (-115.81 37.24),LINESTRING (8.919 44.4074,8.923 44.4075),POLYGON ((2.38 57.322,-120.43 19.15,23.194 -20.28,2.38 57.322)))',-1)  \n> # {'type': 'GeometryCollection', 'geometries': [{'type': 'Point', 'coordinates': [-115.81, 37.24]}, {'type': 'LineString', 'coordinates': [[8.919, 44.4074], [8.923, 44.4075]]}]} \n> ```\n>       \n> - WKB \u683c\u5f0f\u793a\u4f8b  \n> ```python\n> # Point   \n> >>> ellipsoid.Geometry.toWkb({\"type\": \"Point\", \"coordinates\": [-115.81, 37.24]})  \n> # 0101000020E6100000A4703D0AD7F35CC01F85EB51B89E4240   \n> SQL> SELECT ST_AsGeoJSON(ST_GeomFromEWKB(E'\\\\x0101000020E6100000A4703D0AD7F35CC01F85EB51B89E4240'))   \n> >>> ellipsoid.Geometry.loads('0101000020E6100000A4703D0AD7F35CC01F85EB51B89E4240')\n> # {\"type\":\"Point\",\"coordinates\":[-115.81,37.24]}  \n> ``` \n> \n\n***Geometry.rotate***\n> ```python\n> @classmethod\n> def rotate(\n>        cls,\n>        geometry: dict | list | str,\n>        angle: float,\n>        origin: str | tuple = (0, 0, 0)\n> ) -> shapely.geometry\n> ```\n> \u65cb\u8f6c\u51e0\u4f55\u5bf9\u8c61  \n>\n> | Parameter | Type                   | Description                                                                  |\n> |:----------|:-----------------------|:-----------------------------------------------------------------------------|\n> | geometry  | dict list str          | \u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4                   |\n> | angle     | float                  | \u65cb\u8f6c\u89d2\uff08\u5341\u8fdb\u5236\u5ea6\u683c\u5f0f - \u6b63\u503c\u4e3a\u9006\u65f6\u9488\u65cb\u8f6c\uff0c\u8d1f\u503c\u4e3a\u987a\u65f6\u9488\u65cb\u8f6c\uff09                                              |\n> | origin    | str tuple = (0, 0, 0)  | \u53c2\u8003\u539f\u70b9\uff08\u65cb\u8f6c\u4e2d\u5fc3\uff09\uff0c\u53ef\u4e3a\u4e0d\u8d85\u8fc73\u7ef4\u7684\u5143\u7ec4\u7c7b\u578b\u70b9\u72b6\u5750\u6807\u3001\u51e0\u4f55\u8fb9\u6846\u4e2d\u5fc3'center'\u3001\u51e0\u4f55\u8d28\u5fc3'centroid'\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a(0, 0, 0)  |\n> \n> \u8fd4\u56deshapely\u683c\u5f0f\u51e0\u4f55\uff08geometry\uff09\u5bf9\u8c61\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Geometry.scale***\n> ```python\n> @classmethod\n> def scale(\n>         cls,\n>         geometry: dict | list | str,\n>         xfact: float = 1.0,\n>         yfact: float = 1.0,\n>         zfact: float = 1.0,\n>         origin: str | tuple = (0, 0, 0)\n> ) -> shapely.geometry\n> ```\n> \u7f29\u653e\u51e0\u4f55\u5bf9\u8c61  \n>\n> | Parameter | Type                   | Description                                                                 |\n> |:----------|:-----------------------|:----------------------------------------------------------------------------|\n> | geometry  | dict list str          | \u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4                  |\n> | xfact     | float                  | \u6a2a\u5411\u7f29\u653e\u56e0\u5b50\uff08\u6bd4\u4f8b\uff09\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a1.0                                                      |\n> | yfact     | float                  | \u7eb5\u5411\u7f29\u653e\u56e0\u5b50\uff08\u6bd4\u4f8b\uff09\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a1.0                                                      |\n> | zfact     | float                  | \u7ad6\u5411\u7f29\u653e\u56e0\u5b50\uff08\u6bd4\u4f8b\uff09\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a1.0                                                      |\n> | origin    | str tuple = (0, 0, 0)  | \u53c2\u8003\u539f\u70b9\uff0c\u53ef\u4e3a\u4e0d\u8d85\u8fc73\u7ef4\u7684\u5143\u7ec4\u7c7b\u578b\u70b9\u72b6\u5750\u6807\u3001\u51e0\u4f55\u8fb9\u6846\u4e2d\u5fc3'center'\u3001\u51e0\u4f55\u8d28\u5fc3'centroid'\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a(0, 0, 0) |\n> \n> \u8fd4\u56deshapely\u683c\u5f0f\u51e0\u4f55\uff08geometry\uff09\u5bf9\u8c61\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Geometry.skew***\n> ```python\n> @classmethod\n> def skew(\n>         cls,\n>         geometry: dict | list | str,\n>         xs: float = 0.0,\n>         ys: float = 0.0,\n>         origin: str | tuple = (0, 0, 0)\n> ) -> shapely.geometry\n> ```\n> \u626d\u659c\u51e0\u4f55\u5bf9\u8c61    \n>\n> | Parameter | Type                   | Description                                                                 |\n> |:----------|:-----------------------|:----------------------------------------------------------------------------|\n> | geometry  | dict list str          | \u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4                  |\n> | xs        | float                  | \u6cbf\u6a2a\u5411\u5750\u6807\u8f74\u7684\u503e\u659c\u89d2\uff08\u5341\u8fdb\u5236\u5ea6\u683c\u5f0f - \u6b63\u503c\u4e3a\u9006\u65f6\u9488\u65cb\u8f6c\uff0c\u8d1f\u503c\u4e3a\u987a\u65f6\u9488\u65cb\u8f6c\uff09\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a0.0 |\n> | ys        | float                  | \u6cbf\u7eb5\u5411\u5750\u6807\u8f74\u7684\u503e\u659c\u89d2\uff08\u5341\u8fdb\u5236\u5ea6\u683c\u5f0f - \u6b63\u503c\u4e3a\u9006\u65f6\u9488\u65cb\u8f6c\uff0c\u8d1f\u503c\u4e3a\u987a\u65f6\u9488\u65cb\u8f6c\uff09\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a0.0 |\n> | origin    | str tuple = (0, 0, 0)  | \u53c2\u8003\u539f\u70b9\uff0c\u53ef\u4e3a\u4e0d\u8d85\u8fc73\u7ef4\u7684\u5143\u7ec4\u7c7b\u578b\u70b9\u72b6\u5750\u6807\u3001\u51e0\u4f55\u8fb9\u6846\u4e2d\u5fc3'center'\u3001\u51e0\u4f55\u8d28\u5fc3'centroid'\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a(0, 0, 0) |\n> \n> \u8fd4\u56deshapely\u683c\u5f0f\u51e0\u4f55\uff08geometry\uff09\u5bf9\u8c61\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Geometry.swapXY***\n> ```python\n> @classmethod\n> def swapXY(\n>         cls,\n>         geometry: dict | list | str\n> ) -> dict  \n> ```\n> \u4ea4\u6362\u6307\u5b9a\u51e0\u4f55\u4f53\u7684\u9876\u70b9\u5750\u6807[x,y,z,m]\u4e2d\u7684[x,y]\u987a\u5e8f\uff08[x,y,z,m] to [y,x,z,m]\uff09   \n>  \n> | Parameter | Type                   | Description                                                 |\n> |:----------|:-----------------------|:------------------------------------------------------------|\n> | geometry  | dict list str          | \u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> \n> \u8fd4\u56de\u3010GeoJson-geometry\u3011\u683c\u5f0f\u7684\u5b57\u5178\u7c7b\u578b\u5bf9\u8c61\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Geometry.toGml***\n> ```python\n> @classmethod\n> def toGml(\n>         cls,\n>         geometry: dict | list | str\n> ) -> etree._Element  \n> ```\n> \u5c06\u3010GeoJson-geometry\u3011\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\u8f6c\u6362\u4e3aGML-V3.2\u683c\u5f0f\u51e0\u4f55\u5bf9\u8c61  \n>  \n> | Parameter | Type                   | Description                                                 |\n> |:----------|:-----------------------|:------------------------------------------------------------|\n> | geometry  | dict list str          | \u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> \n> \u8fd4\u56deGML-V3.2\u683c\u5f0f\u51e0\u4f55\u5bf9\u8c61\uff08\u89e3\u7801\u4e3a\u5b57\u7b26\u4e32\uff1alxml.etree.tostring(resultGml, pretty_print=True).decode()\uff09\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Geometry.toKml***\n> ```python\n> @classmethod\n> def toKml(\n>         cls,\n>         geometry: dict | list | str\n> ) -> etree._Element  \n> ```\n> \u5c06\u3010GeoJson-geometry\u3011\u51e0\u4f55\u5b57\u5178\u5bf9\u8c61\u8f6c\u6362\u4e3aKML\u683c\u5f0f\u51e0\u4f55\u5143\u7d20\u5bf9\u8c61  \n>  \n> | Parameter | Type                   | Description                                                 |\n> |:----------|:-----------------------|:------------------------------------------------------------|\n> | geometry  | dict list str          | \u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> \n> \u8fd4\u56deKML\u683c\u5f0f\u51e0\u4f55\u5143\u7d20\u5bf9\u8c61\uff08\u89e3\u7801\u4e3a\u5b57\u7b26\u4e32\uff1alxml.etree.tostring(resultKml, pretty_print=True).decode()\uff09\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Geometry.toOgr***\n> ```python\n> @classmethod\n> def toOgr(\n>         cls,\n>         geometry: dict | list | str\n> ) -> ogr.Geometry\n> ```\n> \u5c06\u3010GeoJson-geometry\u3011\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\u8f6c\u6362\u4e3a[OSGEO - GDAL - Geometry]\u683c\u5f0f\u51e0\u4f55\u5bf9\u8c61  \n>  \n> | Parameter | Type                   | Description                                                 |\n> |:----------|:-----------------------|:------------------------------------------------------------|\n> | geometry  | dict list str          | \u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> \n> \u8fd4\u56de[OSGEO - GDAL - Geometry]\u683c\u5f0f\u51e0\u4f55\u5bf9\u8c61\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Geometry.toShapely***\n> ```python\n> @classmethod\n> def toShapely(\n>         cls,\n>         geometry: dict | list | str,\n>         srid: int | None = 4326\n> ) -> shapely.geometry\n> ```\n> \u5c06\u3010GeoJson-geometry\u3011\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\u8f6c\u6362\u4e3ashapely\u683c\u5f0f\u51e0\u4f55\u5bf9\u8c61\u3002\u6ce8\uff1a\u51e0\u4f55\u5750\u6807\u6700\u591a\u652f\u63013\u7ef4  \n>  \n> | Parameter | Type          | Description                                                       |\n> |:----------|:--------------|:------------------------------------------------------------------|\n> | geometry  | dict list str | \u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4        |\n> | srid      | int None      | \u51e0\u4f55\u6295\u5f71\u53c2\u7167\u7cfbOGC\u7c7b\u578b\u4ee3\u7801\uff0c\u9ed8\u8ba4\u503c\uff1a4326=\u5341\u8fdb\u5236\u7ecf\u7eac\u5ea6\u683c\u5f0f\uff1b\u8bbe\u5b9a\u4e3a0\u65f6\u610f\u6307\u672a\u5b9a\u4e49\u53c2\u7167\u7cfb;\u5982\u679c\u8bbe\u4e3aNone\uff0c\u5c06\u4e0d\u8bbe\u7f6e\u6295\u5f71\u53c2\u91cf  |\n> \n> \u8fd4\u56deshapely\u683c\u5f0f\u51e0\u4f55\uff08geometry\uff09\u5bf9\u8c61\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Geometry.toSvg***\n> ```python\n> @classmethod\n> def toSvg(\n>         cls,\n>         geometry: dict | list | str,\n>         scale_factor: float = 1.0,\n>         color: str = None,\n>         opacity: float = None\n> ) -> str\n> ```\n> \u5c06\u3010GeoJson-geometry\u3011\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\u6216\u8005\u3010shapely\u3011\u683c\u5f0f\u5bf9\u8c61\u8f6c\u6362\u4e3aSVG\u683c\u5f0f   \n>  \n> | Parameter    | Type          | Description                                                |\n> |:-------------|:--------------|:-----------------------------------------------------------|\n> | geometry     | dict list str | \u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4 |\n> | scale_factor | float         | \u753b\u7b14\u5bbd\u5ea6\u7684\u7f29\u653e\u56e0\u5b50\uff0c\u9ed8\u8ba4\u503c\uff1a1.0                                          |\n> | color        | str           | \u753b\u7b14\u989c\u8272\u6216\u8005\u586b\u5145\u989c\u8272\uff08\u5341\u516d\u8fdb\u5236\u5b57\u7b26\u4e32\uff09\uff0c\u6709\u6548\u51e0\u4f55\u7684\u9ed8\u8ba4\u8272\uff1a\u201c#66cc99\u201d\uff0c\u65e0\u6548\u51e0\u4f55\u7684\u9ed8\u8ba4\u8272\uff1a\u201c#ff3333\u201d  |\n> | opacity      | float         | \u8272\u5f69\u900f\u660e\u5ea6\uff08\u4ecb\u4e8e[0,1]\u4e4b\u95f4\uff09\uff0c\u9ed8\u8ba4\u503c\uff1a0.6\uff08\u70b9\uff09\u30010.8\uff08\u7ebf\u9762\uff09                        |\n> \n> \u8fd4\u56deXML\u683c\u5f0fSVG\u51e0\u4f55\u5b57\u7b26\u4e32. \u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38  \n\n***Geometry.toWkb***\n> ```python\n> @classmethod\n> def toWkb(\n>         cls,\n>         geometry: dict | list | str,\n>         srid: int | None = 4326\n> ) -> str\n> ```\n> \u5c06\u3010GeoJson-geometry\u3011\u51e0\u4f55\u5b57\u5178\u5bf9\u8c61\u8f6c\u6362\u4e3aOGC-WKB\u5341\u516d\u8fdb\u5236\u51e0\u4f55\u6587\u672c  \n>  \n> | Parameter | Type          | Description                                                       |\n> |:----------|:--------------|:------------------------------------------------------------------|\n> | geometry  | dict list str | \u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4        |\n> | srid      | int None      | \u51e0\u4f55\u6295\u5f71\u53c2\u7167\u7cfbOGC\u7c7b\u578b\u4ee3\u7801\uff0c\u9ed8\u8ba4\u503c\uff1a4326=\u5341\u8fdb\u5236\u7ecf\u7eac\u5ea6\u683c\u5f0f\uff1b\u8bbe\u5b9a\u4e3a0\u65f6\u610f\u6307\u672a\u5b9a\u4e49\u53c2\u7167\u7cfb;\u5982\u679c\u8bbe\u4e3aNone\uff0c\u5c06\u4e0d\u8bbe\u7f6e\u6295\u5f71\u53c2\u91cf  |\n> \n> \u8fd4\u56deOGC-WKB\uff08\u53ef\u5305\u542bsrid\uff09\u5341\u516d\u8fdb\u5236\u51e0\u4f55\u6587\u672c\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38  \n>  \n> EPSG:4326\u5750\u6807\u7cfb\u4e0b\u7684WKB\u7f16\u7801\u6837\u4f8b\uff1a   \n>> \u5355\u70b9  \n>> ellipsoid.Geometry.toWkb({\"type\": \"Point\", \"coordinates\": [1, 2]})  \n>> 0101000020E6100000000000000000F03F0000000000000040  \n>  \n>> \u591a\u70b9  \n>> ellipsoid.Geometry.toWkb({\"type\": \"MultiPoint\", \"coordinates\": [[1, 2], [3, 4]]})  \n>> 0104000020E6100000020000000101000000000000000000F03F0000000000000040010100000000000000000008400000000000001040  \n>  \n>> \u5355\u7ebf  \n>> ellipsoid.Geometry.toWkb({\"type\": \"LineString\", \"coordinates\": [[1, 2], [3, 4]]})  \n>> 0102000020E610000002000000000000000000F03F000000000000004000000000000008400000000000001040  \n>  \n>> \u591a\u7ebf  \n>> ellipsoid.Geometry.toWkb({\"type\": \"MultiLineString\", \"coordinates\": [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]})  \n>> 0105000020e610000002000000010200000002000000000000000000f03f000000000000004000000000000008400000000000001040010200000002000000000000000000144000000000000018400000000000001c400000000000002040  \n>   \n>> \u5355\u9762  \n>> ellipsoid.Geometry.toWkb({\"type\": \"Polygon\", \"coordinates\": [[[1, 2], [3, 4]], [[5, 6], [7, 8],[1, 2]]]})  \n>> 0103000020E61000000200000002000000000000000000F03F00000000000000400000000000000840000000000000104003000000000000000000144000000000000018400000000000001C400000000000002040000000000000F03F0000000000000040  \n>  \n>> \u6bcd\u5b50\u9762  \n>> ellipsoid.Geometry.toWkb({\"type\": \"Polygon\", \"coordinates\": [[[2.38, 57.322], [-120.43, 19.15], [23.194, -20.28], [2.38, 57.322]], [[-5.21, 23.51], [15.21, -10.81], [-20.51, 1.51], [-5.21, 23.51]]]})  \n>> 0103000020E610000002000000040000000AD7A3703D0A0340F0A7C64B37A94C40EC51B81E851B5EC066666666662633408B6CE7FBA931374048E17A14AE4734C00AD7A3703D0A0340F0A7C64B37A94C4004000000D7A3703D0AD714C0C3F5285C8F823740EC51B81E856B2E401F85EB51B89E25C0C3F5285C8F8234C0295C8FC2F528F83FD7A3703D0AD714C0C3F5285C8F823740  \n>  \n>> \u591a\u9762  \n>> ellipsoid.Geometry.toWkb({\"type\": \"MultiPolygon\", \"coordinates\": [[[[3.78, 9.28], [-130.91, 1.52], [35.12, 72.234], [3.78, 9.28]]], [[[23.18, -34.29], [-1.31, -4.61], [3.41, 77.91], [23.18, -34.29]]]]})  \n>> 0106000020E610000002000000010300000001000000040000003D0AD7A3703D0E408FC2F5285C8F224085EB51B81E5D60C052B81E85EB51F83F8FC2F5285C8F4140E5D022DBF90E52403D0AD7A3703D0E408FC2F5285C8F224001030000000100000004000000AE47E17A142E374085EB51B81E2541C0F6285C8FC2F5F4BF713D0AD7A37012C048E17A14AE470B400AD7A3703D7A5340AE47E17A142E374085EB51B81E2541C0  \n\n***Geometry.toWkt***\n> ```python\n> @classmethod\n> def toWkt(\n>         cls,\n>         geometry: dict | list | str\n> ) -> str \n> ```\n> \u5c06\u3010GeoJson-geometry\u3011\u51e0\u4f55\u5b57\u5178\u5bf9\u8c61\u8f6c\u6362\u4e3aOGC-WKT(Well-known Text\uff09\u683c\u5f0f\u5b57\u7b26\u4e32  \n>  \n> | Parameter | Type                   | Description                                                 |\n> |:----------|:-----------------------|:------------------------------------------------------------|\n> | geometry  | dict list str          | \u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> \n> \u8fd4\u56deWKT\u683c\u5f0f\u5b57\u7b26\u4e32\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38  \n\n***Geometry.translate***\n> ```python\n> @classmethod\n> def translate(\n>         cls,\n>         geometry: dict | list | str,\n>         xoff: float = 0.0,\n>         yoff: float = 0.0,\n>         zoff: float = 0.0\n> ) -> shapely.geometry\n> ```\n> \u5e73\u79fb\u51e0\u4f55\u5bf9\u8c61   \n>  \n> | Parameter | Type          | Description                                                |\n> |:----------|:--------------|:-----------------------------------------------------------|\n> | geometry  | dict list str | \u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4 |\n> | xoff      | float         | \u6cbf\u6a2a\u5411\u5750\u6807\u8f74\u7684\u5e73\u79fb\u91cf\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a0.0                                     |\n> | yoff      | float         | \u6cbf\u7eb5\u5411\u5750\u6807\u8f74\u7684\u5e73\u79fb\u91cf\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a0.0                                     | \n> | zoff      | float         | \u6cbf\u7eb5\u5411\u5750\u6807\u8f74\u7684\u5e73\u79fb\u91cf\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a0.0                                     |\n> \n> \u8fd4\u56deshapely\u683c\u5f0f\u51e0\u4f55\uff08geometry\uff09\u5bf9\u8c61\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38    \n\n*****\n* ### Class MapGrid(builtins.object)\n\n*****\n\n***MapGrid.map***\n> ```python\n> @classmethod\n> def map(\n>        cls,\n>        longitude: float,\n>        latitude: float,\n>        scale: int = 1000000\n> ) -> dict\n> ```\n> \u7531\u5341\u8fdb\u5236\u7ecf\u7eac\u5ea6\u4f4d\u7f6e\u548c\u6bd4\u4f8b\u5c3a\u5206\u6bcd\u8ba1\u7b97\u6240\u5728\u6bd4\u4f8b\u5c3a\u7684\u56fe\u5e45\u65b0\u65e7\u7f16\u53f7\uff08\u5357\u534a\u7403\u51a0\u4ee5S\u524d\u7f00\uff0c\u5317\u534a\u7403\u7701\u7565N\u524d\u7f00\uff09\u4e0e\u8fb9\u6846\u8303\u56f4\u3002\u6ce8\uff1a\u5982\u679c\u6307\u5b9a\u4f4d\u7f6e\u6070\u597d\u4f4d\u4e8e\u56fe\u5e45\u8fb9\u7f18\uff0c\u5c06\u8fd4\u56de\u53f3\u4e0a\u89d2\u56fe\u5e45\u7ed3\u679c\u4fe1\u606f  \n>\n> | Parameter | Type  | Description                     |\n> |:----------|:------|:--------------------------------|\n> | longitude | float | \u5341\u8fdb\u5236\u7ecf\u5ea6\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-180 \uff5e +180]        |\n> | latitude  | float | \u5341\u8fdb\u5236\u7eac\u5ea6\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-90 \uff5e +90]          | \n> | scale     | int   | \u6bd4\u4f8b\u5c3a\u5206\u6bcd\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[1000000\uff08\u9ed8\u8ba4\uff09 \uff5e 500]  |\n> \n> \u8fd4\u56de\u6240\u5728\u6bd4\u4f8b\u5c3a\u7684\u56fe\u5e45\u65b0\u65e7\u7f16\u53f7\u4e0e\u8fb9\u6846\u8303\u56f4\u6784\u6210\u7684\u5b57\u5178\u5bf9\u8c61\uff0c\u8fd0\u884c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38  \n>   \n> \u793a\u4f8b\uff08\u4f4d\u7f6e\uff1a114\u00b033\u203245\u2033,39\u00b022\u203230\u2033\uff09\uff1a\n>> ```python\n>> ellipsoid.MapGrid.map(longitude=114.5625, latitude=39.375, scale=1000000)  \n>> # {'new': 'J50', 'old': 'J-50', 'boundary': {'north': 40, 'south': 36, 'west': 114, 'east': 120}}  \n>> ellipsoid.MapGrid.map(longitude=114.5625, latitude=39.375, scale=500000)  \n>> # {'new': 'J50B001001', 'old': 'J-50-A', 'boundary': {'north': 40.0, 'south': 38.0, 'west': 114.0, 'east': 117.0}}  \n>> ellipsoid.MapGrid.map(longitude=114.5625, latitude=39.375, scale=250000)  \n>> # {'new': 'J50C001001', 'old': 'J-50-[1]', 'boundary': {'north': 40.0, 'south': 39.0, 'west': 114.0, 'east': 115.5}}  \n>> ellipsoid.MapGrid.map(longitude=114.5625, latitude=39.375, scale=200000)   \n>> # {'new': 'J-50-(01)', 'old': 'J-50-(01)', 'boundary': {'north': 40.0, 'south': 39.333333333333336, 'west': 114.0, 'east': 115.0}}   \n>> ellipsoid.MapGrid.map(longitude=114.5625, latitude=39.375, scale=100000)  \n>> # {'new': 'J50D002002', 'old': 'J-50-14', 'boundary': {'north': 39.66666666666667, 'south': 39.333333333333336, 'west': 114.5, 'east': 115.0}}  \n>> ellipsoid.MapGrid.map(longitude=114.5625, latitude=39.375, scale=50000)  \n>> # {'new': 'J50E004003', 'old': 'J-50-14-C', 'boundary': {'north': 39.5, 'south': 39.333333333333336, 'west': 114.5, 'east': 114.75}}  \n>> ellipsoid.MapGrid.map(longitude=114.5625, latitude=39.375, scale=25000)  \n>> # {'new': 'J50F008005', 'old': 'J-50-14-C-3', 'boundary': {'north': 39.41666666666667, 'south': 39.333333333333336, 'west': 114.5, 'east': 114.625}}  \n>> ellipsoid.MapGrid.map(longitude=114.5625, latitude=39.375, scale=10000)\n>> # {'new': 'J50G015010', 'old': 'J-50-14-(50)', 'boundary': {'north': 39.416666666666664, 'south': 39.375, 'west': 114.5625, 'east': 114.625}}  \n>> ellipsoid.MapGrid.map(longitude=114.5625, latitude=39.375, scale=5000)\n>> # {'new': 'J50H030019', 'old': 'J-50-14-(50)-c', 'boundary': {'north': 39.395833333333336, 'south': 39.375, 'west': 114.5625, 'east': 114.59375}}  \n>> ellipsoid.MapGrid.map(longitude=114.5625, latitude=39.375, scale=2000)  \n>> # {'new': 'J50I090055', 'old': 'J-50-14-(50)-c-7', 'boundary': {'north': 39.38194444444444, 'south': 39.375, 'west': 114.5625, 'east': 114.57291666666667}}  \n>> ellipsoid.MapGrid.map(longitude=114.5625, latitude=39.375, scale=1000)\n>> # {'new': 'J50J01800109', 'old': 'J-50-14-(50)-c-7-3', 'boundary': {'north': 39.37847222222222, 'south': 39.375, 'west': 114.5625, 'east': 114.56770833333333}}   \n>> ellipsoid.MapGrid.map(longitude=114.5625, latitude=39.375, scale=500)\n>> # {'new': 'J50K03600217', 'old': 'J-50-14-(50)-c-7-3-3', 'boundary': {'north': 39.376736111111114, 'south': 39.375, 'west': 114.5625, 'east': 114.56510416666667}}\n>> ```\n\n***MapGrid.parse***\n> ```python\n> @classmethod\n> def parse(\n>        cls,\n>        code: str\n> ) -> dict\n> ```\n> \u7531\u56fd\u5bb6\u57fa\u672c\u6bd4\u4f8b\u5c3a\u5730\u5f62\u56fe\u5206\u5e45\uff08\u65b0\u65e7\uff09\u7f16\u53f7\u89e3\u6790\u56fe\u5e45\u8fb9\u754c\u8303\u56f4\u548c\u6bd4\u4f8b\u5c3a\u4fe1\u606f  \n>\n> | Parameter | Type  | Description            |\n> |:----------|:------|:-----------------------|\n> | code      | str   | \u56fd\u5bb6\u57fa\u672c\u6bd4\u4f8b\u5c3a\u5730\u5f62\u56fe\u5206\u5e45\u7f16\u53f7\uff08\u5ffd\u7565\u5927\u5c0f\u5199\uff09  |\n> \n> \u8fd4\u56de\u56fe\u5e45\u8fb9\u754c\u8303\u56f4\u3001\u6bd4\u4f8b\u5c3a\u6784\u6210\u7684\u5b57\u5178\u5bf9\u8c61\uff0c\u8fd0\u884c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38  \n> \n> \u793a\u4f8b\uff1a\n>> ```python\n>> ellipsoid.MapGrid.parse('J50' \u6216\u8005 'J-50')    \n>> # {'scale': 1000000, 'boundary': {'north': 40, 'south': 36, 'west': 114, 'east': 120}}  \n>> ellipsoid.MapGrid.parse('J50B001001' \u6216\u8005 'J-50-A')  \n>> # {'scale': 500000, 'boundary': {'north': 40.0, 'south': 38.0, 'west': 114.0, 'east': 117.0}}  \n>> ellipsoid.MapGrid.parse('J50C001001' \u6216\u8005 'J-50-[1]')  \n>> # {'scale': 250000, 'boundary': {'north': 40.0, 'south': 39.0, 'west': 114.0, 'east': 115.5}}  \n>> ellipsoid.MapGrid.parse('J-50-(01)')   \n>> # {'scale': 200000, 'boundary': {'north': 40.0, 'south': 39.333333333333336, 'west': 114.0, 'east': 115.0}}    \n>> ellipsoid.MapGrid.parse('J50D002002' \u6216\u8005 'J-50-14')   \n>> # {'scale': 100000, 'boundary': {'north': 39.66666666666667, 'south': 39.333333333333336, 'west': 114.5, 'east': 115.0}}  \n>> ellipsoid.MapGrid.parse('J50E004003' \u6216\u8005 'J-50-14-C')\n>> # {'scale': 50000, 'boundary': {'north': 39.5, 'south': 39.333333333333336, 'west': 114.5, 'east': 114.75}}  \n>> ellipsoid.MapGrid.parse('J50F008005' \u6216\u8005 'J-50-14-C-3')\n>> # {'scale': 25000, 'boundary': {'north': 39.41666666666667, 'south': 39.333333333333336, 'west': 114.5, 'east': 114.625}}   \n>> ellipsoid.MapGrid.parse('J50G015010' \u6216\u8005 'J-50-14-(50)')\n>> # {'scale': 10000, 'boundary': {'north': 39.416666666666664, 'south': 39.375, 'west': 114.5625, 'east': 114.625}}  \n>> ellipsoid.MapGrid.parse('J50H030019' \u6216\u8005 'J-50-14-(50)-c')\n>> # {'scale': 5000, 'boundary': {'north': 39.395833333333336, 'south': 39.375, 'west': 114.5625, 'east': 114.59375}}  \n>> ellipsoid.MapGrid.parse('J50I090055' \u6216\u8005 'J-50-14-(50)-c-7')\n>> # {'scale': 2000, 'boundary': {'north': 39.38194444444444, 'south': 39.375, 'west': 114.5625, 'east': 114.57291666666667}}  \n>> ellipsoid.MapGrid.parse('J50J01800109' \u6216\u8005 'J-50-14-(50)-c-7-3')\n>> # {'scale': 1000, 'boundary': {'north': 39.37847222222222, 'south': 39.375, 'west': 114.5625, 'east': 114.56770833333333}}  \n>> ellipsoid.MapGrid.parse('J50K03600217' \u6216\u8005 'J-50-14-(50)-c-7-3-3')\n>> # {'scale': 500, 'boundary': {'north': 39.376736111111114, 'south': 39.375, 'west': 114.5625, 'east': 114.56510416666667}}\n>> ```\n\n***MapGrid.grid***\n> ```python\n> @staticmethod\n> def grid(\n>        north: float,\n>        south: float,\n>        west: float,\n>        east: float,\n>        zoom: int = 0,\n>        summary: bool = False\n> ) -> Iterator\n> ```\n> \u4f9d\u636e\u89c6\u56fe\u7a97\u53e3\u8fb9\u6846\u8303\u56f4\u548c\u7f29\u653e\u7ea7\u83b7\u53d6\u56fd\u5bb6\u57fa\u672c\u6bd4\u4f8b\u5c3a\u5730\u5f62\u56fe\u5206\u5e45\u7ecf\u7eac\u7f51\u683c\u7ebf\uff08\u9002\u5b9c\u4e8eGIS\u56fe\u5f62\u89c6\u7a97\u5448\u73b0\uff09\uff0c\u89c6\u7a97\u8fb9\u754c\u53c2\u6570\u5c06\u5145\u5f53\u7ecf\u7eac\u7f51\u7ebf\u6bb5\u7684\u88c1\u526a\u6846  \n>\n> | Parameter | Type  | Description                                                                                                                                                               |\n> |:----------|:------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | north     | float | \u89c6\u7a97\u5317\u8fb9\u754c\u5750\u6807\uff08\u5341\u8fdb\u5236\u7eac\u5ea6\uff09\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-90 \uff5e +90]                                                                                                                                           |\n> | south     | float | \u89c6\u7a97\u5357\u8fb9\u754c\u5750\u6807\uff08\u5341\u8fdb\u5236\u7eac\u5ea6\uff09\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-90 \uff5e +90]                                                                                                                                           |\n> | west      | float | \u89c6\u7a97\u897f\u8fb9\u754c\u5750\u6807\uff08\u5341\u8fdb\u5236\u7ecf\u5ea6\uff09\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-180 \uff5e +180]                                                                                                                                         |\n> | east      | float | \u89c6\u7a97\u4e1c\u8fb9\u754c\u5750\u6807\uff08\u5341\u8fdb\u5236\u7ecf\u5ea6\uff09\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-180 \uff5e +180]                                                                                                                                         |\n> | zoom      | int   | \u7f29\u653e\u7ea7\uff0c\u9ed8\u8ba4\uff1a0\u3002\u6ce8\uff1a\u7f29\u653e\u7ea7\u5bf9\u5e94\u7684\u6bd4\u4f8b\u5c3a\u4e3a\uff1a\u5c0f\u4e8e\u7b49\u4e8e5\u7ea7=1\u22361000000\uff1b6\u7ea7=1\u2236500000\uff1b7\u7ea7=1\u2236250000\uff1b8\u7ea7=1\u2236200000\uff1b9\u7ea7=1\u2236100000\uff1b10\u7ea7=1\u223650000\uff1b11\u7ea7=1\u223625000\uff1b12\u7ea7=1\u223610000\uff1b13\u7ea7=1\u22365000\uff1b14\u7ea7=1\u22362000\uff1b15\u7ea7=1\u22361000\uff1b\u5927\u4e8e\u7b49\u4e8e16\u7ea7=1\u2236500 |\n> | summary   | bool  | \u662f\u5426\u4ec5\u8fd4\u56de\u6982\u8981\u4fe1\u606f\uff0c\u9ed8\u8ba4\uff1aFalse                                                                                                                                                        |\n> \n> \u5982\u679csummary\u53d6\u9ed8\u8ba4\u503cFalse\uff0c\u5c06\u8fd4\u56de\u7ebf\u6bb5\u7c7b\u578b\u6807\u8bc6\u4e0e\u7ecf\u7eac\u7f51\u548c\u6bd4\u4f8b\u5c3a\u5206\u6bcd\u8054\u5408\u6784\u6210\u7684\u679a\u4e3e\u578b\u5b57\u5178\u8fed\u4ee3\u5668\uff08Iterator\uff09\uff1b\u5982\u679csummary\u8bbe\u4e3aTrue\uff0c\u5c06\u8fd4\u56de\u7ecf\u7eac\u7ebf\u4e2a\u6570\u4e0e\u7ecf\u7eac\u7ebf\u6b65\u957f\u548c\u6bd4\u4f8b\u5c3a\u5206\u6bcd\u8054\u5408\u6784\u6210\u7684\u679a\u4e3e\u578b\u5b57\u5178\u8fed\u4ee3\u5668\uff08Iterator\uff09\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38  \n>  \n> \u83b7\u53d6\u7ecf\u7eac\u7f51\u4fe1\u606f\u793a\u4f8b\uff1a\n>> ```python\n>> [print(line) for line in ellipsoid.MapGrid.grid(40, 20, 80, 100, 0)]  \n>> # \u8fd0\u884c\u7ed3\u679c\uff1a\n>> # {'remarks': 'longitude', 'type': 'LineString', 'coordinates': [[84.0, 20.0], [84.0, 40.0]], 'scale': 1000000}\n>> # ......\n>> # {'remarks': 'latitude', 'type': 'LineString', 'coordinates': [[80, 20.0], [100, 20.0]], 'scale': 1000000}\n>> # ......\n>> ```\n\n*****\n* ### Class Projection(builtins.object)\n\n*****\n\n***Projection.albers***\n> ```python\n> @classmethod\n> def albers(\n>        cls,\n>        longitude: float = None,\n>        latitude: float = None,\n>        centralMeridian: float = 0,\n>        originLatitude: float = 0,\n>        parallel1: float = 20,\n>        parallel2: float = 50,\n>        x: float = None,\n>        y: float = None,\n>        crs: int = 2000\n> ) -> tuple\n> ```\n> \u963f\u5c14\u4f2f\u65af\u7403\u4f53\u53cc\u6807\u51c6\u7eac\u7ebf\u7b49\u79ef\u5272\u5706\u9525\u6295\u5f71\uff08Albers Equal Area Projection\uff09\u6b63\u53cd\u7b97\u51fd\u6570\uff0c\u4f18\u5148\u8bc6\u522b\u5730\u7406\u7ecf\u7eac\u5ea6\u5750\u6807\uff08longitude\u3001latitude\uff09\u6267\u884c\u6b63\u7b97\uff0c\u5176\u6b21\u8bc6\u522b\u76f4\u89d2\u5750\u6807\uff08x\u3001y\uff09\u5e76\u6267\u884c\u53cd\u7b97  \n>\n> | Parameter       | Type  | Description                                                                |\n> |:----------------|:------|:---------------------------------------------------------------------------|\n> | longitude       | float | \u5341\u8fdb\u5236\u7ecf\u5ea6\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-180 \uff5e +180]                                                   |\n> | latitude        | float | \u5341\u8fdb\u5236\u7eac\u5ea6\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-90 \uff5e +90]                                                     |\n> | centralMeridian | float | \u4e2d\u592e\u5b50\u5348\u7ebf\u7ecf\u5ea6\uff08\u5341\u8fdb\u5236\u5ea6\u683c\u5f0f\uff0c\u9ed8\u8ba4\u503c\uff1a0\uff09\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-180 \uff5e +180]                                   |\n> | originLatitude  | float | \u5e95\u70b9\u7eac\u5ea6\uff08\u5341\u8fdb\u5236\u5ea6\uff09\uff1b\u9ed8\u8ba4\u503c\uff1a0\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-90 \uff5e +90]                                          |\n> | parallel1       | float | \u7b2c\u4e00\u6807\u51c6\u7eac\u7ebf\uff08\u5341\u8fdb\u5236\u5ea6\uff09\uff1b\u9ed8\u8ba4\u503c\uff1a20\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-90 \uff5e +90]                                       |\n> | parallel2       | float | \u7b2c\u4e8c\u6807\u51c6\u7eac\u7ebf\uff08\u5341\u8fdb\u5236\u5ea6\uff09\uff1b\u9ed8\u8ba4\u503c\uff1a50\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-90 \uff5e +90]                                       |\n> | x               | float | \u7c73\u5236\u6a2a\u5750\u6807                                                                      |\n> | y               | float | \u7c73\u5236\u7eb5\u5750\u6807                                                                      |\n> | crs             | int   | \u5750\u6807\u53c2\u7167\u7cfb\u5e74\u4ee3\uff081954=\u5317\u4eac\u5750\u6807\u7cfb\uff1b1980=\u897f\u5b89\u5750\u6807\u7cfb\uff1b1984=WGS84\u5750\u6807\u7cfb\uff1b2000=CGCS2000\u5750\u6807\u7cfb\uff0c\u7701\u7565\u53d6\u9ed8\u8ba4\u503c\uff1a2000\uff09  |\n> \n> \u8fd4\u56de\u6b63\u53cd\u7b97\u7ed3\u679c\u5143\u7ec4\uff08\u6a2a\u5750\u6807\uff0c\u7eb5\u5750\u6807\uff09\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Projection.centralMeridian***\n> ```python\n> @classmethod\n> def centralMeridian(\n>        cls,\n>        longitude: float = None,\n>        zone: int = None,\n>        zoneCode: int = 6\n> ) -> float\n> ```\n> \u7531\u6307\u5b9a\u7684\u7ecf\u5ea6\u6216\u8005\u6295\u5f71\u5e26\u5e26\u53f7\u8ba1\u7b97\u6240\u59046\u5ea6\u62163\u5ea6\u6295\u5f71\u5e26\u4e2d\u592e\u5b50\u5348\u7ebf\uff08\u7ecf\u5ea6\uff09\u3002\u5982\u679c\u540c\u65f6\u6307\u5b9a\u4e86[longitude]\u548c[zone]\u53c2\u6570\uff0c\u5c06\u4f18\u5148\u4f9d\u636e[longitude]\u53c2\u6570\u8ba1\u7b97\u4e2d\u592e\u5b50\u5348\u7ebf\uff1b\u5982\u679c\u4e24\u53c2\u6570\u5747\u672a\u6307\u5b9a\uff0c\u4fbf\u8fd4\u56deNone  \n>\n> | Parameter      | Type  | Description                 |\n> |:---------------|:------|:----------------------------|\n> | longitude      | float | \u7ecf\u5ea6(\u5341\u8fdb\u5236\u5ea6)\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-180 \uff5e +180] |\n> | zone           | int   | \u4e09\u5ea6\u5e26\u5e26\u53f7\uff081\uff5e120\uff09\u6216\u8005\u516d\u5ea6\u5e26\u5e26\u53f7\uff081\uff5e60\uff09   |\n> | zoneCode       | int   | 6\u62163\uff0c\u7701\u7565\u6216\u65e0\u6548\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a6            |\n> \n> \u8fd4\u56de\u4e2d\u592e\u5b50\u5348\u7ebf\uff08\u5341\u8fdb\u5236\u5ea6\uff0c\u503c\u57df\u4e3a\uff1a[-180 \uff5e +180]\uff09\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Projection.gaussKruger***\n> ```python\n> @classmethod\n> def gaussKruger(\n>        cls,\n>        centralMeridian: float = None,\n>        x: float = None,\n>        y: float = None,\n>        longitude: float = None,\n>        latitude: float = None,\n>        crs: int = 2000\n> ) -> tuple\n> ```\n> \u9ad8\u65af\u514b\u5415\u683c\u6295\u5f71\u6b63\u53cd\u7b97\u51fd\u6570\uff0c\u4f18\u5148\u8bc6\u522b\u76f4\u89d2\u5750\u6807\uff08x\u3001y\uff09\u6267\u884c\u53cd\u7b97\uff0c\u5176\u6b21\u8bc6\u522b\u5730\u7406\u7ecf\u7eac\u5ea6\u5750\u6807\uff08longitude\u3001latitude\uff09\u5e76\u6267\u884c\u6b63\u7b97  \n>\n> | Parameter       | Type  | Description                                                                |\n> |:----------------|:------|:---------------------------------------------------------------------------|\n> | centralMeridian | float | \u4e2d\u592e\u5b50\u5348\u7ebf\u7ecf\u5ea6\uff08\u5341\u8fdb\u5236\u5ea6\u683c\u5f0f\uff0c\u7701\u7565\u6216\u7a7a\u767d\u53d6\u9ed8\u8ba4\u503c\uff1a\u6309\u516d\u5ea6\u5206\u5e26\u81ea\u52a8\u8bc6\u522b\uff09\u3002\u6ce8\u610f\uff1a\u6bd4\u4f8b\u5c3a\u5c0f\u4e8e1\u4e07\u65f6\u901a\u5e38\u91c7\u7528\u516d\u5ea6\u5206\u5e26\uff0c\u5927\u4e8e\u7b49\u4e8e1\u4e07\u65f6\u91c7\u7528\u4e09\u5ea6\u5206\u5e26      |\n> | x               | float | \u7eb5\u5750\u6807\uff08\u7c73\u5236\uff09\u6307\u5411\u5750\u6807\u5317\uff0c\u4e0e\u771f\u5317\u65b9\u5411\u76f8\u5dee\u5b50\u5348\u6536\u655b\u89d2                                                  |\n> | y               | float | \u6a2a\u5750\u6807\uff08\u7c73\u5236\uff0c\u53ef\u542b\u5e26\u53f7\uff09\u901a\u7528\u503c\u6216\u81ea\u7136\u503c                                                        |\n> | longitude       | float | \u7ecf\u5ea6\uff08\u5341\u8fdb\u5236\u5ea6\u683c\u5f0f\uff09\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-180 \uff5e +180]                                              |\n> | latitude        | float | \u7eac\u5ea6\uff08\u5341\u8fdb\u5236\u5ea6\u683c\u5f0f\uff09\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-90 \uff5e +90]                                                |\n> | crs             | int   | \u5750\u6807\u53c2\u7167\u7cfb\u5e74\u4ee3\uff081954=\u5317\u4eac\u5750\u6807\u7cfb\uff1b1980=\u897f\u5b89\u5750\u6807\u7cfb\uff1b1984=WGS84\u5750\u6807\u7cfb\uff1b2000=CGCS2000\u5750\u6807\u7cfb\uff0c\u7701\u7565\u53d6\u9ed8\u8ba4\u503c\uff1a2000\uff09  |\n> \n> \u8fd4\u56de\u6b63\u53cd\u7b97\u7ed3\u679c\u5143\u7ec4\uff08\u6a2a\u5750\u6807\uff0c\u7eb5\u5750\u6807\uff09\u3002\u6b63\u7b97\u65f6\u8fd4\u56de\u7c73\u5236\u7eb5\u5750\u6807\u548c\u6a2a\u5750\u6807\u7684\uff08\u542b\u5e26\u53f7\uff09\u901a\u7528\u503c\uff1b\u53cd\u7b97\u65f6\u8fd4\u56de\u5341\u8fdb\u5236\u7ecf\u7eac\u5ea6\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Projection.lambert***\n> ```python\n> @classmethod\n> def lambert(\n>        cls,\n>        longitude: float = None,\n>        latitude: float = None,\n>        centralMeridian: float = 0,\n>        originLatitude: float = 0,\n>        parallel1: float = 20,\n>        parallel2: float = 50,\n>        x: float = None,\n>        y: float = None,\n>        crs: int = 2000\n> ) -> tuple\n> ```\n> \u5170\u4f2f\u7279\u53cc\u6807\u51c6\u7eac\u7ebf\u7b49\u89d2\u5272\u5706\u9525\u6295\u5f71\uff08Lambert Conformal Projection\uff09\u6b63\u53cd\u7b97\u51fd\u6570\uff0c\u4f18\u5148\u8bc6\u522b\u5730\u7406\u7ecf\u7eac\u5ea6\u5750\u6807\uff08longitude\u3001latitude\uff09\u6267\u884c\u6b63\u7b97\uff0c\u5176\u6b21\u8bc6\u522b\u76f4\u89d2\u5750\u6807\uff08x\u3001y\uff09\u5e76\u6267\u884c\u53cd\u7b97  \n>\n> | Parameter       | Type  | Description                                                               |\n> |:----------------|:------|:--------------------------------------------------------------------------|\n> | longitude       | float | \u5341\u8fdb\u5236\u7ecf\u5ea6\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-180 \uff5e +180]                                                  |\n> | latitude        | float | \u5341\u8fdb\u5236\u7eac\u5ea6\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-90 \uff5e +90]                                                    |\n> | centralMeridian | float | \u4e2d\u592e\u5b50\u5348\u7ebf\u7ecf\u5ea6\uff08\u5341\u8fdb\u5236\u5ea6\u683c\u5f0f\uff0c\u9ed8\u8ba4\u503c\uff1a0\uff09\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-180 \uff5e +180]                                  |\n> | originLatitude  | float | \u5e95\u70b9\u7eac\u5ea6\uff08\u5341\u8fdb\u5236\u5ea6\uff09\uff1b\u9ed8\u8ba4\u503c\uff1a0\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-90 \uff5e +90]                                         |\n> | parallel1       | float | \u7b2c\u4e00\u6807\u51c6\u7eac\u7ebf\uff08\u5341\u8fdb\u5236\u5ea6\uff09\uff1b\u9ed8\u8ba4\u503c\uff1a20\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-90 \uff5e +90]                                      |\n> | parallel2       | float | \u7b2c\u4e8c\u6807\u51c6\u7eac\u7ebf\uff08\u5341\u8fdb\u5236\u5ea6\uff09\uff1b\u9ed8\u8ba4\u503c\uff1a50\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-90 \uff5e +90]                                      |\n> | x               | float | \u7c73\u5236\u6a2a\u5750\u6807                                                                     |\n> | y               | float | \u7c73\u5236\u7eb5\u5750\u6807                                                                     |\n> | crs             | int   | \u5750\u6807\u53c2\u7167\u7cfb\u5e74\u4ee3\uff081954=\u5317\u4eac\u5750\u6807\u7cfb\uff1b1980=\u897f\u5b89\u5750\u6807\u7cfb\uff1b1984=WGS84\u5750\u6807\u7cfb\uff1b2000=CGCS2000\u5750\u6807\u7cfb\uff0c\u7701\u7565\u53d6\u9ed8\u8ba4\u503c\uff1a2000\uff09 |\n> \n> \u8fd4\u56de\u6b63\u53cd\u7b97\u7ed3\u679c\u5143\u7ec4\uff08\u6a2a\u5750\u6807\uff0c\u7eb5\u5750\u6807\uff09\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Projection.webMercator***\n> ```python\n> @classmethod\n> def webMercator(\n>        cls,\n>        longitude: float = None,\n>        latitude: float = None,\n>        x: float = None,\n>        y: float = None\n> ) -> tuple\n> ```\n> \u7403\u4f53\u58a8\u5361\u6258\u6295\u5f71\uff08WGS84\u5750\u6807\u7cfb\uff09\u6b63\u53cd\u7b97\u51fd\u6570\uff0c\u4f18\u5148\u8bc6\u522b\u5730\u7406\u7ecf\u7eac\u5ea6\u5750\u6807\uff08longitude\u3001latitude\uff09\u6267\u884c\u6b63\u7b97\uff0c\u5176\u6b21\u8bc6\u522b\u76f4\u89d2\u5750\u6807\uff08x\u3001y\uff09\u5e76\u6267\u884c\u53cd\u7b97    \n>\n> | Parameter       | Type  | Description              |\n> |:----------------|:------|:-------------------------|\n> | longitude       | float | \u5341\u8fdb\u5236\u7ecf\u5ea6\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-180 \uff5e +180] |\n> | latitude        | float | \u5341\u8fdb\u5236\u7eac\u5ea6\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-90 \uff5e +90]   |\n> | x               | float | \u7c73\u5236\u6a2a\u5750\u6807                    |\n> | y               | float | \u7c73\u5236\u7eb5\u5750\u6807                    |\n> \n> \u8fd4\u56de\u6b63\u53cd\u7b97\u7ed3\u679c\u5143\u7ec4\uff08\u6a2a\u5750\u6807\uff0c\u7eb5\u5750\u6807\uff09\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Projection.zone***\n> ```python\n> @classmethod\n> def zone(\n>        cls,\n>        longitude: float,\n>        zoneCode: int = 6\n> ) -> int\n> ```\n> \u7531\u6307\u5b9a\u7ecf\u5ea6\u8ba1\u7b97\u516d\u5ea6\u5e26\u6216\u8005\u4e09\u5ea6\u5e26\u5e26\u53f7\uff08\u5982\u679c\u6307\u5b9a\u7684\u7ecf\u5ea6\u6070\u597d\u4f4d\u4e8e\u4e24\u4e2a\u6295\u5f71\u5e26\u7684\u4e2d\u95f4\uff0c\u4fbf\u53d6\u53f3\u4fa7\u5e26\u53f7\uff09  \n>\n> | Parameter      | Type  | Description                 |\n> |:---------------|:------|:----------------------------|\n> | longitude      | float | \u7ecf\u5ea6(\u5341\u8fdb\u5236\u5ea6)\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-180 \uff5e +180] |\n> | zoneCode       | int   | 6\u62163\uff0c\u7701\u7565\u6216\u65e0\u6548\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a6            |\n> \n> \u8fd4\u56de\u516d\u5ea6\u6216\u4e09\u5ea6\u5e26\u5e26\u53f7\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Projection.angle***\n> ```python\n> @staticmethod\n> def angle(\n>        deg: float | str = None,\n>        dms: float | str = None,\n>        digit: int | str = None\n> ) -> float | str\n> ```\n> \u5341\u8fdb\u5236\u89d2\u5ea6\u4e0e\u516d\u5341\u8fdb\u5236\u5ea6\u5206\u79d2\u8f6c\u6362\u51fd\u6570\uff0c\u4f18\u5148\u8bc6\u522b\u5341\u8fdb\u5236\u89d2\u5ea6\uff08deg\uff09\uff0c\u5176\u6b21\u8bc6\u522b\u516d\u5341\u8fdb\u5236\u5ea6\u5206\u79d2\uff08dms\uff09  \n>\n> | Parameter | Type       | Description                                                          |\n> |:----------|:-----------|:---------------------------------------------------------------------|\n> | deg       | float str  | \u5341\u8fdb\u5236\u89d2\u5ea6\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-360 \uff5e +360]\u3002\u5982\u679c\u540c\u65f6\u6307\u5b9a\u4e86[deg]\u548c[dms]\u53c2\u6570\uff0c[deg]\u53c2\u6570\u5c06\u4f18\u5148\u8bc6\u522b\u5e76\u5ffd\u7565[dms]\u53c2\u6570 |\n> | dms       | float str  | \u516d\u5341\u8fdb\u5236\u5ea6\u5206\u79d2\uff0c\u5ea6\u7684\u5b9a\u4e49\u57df\u4e3a\uff1a[-360 \uff5e +360]\uff0c\u683c\u5f0f\u4e3a\uff1a\u5341\u8fdb\u5236\u5ea6\u3001\u5ea6\u5206\u5206\u79d2\u79d2\u3001x\u5ea6xx\u5206xx\u79d2\u3001x\u00b0x\u2032x.x\u2033        |\n> | digit     | float str  | \u79d2\u503c\u7684\u5c0f\u6570\u4f4d\uff080\uff1a\u6309\u56db\u820d\u4e94\u5165\u53d6\u6574\uff1b\u5927\u4e8e0\uff1a\u6309\u56db\u820d\u4e94\u5165\u53d6\u6307\u5b9a\u4f4d\u6570\uff1b\u5ffd\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a\u53cc\u7cbe\u5ea6\u6700\u957f\u6709\u6548\u4f4d\uff09                    |\n> \n> \u8fd4\u56de\u8f6c\u6362\u7ed3\u679c\uff08deg -> dms \u8fd4\u56de\u5b57\u7b26\u4e32\uff1b dms -> deg \u8fd4\u56de\u6d6e\u70b9\u6570\u503c\uff09\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n> \n> \u793a\u4f8b\uff1a\n>> ```python\n>> ellipsoid.Projection.angle(deg=123.456789) \n>> # 123\u00b027\u203224.440400000002\u2033\n>> ellipsoid.Projection.angle(dms='123\u00b027\u203224.4404\u2033')\n>> # 123.456789\n>> ellipsoid.Projection.angle(dms='123\u5ea627\u520624.4404\u79d2')\n>> # 123.456789\n>> ellipsoid.Projection.angle(dms='27\u520624.4404\u79d2')\n>> # 0.456789\n>> ellipsoid.Projection.angle(dms='1232724.4404')\n>> # 123.456789\n>> ```\n\n*****\n* ### Class ProjectionHelper(Projection)\n\n*****\n\n***ProjectionHelper()***\n> ```python\n> def __init__(\n>        self,\n>        sourceProjection: str | int = None,\n>        targetProjection: str | int = None,\n>        sourceScale: int = 1,\n>        targetScale: int = 1\n> )  \n> ```\n> \u5b9e\u4f8b\u521d\u59cb\u5316\u51fd\u6570\u3002\u5982\u679c\u539f\u59cb\u4e0e\u76ee\u6807\u6295\u5f71\u4e00\u81f4\u65f6\u53d8\u6362\u5668\u5c06\u8bbe\u7f6e\u4e3a\uff1aNone \n>\n> | Parameter        | Type    | Description                                                                                   |\n> |:-----------------|:--------|:----------------------------------------------------------------------------------------------|\n> | sourceProjection | str int | \u539f\u59cb\u6295\u5f71\uff08\u652f\u6301\uff1awkt/proj4/epsg\uff09\uff0c\u9ed8\u8ba4\u91c7\u7528\u7ecf\u7eac\u5ea6\u65e0\u6295\u5f71\uff08EPSG:4326\uff09\u683c\u5f0f\u3002\u6ce8\uff1a\u6b64\u53c2\u6570\u5185\u5bb9\u901a\u5e38\u53ef\u91c7\u7528\u3010definition\u3011\u7c7b\u51fd\u6570\u83b7\u53d6\uff0c\u5982\u679c\u53c2\u6570\u4e0d\u7b26\u5408\u89c4\u5b9a\uff0c\u4fbf\u629b\u51fa\u5f02\u5e38 |\n> | targetProjection | str int | \u76ee\u6807\u6295\u5f71\uff08\u652f\u6301\uff1awkt/proj4/epsg\uff09\uff0c\u9ed8\u8ba4\u91c7\u7528\u7ecf\u7eac\u5ea6\u65e0\u6295\u5f71\uff08EPSG:4326\uff09\u683c\u5f0f\u3002\u6ce8\uff1a\u6b64\u53c2\u6570\u5185\u5bb9\u901a\u5e38\u53ef\u91c7\u7528\u3010definition\u3011\u7c7b\u51fd\u6570\u83b7\u53d6\uff0c\u5982\u679c\u53c2\u6570\u4e0d\u7b26\u5408\u89c4\u5b9a\uff0c\u4fbf\u629b\u51fa\u5f02\u5e38 |\n> | sourceScale      | int     | \u539f\u59cb\u6bd4\u4f8b\u5c3a\u5206\u6bcd\uff08\u4e0d\u9488\u5bf9\u5730\u7406\u5750\u6807\u7cfb\u548c\u7403\u4f53\u58a8\u5361\u6258\uff09\uff0c\u9ed8\u8ba4\uff1a1                                                                  |\n> | targetScale      | int     | \u76ee\u6807\u6bd4\u4f8b\u5c3a\u5206\u6bcd\uff08\u4e0d\u9488\u5bf9\u5730\u7406\u5750\u6807\u7cfb\u548c\u7403\u4f53\u58a8\u5361\u6258\uff09\uff0c\u9ed8\u8ba4\uff1a1                                                                  |\n> \n> \u793a\u4f8b\uff1a\n>> ```python\n>> toGaussKruger = ellipsoid.ProjectionHelper(\n>>         sourceProjection=4326,\n>>         targetProjection=ellipsoid.ProjectionHelper.definition(projection=\"GaussKruger\", centralMeridian=99)\n>>     )  \n>>   \n>> fromGaussKruger = ellipsoid.ProjectionHelper(\n>>         sourceProjection=ellipsoid.ProjectionHelper.definition(projection=\"GaussKruger\", centralMeridian=99),\n>>         targetProjection=4326\n>>     )\n>> ```\n\n***ProjectionHelper.definition***\n> ```python\n> @classmethod\n> def definition(\n>        cls,\n>        projection: str = 'GaussKruger',\n>        crs: int = 2000,\n>        centralMeridian: float | None = None,\n>        originLatitude: float = 0.0,\n>        falseEasting: float | None = None,\n>        falseNorthing: float = 0.0,\n>        standard_parallel_1: float = 25.0,\n>        standard_parallel_2: float = 47.0\n> ) -> str\n> ```\n> \u5b9a\u4e49\u6295\u5f71\u53c2\u6570\u3002\u9488\u5bf9\u4e2d\u56fd\u9646\u57df\u91c7\u7528\u7684\u9ad8\u65af\u514b\u5415\u683c\uff08\u901a\u7528\u6a2a\u8f74\u58a8\u5361\u6258\uff09\u6295\u5f71\u3001\u53cc\u6807\u51c6\u7eac\u7ebf\u963f\u5c14\u535a\u65af\u7b49\u79ef\u6216\u5170\u4f2f\u7279\u7b49\u89d2\u5272\u5706\u9525\u6295\u5f71\u4ee5\u53ca\u7403\u4f53\u58a8\u5361\u6258\u6295\u5f71\uff0c\u53ef\u4f9d\u636e\u6307\u5b9a\u7684\u53c2\u8003\u692d\u7403\u5750\u6807\u7cfb\u4ee3\u53f7\u3001\u4e2d\u592e\u5b50\u5348\u7ebf\u7b49\u53c2\u6570\u521b\u5efa\u6295\u5f71\u53d8\u6362\u5668\u6240\u9700\u7684\u6295\u5f71\u53c2\u6570  \n>\n> | Parameter            | Type       | Description                                                                     |\n> |:---------------------|:-----------|:--------------------------------------------------------------------------------|\n> | projection           | str        | \u6295\u5f71\u540d\u79f0\uff1b\u652f\u6301\uff1a'GaussKruger'\uff08\u9ed8\u8ba4\uff09\u3001'Lambert'\u3001'Albers'\u3001'WebMercator'                      |\n> | crs                  | int        | \u5750\u6807\u53c2\u7167\u7cfb\u5e74\u4ee3\uff081954=\u5317\u4eac\u5750\u6807\u7cfb\uff1b1980=\u897f\u5b89\u5750\u6807\u7cfb\uff1b1984=WGS84\u5750\u6807\u7cfb\uff1b2000=CGCS2000\u5750\u6807\u7cfb\uff0c\u7701\u7565\u6216\u65e0\u6548\u65f6\u53d6\u5f3a\u53d6\u9ed8\u8ba4\u503c\uff1a2000\uff09 |\n> | centralMeridian      | float None | \u4e2d\u592e\u5b50\u5348\u7ebf\u7ecf\u5ea6\uff08\u5341\u8fdb\u5236\u5ea6\uff09\uff1b\u9488\u5bf9\u9ad8\u65af\u6295\u5f71\u548c\u58a8\u5361\u6258\u6295\u5f71\uff0c\u9ed8\u8ba4\uff1a0\uff1b\u5176\u4ed6\u6295\u5f71\u9ed8\u8ba4\uff1a105\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-180 \uff5e +180]                   |\n> | originLatitude       | float      | \u539f\u70b9\u7eac\u5ea6\uff08\u5341\u8fdb\u5236\u5ea6\uff09\uff1b\u9ed8\u8ba4\u503c\uff1a0\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-90 \uff5e +90]                                               |\n> | falseEasting         | float None | \u6a2a\u8f74\u5e73\u79fb\u91cf\uff0c\u901a\u5e38\u662f\u7c73\u5236\u81ea\u7136\u503c\u524d\u7f00\u5c31\uff0c\u9488\u5bf9\u9ad8\u65af\u6295\u5f71\u800c\u8a00\uff0c\u9ed8\u8ba4\uff1a500000\uff0c\u901a\u7528\u503c\u524d\u9762\u4e0d\u53ef\u643a\u5e26\u6295\u5f71\u5e26\u53f7\uff1b\u5176\u4ed6\u6295\u5f71\u9ed8\u8ba4\uff1a0                     |\n> | falseNorthing        | float      | \u7eb5\u8f74\u5e73\u79fb\u91cf\uff0c\u7c73\u5236\uff0c\u9ed8\u8ba4\uff1a0                                                                   |\n> | standard_parallel_1  | float      | \u4e0b\u9762\u7b2c\u4e00\u6807\u51c6\u7eac\u7ebf\uff08\u5982\uff1a25\uff09\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-90 \uff5e +90]                                                 |\n> | standard_parallel_2  | float      | \u4e0a\u9762\u7b2c\u4e8c\u6807\u51c6\u7eac\u7ebf\uff08\u5982\uff1a47\uff09\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-90 \uff5e +90]                                                 |\n> \n> \u8fd4\u56de\u6295\u5f71\u53d8\u6362\u5668\u6240\u9700\u7684\u6295\u5f71\u5b57\u7b26\u4e32\uff08wkt\u683c\u5f0f\uff09\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38  \n> \n> \u793a\u4f8b\uff1a\n>> ```python\n>> ellipsoid.ProjectionHelper.definition(projection=\"GaussKruger\", centralMeridian=99)  \n>> # PROJCS[\"GRS 1980 / Gauss-Kruger\",GEOGCS[\"GRS 1980\",DATUM[\"GRS_1980\",SPHEROID[\"GRS 1980\",6378137.0,298.257222101,AUTHORITY[\"EPSG\",\"1024\"]],AUTHORITY[\"EPSG\",\"1043\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4490\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0.0],PARAMETER[\"central_meridian\",99],PARAMETER[\"false_easting\",500000.0],PARAMETER[\"false_northing\",0.0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Northing\",NORTH],AXIS[\"Easting\",EAST]]  \n>> ```\n\n***ProjectionHelper\u5b9e\u4f8b.project***\n> ```python\n> def project(\n>        self,\n>        geometry: dict\n> ) -> dict\n> ```\n> \u5750\u6807\u51e0\u4f55\u6295\u5f71\u53d8\u6362  \n>\n> | Parameter           | Type       | Description                                                                                                                                      |\n> |:--------------------|:-----------|:-------------------------------------------------------------------------------------------------------------------------------------------------|\n> | geometry            | dict       | \u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff08Point\u3001MultiPoint\u3001LineString\u3001MultiLineString\u3001Polygon\u3001MultiPolygon\u3001GeometryCollection\uff09\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> \n> \u8fd4\u56de\u7b26\u5408\u3010GeoJson-geometry\u3011\u683c\u5f0f\u7684\u5b57\u5178\u7c7b\u578b\u5bf9\u8c61\uff0c\u5b57\u5178\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38 \n> \n> \u793a\u4f8b\uff1a\n>> ```python\n>> toGaussKruger.project({'type': 'Point', 'coordinates': [100, 36]})\n>> # {'type': 'Point', 'coordinates': [590165.115456953, 3986005.1900442634]}   \n>> fromGaussKruger.project({'type': 'Point', 'coordinates': [590165.115456953, 3986005.1900442634]})  \n>> # {'type': 'Point', 'coordinates': [100.0, 36.0]}\n>> ```\n\n*****\n* ### Class Topology(Geometry)\n\n*****\n\n***Topology.area***\n> ```python\n> @classmethod\n> def area(\n>        cls,\n>        coordinates: str | list | dict,\n>        crs: int = 2000\n> ) -> dict\n> ```\n> \u7531\u7b26\u5408\u3010WKT/WKB\u3001GeoJson\u3001\u81ea\u7531/\u7b80\u7ea6\u6587\u672c\u3011\u683c\u5f0f\u7684\u591a\u8fb9\u5f62\u5750\u6807\u4e32\u6216\u8005\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5b57\u5178\u6216\u5750\u6807\u5217\u8868\u8ba1\u7b97\u5176\u9762\u79ef\u3001\u5468\u957f\u4e0e\u8fb9\u754c\u3002\u82e5\u6574\u4e2a\u8303\u56f4\u4f4d\u4e8e\u540c\u4e00\u4e2a\u516d\u5ea6\u6295\u5f71\u5e26\u4e14\u6307\u5b9a\u7684\u5750\u6807\u7cfb\u4ee3\u53f7\u5c5e\u4e8e\u5317\u4eac\u6216\u897f\u5b89\u6216\u56fd\u5bb6\u5750\u6807\u7cfb\u4fbf\u6309\u9ad8\u65af-\u514b\u5415\u683c\u6295\u5f71\u8fdb\u884c\u8ba1\u7b97\uff0c\u5426\u5219\u5c3d\u53ef\u80fd\u6309WGS84\u4e0b\u7684\u7403\u4f53\u58a8\u5361\u6258\u6295\u5f71\u8ba1\u7b97\n>\n> | Parameter   | Type          | Description                                                                                                                                                                         |\n> |:------------|:--------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | coordinates | dict list str | \u7b26\u5408\u3010WKT/WKB\u3001GeoJson\u3001\u81ea\u7531/\u7b80\u7ea6\u6587\u672c\u3011\u683c\u5f0f\u7684\u591a\u8fb9\u5f62\u5750\u6807\u4e32\u6216\u8005\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5b57\u5178\u6216\u5750\u6807\u5217\u8868\uff0c\u652f\u6301\u5355\u9762\u3001\u6bcd\u5b50\u9762\u548c\u591a\u9762\u7c7b\u578b\u3002\u5982\u679c\u662f\u5217\u8868\u6216\u8005\u5b57\u5178\u7c7b\u578b\uff0c\u6267\u884c\u5b8c\u6210\u540e\u53ef\u56de\u9988\u7ecf\u81ea\u52a8\u5c06\u7ebf\u73af\u5c01\u95ed\u5e76\u5254\u9664\u76f8\u90bb\u7684\u91cd\u590d\u9876\u70b9\u540e\u7684\u5b9e\u53c2\u7ed3\u679c\uff0c\u4e5f\u5f3a\u5236\u5c06\u6700\u5927\u9762\u79ef\u7684\u73af\u7ebf\u8c03\u6574\u5230\u7b2c\u4e00\u4e2a\u7d22\u5f15\u4f4d\uff08\u5145\u5f53\u6bcd\u533a\uff09\uff0c\u540c\u65f6\u4f9d\u636e\u53f3\u624b\u5b9a\u5219\uff08\u6bcd\u533a\u4e3a\u9006\u65f6\u9488\uff0c\u5b50\u533a\u4e3a\u987a\u65f6\u9488\uff09\u8c03\u6574\u591a\u8fb9\u5f62\u7684\u65cb\u8f6c\u65b9\u5411 |\n> | crs         | int           | \u5750\u6807\u53c2\u7167\u7cfb\u5e74\u4ee3\uff081954=\u5317\u4eac\u5750\u6807\u7cfb\uff1b1980=\u897f\u5b89\u5750\u6807\u7cfb\uff1b1984=WGS84\u5750\u6807\u7cfb\uff1b2000=CGCS2000\u5750\u6807\u7cfb\uff0c\u7701\u7565\u53d6\u9ed8\u8ba4\u503c\uff1a2000\u3002\u5176\u4ed6\u503c\uff08\u6bd4\u5982\uff1a0\uff09\u5c06\u4e0d\u8fdb\u884c\u6295\u5f71\u53d8\u6362\u5e76\u8fd4\u56de\u7b1b\u5361\u5c14\u5750\u6807\u7cfb\u591a\u8fb9\u5f62\u9762\u79ef\uff09                                                                           |\n> \n> \u8fd4\u56de\u7531\u591a\u8fb9\u5f62\u7c7b\u578b\uff08Polygon/MultiPolygon\uff09\u3001\u9762\u79ef\uff08\u6bcd\u533a\u6263\u9664\u6240\u5c5e\u5b50\u533a\u4e4b\u540e\u7684\u5269\u4f59\u9762\u79ef\uff0c\u5176\u91cf\u7eb2\u53d6\u51b3\u4e8e\u6307\u5b9a\u7684crs\u53c2\u6570\u503c\uff09\u3001\u5468\u957f\uff08\u6bcd\u533a\u7ebf\u73af\u957f\u5ea6\uff0c\u5176\u91cf\u7eb2\u53d6\u51b3\u4e8e\u6307\u5b9a\u7684crs\u53c2\u6570\u503c\uff09\u4e0e\u8fb9\u754c\u6784\u6210\u7684\u5b57\u5178\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38  \n> \n> \u793a\u4f8b\uff1a\n>> ```python\n>> ellipsoid.Topology.area({\"type\":\"Polygon\",\"coordinates\":[[[0, 0], [10, 0], [10, 10], [0, 10],[0, 0]]]}, crs=0)  # \u666e\u901a\u5750\u6807\u7cfb\uff0c\u591a\u8fb9\u5f62\u6b63\u5e38\u5c01\u95ed\n>> # {'area': 100.0, 'perimeter': 40.0, 'boundary': {'west': 0.0, 'south': 0.0, 'east': 10.0, 'north': 10.0}}  \n>> \n>> polygon = {\"type\":\"Polygon\",\"coordinates\":[[[0, 0], [10, 0], [10, 10], [10, 10], [0, 10]]]}  # \u591a\u8fb9\u5f62\u5b58\u5728\u91cd\u5408\u70b9\u4e14\u672a\u5c01\u95ed\n>> ellipsoid.Topology.area(polygon, crs=0)\n>> # {'area': 100.0, 'perimeter': 40.0, 'boundary': {'west': 0.0, 'south': 0.0, 'east': 10.0, 'north': 10.0}}\n>> # polygon \u5f62\u53c2\u53d8\u91cf\u5df2\u81ea\u52a8\u66f4\u6539\u4e3a\uff1a{'type': 'Polygon', 'coordinates': [[[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]]]}  # \u591a\u8fb9\u5f62\u91cd\u5408\u70b9\u5df2\u5254\u9664\u4e14\u9996\u5c3e\u70b9\u5c01\u95ed\n>> \n>> ellipsoid.Topology.area({\"type\":\"Polygon\",\"coordinates\":[[[0, 0], [10, 0], [10, 10], [0, 10],[0, 0]]]}, crs=2000) # CGCS2000\u5750\u6807\u7cfb\n>> # {'area': 1232873617757.2869, 'perimeter': 4441466.499008763, 'boundary': {'west': 0.0, 'south': 0.0, 'east': 10.0, 'north': 10.0}}\n>> ```\n\n***Topology.buffer***\n> ```python\n> @classmethod\n> def buffer(\n>        cls,\n>        geometry: dict | list | str,\n>        distance: float,\n>        quad_segs: int = 8,\n>        cap_style: shapely.BufferCapStyle = 'round',\n>        join_style: shapely.BufferJoinStyle = 'round',\n>        mitre_limit: float = 5.0,\n>        single_sided: bool = False\n> ) -> shapely.geometry\n> ```\n> \u5229\u7528\u6b63\u8d1f\u7f13\u51b2\u8ddd\u79bb\u8ba1\u7b97\u6307\u5b9a\u51e0\u4f55\u4f53\u7684\u7f13\u51b2\u533a  \n>\n> | Parameter     | Type                    | Description                                                                                                 |\n> |:--------------|:------------------------|:------------------------------------------------------------------------------------------------------------|\n> | geometry      | dict list str           | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4 |\n> | distance      | float                   | \u7f13\u51b2\u534a\u5f84\u662f\u91c7\u7528\u95f5\u53ef\u592b\u65af\u57fa[\u548c\u6216\u5dee]\u7528\u4e8e\u8ba1\u7b97\u4e24\u4e2a\u51f8\u5305\u7684[\u5e76\u6216\u5dee]\u96c6                                                                            |\n> | quad_segs     | int                     | \u6307\u5b9a\u7b49\u5206\u5706\u7684\u5f27\u957f\u5bf9\u5e94\u7684\u7ebf\u6bb5\u6570\uff0c\u9ed8\u8ba4\u503c\uff1a8                                                                                        |\n> | cap_style     | shapely.BufferCapStyle  | \u7f13\u51b2\u7ebf\u7aef\u70b9\u5f62\u72b6\uff0c\u652f\u6301\uff1a\u2018round\u2019\uff08\u9ed8\u8ba4\uff09\u3001\u2018square\u2019\u3001\u2018flat\u2019                                                                      |\n> | join_style    | shapely.BufferJoinStyle | \u7f13\u51b2\u7ebf\u4e2d\u70b9\u7684\u5f62\u72b6\uff0c\u652f\u6301\uff1a\u2018round\u2019\uff08\u9ed8\u8ba4\uff09\u3001\u2018square\u2019\u3001\u2018flat\u2019                                                                     |\n> | mitre_limit   | float                   | \u70b9\u4e0e\u7f13\u51b2\u9876\u70b9\u7684\u4f4d\u79fb\u9650\u5236\uff0c\u8d85\u8fc7\u65f6\u5c06\u4fee\u526a\u201c\u659c\u5207\u201d\u8fde\u63a5\u6837\u5f0f\uff0c\u9ed8\u8ba4\u503c\uff1a5.0                                                                          |\n> | single_sided  | bool                    | \u662f\u5426\u4ec5\u5728\u51e0\u4f55\u4f53\u7684\u67d0\u4e00\u4fa7\u751f\u6210\u7f13\u51b2\u533a\uff1f\u9ed8\u8ba4\u503c\uff1aFalse                                                                                  |\n> \n> \u8fd4\u56de\u6309\u6307\u5b9a\u7684\u7f13\u51b2\u534a\u5f84\u8fdb\u884c\u6269\u5c55\u6216\u6536\u7f29\u540e\u7684\u51e0\u4f55\u90e8\u4ef6\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38 \n\n***Topology.build***\n> ```python\n> @classmethod\n> def build(\n>        cls,\n>        coordinates: str | list | dict\n> ) -> dict\n> ```\n> \u5efa\u7acb\u62d3\u6251\u5173\u7cfb\uff0c\u8fd4\u56de\u7ed3\u679c\u4e3b\u8981\u5305\u62ec\u901a\u5e38\u7528\u4e8e\u6807\u6ce8\u51e0\u4f55\u4f53\u7684\u62d3\u6251\u5185\u70b9\u3001\u6700\u5927\u8fb9\u6846\u8303\u56f4\u4ee5\u53ca\u9762\u79ef\u548c\u957f\u5ea6\u4e0e\u51e0\u4f55\u7c7b\u578b\u4fe1\u606f\u3002\u5176\u4e2d\uff0c\u83b7\u53d6\u7684\u62d3\u6251\u5185\u70b9\u4f4d\u7f6e\u5177\u6709\u51e0\u4f55\u6784\u56fe\u5408\u7406\u6027\uff1a\u591a\u70b9\u4ee5\u8ddd\u79bb\u4e2d\u5fc3\u4f4d\u7f6e\u6700\u8fd1\u4e3a\u51c6\uff0c\u591a\u7ebf\u4ee5\u6700\u957f\u7ebf\u6bb5\u4e3a\u51c6\uff0c\u591a\u9762\u4ee5\u6700\u5927\u9762\u79ef\u7684\u591a\u8fb9\u5f62\u4e3a\u51c6\u4e14\u6709\u6548\u56de\u907f\u201c\u6e56\u4e2d\u5c9b\u201d \n>\n> | Parameter    | Type                    | Description                                                                                                                                       |\n> |:-------------|:------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------|\n> | coordinates  | dict list str           | \u7b26\u5408\u3010WKT/WKB\u3001GeoJson\u3001\u81ea\u7531/\u7b80\u7ea6\u6587\u672c\u3011\u683c\u5f0f\u7684\u591a\u8fb9\u5f62\u5750\u6807\u4e32\u6216\u8005\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5b57\u5178\u6216\u5750\u6807\u5217\u8868\u3002\u6ce81\uff1a\u5217\u8868\u7c7b\u578b\u4e0d\u8bc6\u522b\u3010MultiPoint\u3011\u548c\u3010MultiLineString\u3011\u7c7b\u578b\uff1b\u6ce82\uff1a\u9488\u5bf9\u3010GeometryCollection\u3011\u7c7b\u578b\u7684\u8fd4\u56de\u503c\u662f\u603b\u8fb9\u6846\u548c\u603b\u4e2d\u5fc3\u4f4d\u7f6e |\n> \n> \u8fd4\u56de\u7531\u62d3\u6251\u5185\u70b9\u3001\u62d3\u6251\u8fb9\u6846\u3001\u62d3\u6251\u5468\u957f\u3001\u62d3\u6251\u9762\u79ef\u3001\u62d3\u6251\u957f\u5ea6\u4e0e\u51e0\u4f55\u7c7b\u578b\u7b49\u6784\u6210\u7684\u5b57\u5178\u5bf9\u8c61\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38  \n> \n> \u793a\u4f8b\uff1a\n>> ```python\n>> ellipsoid.Topology.build({\"type\":\"Polygon\",\"coordinates\":[[[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]]]})\n>> # {'centroid': {'x': 5.0, 'y': 5.0}, 'perimeter': 40.0, 'area': 100.0, 'boundary': {'west': 0.0, 'south': 0.0, 'east': 10.0, 'north': 10.0}, 'type': 'Polygon'}\n>> ``` \n\n***Topology.check***\n> ```python\n> @classmethod\n> def check(\n>        cls,\n>        geometries: list,\n>        mask: int = 31\n> ) -> dict | None\n> ```\n> \u6267\u884c\u62d3\u6251\u68c0\u67e5\u5e76\u8fd4\u56de\u68c0\u67e5\u7ed3\u679c\u3002\n>\n> | Parameter  | Type | Description                                                                                                                                                                                  |\n> |:-----------|:-----|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | geometries | list | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\u7684\u5217\u8868                                                                                                                                                                   |\n> | mask       | int  | \u62d3\u6251\u8fd0\u7b97\u63a9\u819c\uff0c\u6682\u652f\u6301\u7684\u62d3\u6251\u9009\u9879\u5305\u62ec\uff1a1=00000001=Overlap-\u91cd\u5408\u8282\u70b9\u30012=00000010=DangleNode-\u60ac\u6302\u8282\u70b9\u30014=00000100=PseudoNode-\u4f2a\u8282\u70b9\u30018=00001000=SelfIntersection-\u81ea\u76f8\u4ea4\u8282\u70b9\u300116=00010000=Intersection-\u4e92\u76f8\u4ea4\u8282\u70b9\u3002\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a31=\u68c0\u67e5\u6240\u6709\u9879\u76ee;0=\u4e0d\u68c0\u67e5\u4efb\u4f55\u9879\u76ee |\n> \n> \u8fd4\u56de\u62d3\u6251\u68c0\u67e5\u7ed3\u679c\u5b57\u5178\u5bf9\u8c61\uff0c\u4e0d\u6267\u884c\u62d3\u6251\u68c0\u67e5\u6216\u8005\u672a\u53d1\u73b0\u62d3\u6251\u95ee\u9898\u65f6\u8fd4\u56deNone\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38  \n> \u7ed3\u679c\u6a21\u677f\u5982\u4e0b\uff1a\n>> ```python\n>> # \u70b9\u8981\u7d20\u7c7b\u8fd4\u56de\u7684\u68c0\u67e5\u7ed3\u679c\uff08\u91cd\u5408\u70b9\u95ee\u9898\uff09\u6a21\u677f  \n>>   {\n>>        'point': [\n>>            {'flag': 'Overlap', 'type': 'Point', 'coordinates': [x, y]} \u6216\u8005 {'flag': 'Overlap', 'type': 'MultiPoint', 'coordinates': [[x, y],...]}\n>>        ]\n>>   }\n>> \n>> # \u7ebf\u8981\u7d20\u7c7b\u8fd4\u56de\u7684\u68c0\u67e5\u7ed3\u679c\uff08\u76f8\u90bb\u91cd\u5408\u70b9\u3001\u81ea\u76f8\u4ea4\u3001\u4e92\u76f8\u4ea4\u3001\u60ac\u6302\u8282\u70b9\u548c\u4f2a\u8282\u70b9\u95ee\u9898\uff09\u6a21\u677f  \n>>   {\n>>        'line': [\n>>            {'flag': 'Overlap', 'type': 'Point', 'coordinates': [x, y]} \u6216\u8005 {'flag': 'Overlap', 'type': 'MultiPoint', 'coordinates': [[x, y],...]}\n>>            {'flag': 'SelfIntersection', 'type': 'Point', 'coordinates': [x, y]} \u6216\u8005 {'flag': 'SelfIntersection', 'type': 'MultiPoint', 'coordinates': [[x, y],...]}\n>>            {'flag': 'Intersection', 'type': 'Point', 'coordinates': [x, y]} \u6216\u8005 {'flag': 'Intersection', 'type': 'MultiPoint', 'coordinates': [[x, y],...]}\n>>            {'flag': 'DangleNode', 'type': 'Point', 'coordinates': [x, y]} \u6216\u8005 {'flag': 'DangleNode', 'type': 'MultiPoint', 'coordinates': [[x, y],...]}\n>>            {'flag': 'PseudoNode', 'type': 'Point', 'coordinates': [x, y]} \u6216\u8005 {'flag': 'PseudoNode', 'type': 'MultiPoint', 'coordinates': [[x, y],...]}\n>>        ]\n>>   }\n>> # \u6ce8\uff1a\u5c01\u95ed\u7684\u7ebf\u8981\u7d20\u9996\u5c3e\u70b9\u5c06\u89c6\u4e3a\u4f2a\u8282\u70b9\uff0c\u4e0d\u6309\u81ea\u76f8\u4ea4\u95ee\u9898\u5bf9\u5f85\n>> \n>> # \u9762\u8981\u7d20\u7c7b\u8fd4\u56de\u7684\u68c0\u67e5\u7ed3\u679c\uff08\u76f8\u90bb\u91cd\u5408\u70b9\u3001\u81ea\u76f8\u4ea4\u3001\u4e92\u76f8\u4ea4\u3001\u672a\u5c01\u95ed\u7684\u60ac\u6302\u8282\u70b9\u95ee\u9898\uff09\u6a21\u677f\n>>   {\n>>        'polygon': [\n>>            {'flag': 'Overlap', 'type': 'Point', 'coordinates': [x, y]} \u6216\u8005 {'flag': 'Overlap', 'type': 'MultiPoint', 'coordinates': [[x, y],...]}\n>>            {'flag': 'SelfIntersection', 'type': 'Point', 'coordinates': [x, y]} \u6216\u8005 {'flag': 'SelfIntersection', 'type': 'MultiPoint', 'coordinates': [[x, y],...]}\n>>            {'flag': 'Intersection', 'type': 'Point', 'coordinates': [x, y]} \u6216\u8005 {'flag': 'Intersection', 'type': 'MultiPoint', 'coordinates': [[x, y],...]}\n>>            {'flag': 'DangleNode', 'type': 'Point', 'coordinates': [x, y]} \u6216\u8005 {'flag': 'DangleNode', 'type': 'MultiPoint', 'coordinates': [[x, y],...]}\n>>        ]\n>>   }\n>> ``` \n> \n> \u793a\u4f8b\uff1a\n>> ```python\n>> ellipsoid.Topology.check(\n>>         [\n>>              {\"type\":\"MultiPoint\",\"coordinates\":[[0, 0], [1, 1], [1, 1]]},\n>>              {\"type\":\"Polygon\",\"coordinates\":[[[0, 0], [10, 0], [10, 10], [10, 10], [0, 10]]]}\n>>         ]\n>>    )\n>> #  {\n>> #       'point': \n>> #            [\n>> #                {'flag': 'Overlap', 'type': 'Point', 'coordinates': [1.0, 1.0]}\n>> #            ], \n>> #       'polygon': \n>> #            [\n>> #                {'flag': 'Overlap', 'type': 'Point', 'coordinates': [10, 10]}, \n>> #                {'flag': 'DangleNode', 'type': 'MultiPoint', 'coordinates': [[0.0, 0.0], [0.0, 10.0]]}\n>> #            ]\n>> #  }\n>> ``` \n\n***Topology.clearance***\n> ```python\n> @classmethod\n> def clearance(\n>         cls,\n>         geometry: dict | list | str\n> ) -> float\n> ```\n> \u4f9d\u636e\u6307\u5b9a\u51e0\u4f55\u4e2d\u7684\u9876\u70b9\u5bc6\u5ea6\u8ba1\u7b97\u6700\u5c0f\u5bb9\u5dee\u8ddd\u79bb\uff0c\u6b64\u8ddd\u79bb\u662f\u6307\u5982\u679c\u79fb\u52a8\u9876\u70b9\u4fbf\u4f1a\u9020\u6210\u51e0\u4f55\u5931\u771f   \n>  \n> | Parameter | Type                   | Description                                                 |\n> |:----------|:-----------------------|:------------------------------------------------------------|\n> | geometry  | dict list str          | \u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> \n> \u8fd4\u56de\u6700\u5c0f\u5bb9\u5dee\u8ddd\u79bb\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\uff08\u5305\u62ec\u65e0\u7a77\u5927\u3001\u65e0\u7a77\u5c0f\u548c\u975e\u6570\u503c\uff09\n\n***Topology.clip***\n> ```python\n> @classmethod\n> def clip(\n>         cls,\n>         geometry: dict | list | str,\n>         west: float,\n>         south: float,\n>         east: float,\n>         north: float\n> ) -> shapely.geometry\n> ```\n> \u5229\u7528\u6307\u5b9a\u7684\u77e9\u5f62\u8fb9\u754c\u5bf9\u6307\u5b9a\u7684\u51e0\u4f55\u8fdb\u884c\u88c1\u526a\u3002\u88c1\u526a\u540e\u7684\u51e0\u4f55\u53ef\u80fd\u4e0d\u4e25\u683c\u7b26\u5408\u62d3\u6251\u8981\u6c42\n>  \n> | Parameter | Type          | Description                                                                                                 |\n> |:----------|:--------------|:------------------------------------------------------------------------------------------------------------|\n> | geometry  | dict list str | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4 |\n> | west      | float         | \u897f\u8fb9\u754c                                                                                                         |\n> | south     | float         | \u5357\u8fb9\u754c                                                                                                         |\n> | east      | float         | \u4e1c\u8fb9\u754c                                                                                                         |\n> | north     | float         | \u5317\u8fb9\u754c                                                                                                         |\n> \n> \u8fd4\u56de\u88c1\u526a\u540e\u7684\u51e0\u4f55\u90e8\u4ef6\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Topology.contains***\n> ```python\n> @classmethod\n> def contains(\n>         cls,\n>         a: dict | list | str,\n>         b: dict | list | str\n> ) -> bool\n> ```\n> \u5224\u65ad[a]\u51e0\u4f55\u662f\u5426\u5c06[b]\u51e0\u4f55\u5b8c\u5168\u5305\u542b\u3002\u6ce8\uff1acontains(a, b) == within(b, a)\n>  \n> | Parameter | Type           | Description                                                                                                  |\n> |:----------|:---------------|:-------------------------------------------------------------------------------------------------------------|\n> | a         | dict list str  | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> | b         | dict list str  | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> \n> \u8fd4\u56de\u662f\u5426\u5305\u542b\u7684\u903b\u8f91\u503c\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n> \n> \u793a\u4f8b\uff1a\n>> ```python\n>> ellipsoid.Topology.contains(\n>>     a={\"type\": \"LineString\", \"coordinates\": [[0, 0], [1, 1]]},\n>>     b={'type': 'Point', 'coordinates': [0.5, 0.5]}\n>> )\n>> # True\n>> ``` \n\n***Topology.containsPoint***\n> ```python\n> @classmethod\n> def containsPoint(\n>         cls,\n>         geometry: dict | list | str,\n>         longitude: float,\n>         latitude: float\n> ) -> bool\n> ```\n> \u5224\u65ad[geometry]\u51e0\u4f55\u662f\u5426\u5305\u542b\u70b9[longitude,latitude]\u51e0\u4f55\n>  \n> | Parameter | Type          | Description                                                                                                 |\n> |:----------|:--------------|:------------------------------------------------------------------------------------------------------------|\n> | geometry  | dict list str | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4 |\n> | longitude | float         | \u5341\u8fdb\u5236\u7ecf\u5ea6\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-180 \uff5e +180]                                                                                    |\n> | latitude  | float         | \u5341\u8fdb\u5236\u7eac\u5ea6\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-90 \uff5e +90]                                                                                      |\n> \n> \u8fd4\u56de\u662f\u5426\u5305\u542b\u7684\u903b\u8f91\u503c\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n> \n> \u793a\u4f8b\uff1a\n>> ```python\n>> ellipsoid.Topology.containsPoint(\n>>     geometry={\"type\": \"LineString\", \"coordinates\": [[0, 0], [1, 1]]},\n>>     0.5, 0.5\n>> )\n>> # True\n>> ``` \n\n***Topology.convexHull***\n> ```python\n> @classmethod\n> def convexHull(\n>         cls,\n>         geometry: dict | list | str\n> ) -> shapely.geometry\n> ```\n> \u4ea7\u751f\u6307\u5b9a\u51e0\u4f55\u4f53\u7684\u51f8\u5305\u51e0\u4f55\u5bf9\u8c61\n>  \n> | Parameter | Type          | Description                                                                                                 |\n> |:----------|:--------------|:------------------------------------------------------------------------------------------------------------|\n> | geometry  | dict list str | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4 |\n> \n> \u8fd4\u56de\u51f8\u5305\u51e0\u4f55\u5bf9\u8c61\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n> \n> \u793a\u4f8b\uff1a\n>> ```python\n>> ellipsoid.Topology.convexHull(\n>>     {\"type\":\"MultiPoint\",\"coordinates\":[[0, 0], [10, 0], [20, 10]]}\n>> )\n>> # POLYGON ((0 0, 20 10, 10 0, 0 0))\n>> ``` \n\n***Topology.covers***\n> ```python\n> @classmethod\n> def covers(\n>         cls,\n>         a: dict | list | str,\n>         b: dict | list | str\n> ) -> bool\n> ```\n> \u5224\u65ad[a]\u51e0\u4f55\u662f\u5426\u5c06[b]\u51e0\u4f55\u5b8c\u5168\u8986\u76d6\n>  \n> | Parameter | Type           | Description                                                                                                  |\n> |:----------|:---------------|:-------------------------------------------------------------------------------------------------------------|\n> | a         | dict list str  | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> | b         | dict list str  | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> \n> \u8fd4\u56de\u662f\u5426\u8986\u76d6\u7684\u903b\u8f91\u503c\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Topology.crosses***\n> ```python\n> @classmethod\n> def crosses(\n>         cls,\n>         a: dict | list | str,\n>         b: dict | list | str\n> ) -> bool\n> ```\n> \u5224\u65ad[a]\u51e0\u4f55\u4e0e[b]\u51e0\u4f55\u5728\u7a7a\u95f4\u4e0a\u662f\u5426\u4ea4\u53c9\u6a2a\u8de8\n>  \n> | Parameter | Type           | Description                                                                                                  |\n> |:----------|:---------------|:-------------------------------------------------------------------------------------------------------------|\n> | a         | dict list str  | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> | b         | dict list str  | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> \n> \u8fd4\u56de\u662f\u5426\u4ea4\u53c9\u6a2a\u8de8\u7684\u903b\u8f91\u503c\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n> \n> \u793a\u4f8b\uff1a\n>> ```python\n>> ellipsoid.Topology.crosses(\n>>     {\"type\": \"LineString\", \"coordinates\": [[0, 0], [1, 1]]},\n>>     {\"type\": \"LineString\", \"coordinates\": [[0, 1], [1, 0]]}\n>> )\n>> # True\n>> ``` \n\n***Topology.difference***\n> ```python\n> @classmethod\n> def difference(\n>         cls,\n>         a: dict | list | str,\n>         b: dict | list | str\n> ) -> shapely.geometry\n> ```\n> \u83b7\u53d6[a]\u51e0\u4f55\u4e2d\u4e0e[b]\u51e0\u4f55\u4e0d\u540c\u7684\u51e0\u4f55\u90e8\u4ef6\n>  \n> | Parameter | Type           | Description                                                                                                  |\n> |:----------|:---------------|:-------------------------------------------------------------------------------------------------------------|\n> | a         | dict list str  | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> | b         | dict list str  | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> \n> \u8fd4\u56de\u5dee\u5f02\u5316\u51e0\u4f55\u90e8\u4ef6\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n> \n> \u793a\u4f8b\uff1a\n>> ```python\n>> ellipsoid.Topology.difference(\n>>     {\"type\": \"LineString\", \"coordinates\": [[0, 0], [1, 1]]},\n>>     {\"type\": \"LineString\", \"coordinates\": [[0, 1], [1, 0]]}\n>> )\n>> # MULTILINESTRING ((0 0, 0.5 0.5), (0.5 0.5, 1 1))\n>> ``` \n\n***Topology.distanceOnLine***\n> ```python\n> @classmethod\n> def distanceOnLine(\n>         cls,\n>         line: dict | list | str,\n>         point: dict | list | str\n> ) -> float\n> ```\n> \u8fd4\u56de\u4ece\u7ebf\u8d77\u70b9\u51fa\u53d1\u6cbf\u7ebf\u8981\u7d20\u81f3\u6307\u5b9a\u70b9\u7684\u8ddd\u79bb\uff0c\u5982\u679c\u70b9\u4e0d\u5728\u7ebf\u4e0a\uff0c\u5c06\u8fd4\u56de\u65e0\u6548\u6570\u503c\n>  \n> | Parameter | Type           | Description                                                                                                     |\n> |:----------|:---------------|:----------------------------------------------------------------------------------------------------------------|\n> | line      | dict list str  | \u7ebf\u8981\u7d20\uff0cGeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4 |\n> | point     | dict list str  | \u70b9\u8981\u7d20\uff0cGeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4 |\n> \n> \u8fd4\u56de\u7ebf\u4e0a\u70b9\u8ddd\u8d77\u70b9\u7684\u8ddd\u79bb\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n> \n> \u793a\u4f8b\uff1a\n>> ```python\n>> ellipsoid.Topology.distanceOnLine(\n>>     {\"type\": \"LineString\", \"coordinates\": [[0, 0], [1, 1]]},\n>>     {\"type\": \"Point\", \"coordinates\": [0.5, 0.5]}\n>> )\n>> # 0.7071067811865476\n>> ``` \n\n***Topology.equals***\n> ```python\n> @classmethod\n> def equals(\n>         cls,\n>         a: dict | list | str,\n>         b: dict | list | str\n> ) -> bool\n> ```\n> \u5224\u65ad[a]\u51e0\u4f55\u662f\u5426\u4e0e[b]\u51e0\u4f55\u89c6\u89c9\u6548\u679c\u4e00\u81f4\n>  \n> | Parameter | Type           | Description                                                                                                  |\n> |:----------|:---------------|:-------------------------------------------------------------------------------------------------------------|\n> | a         | dict list str  | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> | b         | dict list str  | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> \n> \u8fd4\u56de\u89c6\u89c9\u6548\u679c\u662f\u5426\u4e00\u81f4\u7684\u903b\u8f91\u503c\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Topology.equal***\n> ```python\n> @classmethod\n> def equal(\n>         cls,\n>         a: dict | list | str,\n>         b: dict | list | str\n> ) -> bool\n> ```\n> \u5224\u65ad[a]\u51e0\u4f55\u662f\u5426\u4e0e[b]\u51e0\u4f55\u4e25\u683c\u4e00\u81f4\n>  \n> | Parameter | Type           | Description                                                                                                  |\n> |:----------|:---------------|:-------------------------------------------------------------------------------------------------------------|\n> | a         | dict list str  | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> | b         | dict list str  | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> \n> \u8fd4\u56de\u662f\u5426\u4e00\u81f4\u7684\u903b\u8f91\u503c\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Topology.intersection***\n> ```python\n> @classmethod\n> def intersection(\n>         cls,\n>         a: dict | list | str,\n>         b: dict | list | str\n> ) -> shapely.geometry\n> ```\n> \u83b7\u53d6[a]\u51e0\u4f55\u4e0e[b]\u51e0\u4f55\u7684\u4ea4\u70b9\u51e0\u4f55\n>  \n> | Parameter | Type           | Description                                                                                                  |\n> |:----------|:---------------|:-------------------------------------------------------------------------------------------------------------|\n> | a         | dict list str  | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> | b         | dict list str  | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> \n> \u8fd4\u56de\u8fd4\u56de\u4ea4\u70b9\u51e0\u4f55\uff0c\u5982\u679c\u4e0d\u76f8\u4ea4\u8fd4\u56deNone\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n> \n> \u793a\u4f8b\uff1a\n>> ```python\n>> ellipsoid.Topology.intersection(\n>>     '0 0,10 0,10 10,0 10,0 0',  # \u7ebf\u8981\u7d20\u81ea\u7531\u683c\u5f0f\n>>     '5 5,15 5,15 15,5 15,5 5'   # \u7ebf\u8981\u7d20\u81ea\u7531\u683c\u5f0f\n>> )\n>> # MULTIPOINT (5 10, 10 5)\n>> ``` \n\n***Topology.intersections***\n> ```python\n> @classmethod\n> def intersections(\n>        cls,\n>        geometries: list\n> ) -> shapely.geometry\n> ```\n> \u83b7\u53d6[geometries]\u51e0\u4f55\u5217\u8868\u4e2d\u7684\u6240\u6709\u51e0\u4f55\u90e8\u4ef6\u7684\u4ea4\u70b9\n>\n> | Parameter  | Type | Description                 |\n> |:-----------|:-----|:----------------------------|\n> | geometries | list | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\u7684\u5217\u8868  |\n> \n> \u8fd4\u56de\u4ea4\u70b9\u51e0\u4f55\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Topology.intersects***\n> ```python\n> @classmethod\n> def intersects(\n>         cls,\n>         a: dict | list | str,\n>         b: dict | list | str\n> ) -> bool\n> ```\n> \u5224\u65ad[a]\u51e0\u4f55\u4e0e[b]\u51e0\u4f55\u5728\u7a7a\u95f4\u4e0a\u662f\u5426\u76f8\u4ea4\uff08\u5305\u62ec\uff1a\u53e0\u52a0\u3001\u63a5\u58e4\u3001\u5305\u542b\uff09\u3002\u6ce8\uff1adisjoint(A, B) == ~intersects(A, B)\n>  \n> | Parameter | Type           | Description                                                                                                  |\n> |:----------|:---------------|:-------------------------------------------------------------------------------------------------------------|\n> | a         | dict list str  | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> | b         | dict list str  | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> \n> \u8fd4\u56de\u662f\u5426\u76f8\u4ea4\u7684\u903b\u8f91\u503c\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n> \n> \u793a\u4f8b\uff1a\n>> ```python\n>> ellipsoid.Topology.intersects(\n>>     {\"type\": \"LineString\", \"coordinates\": [[0, 0], [1, 1]]},\n>>     {\"type\": \"LineString\", \"coordinates\": [[0, 1], [1, 0]]}\n>> )\n>> # True\n>> ``` \n\n***Topology.intersectsPoint***\n> ```python\n> @classmethod\n> def intersectsPoint(\n>         cls,\n>         geometry: dict | list | str,\n>         longitude: float,\n>         latitude: float\n> ) -> bool\n> ```\n> \u5224\u65ad[geometry]\u51e0\u4f55\u662f\u5426\u4e0e\u70b9[longitude,latitude]\u51e0\u4f55\u76f8\u4ea4\n>  \n> | Parameter | Type          | Description                                                                                                 |\n> |:----------|:--------------|:------------------------------------------------------------------------------------------------------------|\n> | geometry  | dict list str | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4 |\n> | longitude | float         | \u5341\u8fdb\u5236\u7ecf\u5ea6\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-180 \uff5e +180]                                                                                    |\n> | latitude  | float         | \u5341\u8fdb\u5236\u7eac\u5ea6\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-90 \uff5e +90]                                                                                      |\n> \n> \u8fd4\u56de\u662f\u5426\u76f8\u4ea4\u7684\u903b\u8f91\u503c\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Topology.length***\n> ```python\n> @classmethod\n> def length(\n>        cls,\n>        coordinates: str | list | dict,\n>        crs: int = 2000\n> ) -> dict\n> ```\n> \u7531\u7b26\u5408\u3010WKT/WKB\u3001GeoJson\u3001\u81ea\u7531/\u7b80\u7ea6\u6587\u672c\u3011\u683c\u5f0f\u7684\u6298\u7ebf\u5750\u6807\u4e32\u6216\u8005\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5b57\u5178\u6216\u5750\u6807\u5217\u8868\u8ba1\u7b97\u5176\u957f\u5ea6\uff08\u6216\u5468\u957f\uff09\u53ca\u8fb9\u754c\u3002\u82e5\u8fde\u7eed\u7684\u4e24\u4e2a\u9876\u70b9\u4f4d\u4e8e\u540c\u4e00\u4e2a\u6295\u5f71\u5e26\u4e14\u6307\u5b9a\u7684\u5750\u6807\u7cfb\u4ee3\u53f7\u5c5e\u4e8e\u5317\u4eac\u6216\u897f\u5b89\u6216\u56fd\u5bb6\u5750\u6807\u7cfb\u4fbf\u6309\u9ad8\u65af-\u514b\u5415\u683c\u6295\u5f71\u8fdb\u884c\u8ba1\u7b97\uff0c\u4e0d\u5728\u540c\u4e00\u4e2a\u6295\u5f71\u5e26\u6309\u692d\u7403\u8ba1\u7b97\u66f2\u7ebf\u957f\u5ea6\n>\n> | Parameter   | Type          | Description                                                                                                    |\n> |:------------|:--------------|:---------------------------------------------------------------------------------------------------------------|\n> | coordinates | dict list str | \u7b26\u5408\u3010WKT/WKB\u3001GeoJson\u3001\u81ea\u7531/\u7b80\u7ea6\u6587\u672c\u3011\u683c\u5f0f\u7684\u6298\u7ebf\u5750\u6807\u4e32\u6216\u8005\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5b57\u5178\u6216\u5750\u6807\u5217\u8868\uff0c\u652f\u6301\u5355\u7ebf\u3001\u591a\u7ebf\u6216\u8005\u5355\u9762\u7c7b\u578b\u3002\u5982\u679c\u662f\u5217\u8868\u6216\u8005\u5b57\u5178\u7c7b\u578b\uff0c\u6267\u884c\u5b8c\u6210\u540e\u53ef\u56de\u9988\u7ecf\u5254\u9664\u76f8\u90bb\u7684\u91cd\u590d\u9876\u70b9\u540e\u7684\u5b9e\u53c2\u7ed3\u679c  |\n> | crs         | int           | \u5750\u6807\u53c2\u7167\u7cfb\u5e74\u4ee3\uff081954=\u5317\u4eac\u5750\u6807\u7cfb\uff1b1980=\u897f\u5b89\u5750\u6807\u7cfb\uff1b1984=WGS84\u5750\u6807\u7cfb\uff1b2000=CGCS2000\u5750\u6807\u7cfb\uff0c\u7701\u7565\u53d6\u9ed8\u8ba4\u503c\uff1a2000\u3002\u5176\u4ed6\u503c\uff08\u6bd4\u5982\uff1a0\uff09\u5c06\u4e0d\u8fdb\u884c\u6295\u5f71\u53d8\u6362\u5e76\u8fd4\u56de\u7b1b\u5361\u5c14\u5750\u6807\u7cfb\u591a\u8fb9\u5f62\u9762\u79ef\uff09      |\n> \n> \u8fd4\u56de\u957f\u5ea6\u4e0e\u8fb9\u754c\u6784\u6210\u7684\u5b57\u5178\uff0c\u957f\u5ea6\u91cf\u7eb2\u53d6\u51b3\u4e8e\u6307\u5b9a\u7684crs\u53c2\u6570\u503c\uff0c\u591a\u7ebf\u7c7b\u578b\u8fd4\u56de\u6240\u6709\u6298\u7ebf\u7684\u7d2f\u8ba1\u957f\u5ea6\uff0c\u82e5\u8ba1\u7b97\u5468\u957f\u5e94\u786e\u4fdd\u6298\u7ebf\u4e3a\u5c01\u95ed\u7ebf\u73af\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38 \n> \n> \u793a\u4f8b\uff1a\n>> ```python\n>> ellipsoid.Topology.length(coordinates={\"type\": \"LineString\", \"coordinates\": [[0, 0], [10, 0], [10, 10]]}, crs=0)\n>> # {'length': 20.0, 'boundary': {'west': 0.0, 'south': 0.0, 'east': 10.0, 'north': 10.0}}\n>> \n>> ellipsoid.Topology.length(coordinates={\"type\": \"LineString\", \"coordinates\": [[0, 0], [10, 0], [10, 10]]}, crs=2000)\n>> # {'length': 2219217.1822485896, 'boundary': {'west': 0.0, 'south': 0.0, 'east': 10.0, 'north': 10.0}}\n>> ```\n\n***Topology.overlaps***\n> ```python\n> @classmethod\n> def overlaps(\n>         cls,\n>         a: dict | list | str,\n>         b: dict | list | str\n> ) -> bool\n> ```\n> \u5224\u65ad[a]\u51e0\u4f55\u4e0e[b]\u51e0\u4f55\u5728\u7a7a\u95f4\u4e0a\u662f\u5426\u91cd\u53e0\uff08\u91cd\u53e0\u662f\u6307\u90e8\u5206\u91cd\u5408\uff0c\u5982\u679c\u5b8c\u5168\u91cd\u5408\u5c31\u79f0\u4e3a\u76f8\u7b49\uff09\n>  \n> | Parameter | Type           | Description                                                                                                  |\n> |:----------|:---------------|:-------------------------------------------------------------------------------------------------------------|\n> | a         | dict list str  | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> | b         | dict list str  | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> \n> \u8fd4\u56de\u662f\u5426\u91cd\u53e0\u7684\u903b\u8f91\u503c\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Topology.pointOnLine***\n> ```python\n> @classmethod\n> def pointOnLine(\n>         cls,\n>         line: dict | list | str,\n>         distance: float\n> ) -> shapely.geometry.point\n> ```\n> \u8fd4\u56de\u4ece\u7ebf\u8d77\u70b9\u51fa\u53d1\u6cbf\u7ebf\u8981\u7d20\u81f3\u6307\u5b9a\u70b9\u7684\u8ddd\u79bb\uff0c\u5982\u679c\u70b9\u4e0d\u5728\u7ebf\u4e0a\uff0c\u5c06\u8fd4\u56de\u65e0\u6548\u6570\u503c\n>  \n> | Parameter | Type          | Description                                                                                                     |\n> |:----------|:--------------|:----------------------------------------------------------------------------------------------------------------|\n> | line      | dict list str | \u7ebf\u8981\u7d20\uff0cGeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4 |\n> | distance  | float         | \u8ddd\u8d77\u70b9\u6216\u672b\u70b9\u7684\u8ddd\u79bb\uff0c\u6b63\u503c\u4ece\u8d77\u70b9\u5f00\u59cb\uff0c\u8d1f\u503c\u4ece\u672b\u70b9\u5f00\u59cb\uff0c\u8d85\u51fa\u8303\u56f4\u5c06\u53d6\u8fb9\u754c\u503c                                                                             |\n> \n> \u8fd4\u56de\u63d2\u503c\u70b9\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n> \n> \u793a\u4f8b\uff1a\n>> ```python\n>> ellipsoid.Topology.pointOnLine(\n>>     {\"type\": \"LineString\", \"coordinates\": [[0, 0], [10, 0], [10, 10]]},\n>>     12\n>> )\n>> # POINT (10 2)\n>> ``` \n\n***Topology.rectangle***\n> ```python\n> @classmethod\n> def rectangle(\n>         cls,\n>         geometry: dict | list | str\n> ) -> shapely.geometry\n> ```\n> \u751f\u6210\u5305\u542b\u6307\u5b9a\u51e0\u4f55\u4f53\u7684\u6700\u5c0f\u503e\u659c\u77e9\u5f62\u51e0\u4f55\u90e8\u4ef6\n>  \n> | Parameter | Type          | Description                                                                                                 |\n> |:----------|:--------------|:------------------------------------------------------------------------------------------------------------|\n> | geometry  | dict list str | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4 |\n> \n> \u8fd4\u56de\u6700\u5c0f\u503e\u659c\u77e9\u5f62\u51e0\u4f55\u90e8\u4ef6\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Topology.relate***\n> ```python\n> @classmethod\n> def relate(\n>         cls,\n>         a: dict | list | str,\n>         b: dict | list | str\n> ) -> str\n> ```\n> \u751f\u6210\u4e24\u51e0\u4f55\u4f53\u7684\u201c\u5185\u90e8\uff0c\u8fb9\u754c\uff0c\u5916\u90e8\u201d\u4e09\u8005\u6784\u6210\u7684\u7a7a\u95f4\u5173\u7cfb\u6a21\u578b\uff08Dimensionally Extended 9-Intersection Model - DE9IM) \u7684\uff083\u00d73\uff09\u77e9\u9635\u8868\u793a\u5f62\u5f0f\u3002  \n> \u91c7\u7528\u7ef4\u5ea6\u8868\u793a\u76f8\u4ea4\uff08\u91cd\u5408\uff09\u90e8\u5206\u7684\u6570\u503c\uff080=\u70b9\uff1b1=\u7ebf\uff1b2=\u9762\uff1b-1=\u65e0\uff09\u5e76\u5f62\u62103\u00d73\u77e9\u9635\uff1a  \n>   \u2460\u2461\u2462  \n>   \u2463\u2464\u2465  \n>   \u2466\u2467\u2468  \n> \u8fd4\u56de\u7684\u5b57\u7b26\u4e32\u662f\u7a7a\u95f4\u5173\u7cfb\u8c13\u8bcd\u77e9\u9635\u4e2d\u2460~\u2468\u7684\u503c\uff08T=True\u3001F=False\uff09\uff0c\u5360\u4f4d\u7b26\u8bf4\u660e\u5982\u4e0b\uff1a  \n>   T = \u76f8\u4ea4\u90e8\u5206\u7ef4\u5ea6\u4e3a 0\u30011\u30012  \n>   F = \u76f8\u4ea4\u90e8\u5206\u7ef4\u5ea6 < 0  \n>   \\* = \u76f8\u4ea4\u90e8\u5206\u7ef4\u5ea6\u4e3a\u4efb\u610f\u503c  \n>   0 = \u76f8\u4ea4\u90e8\u5206\u7ef4\u5ea6\u4e3a 0  \n>   1 = \u76f8\u4ea4\u90e8\u5206\u7ef4\u5ea6\u4e3a 1  \n>   2 = \u76f8\u4ea4\u90e8\u5206\u7ef4\u5ea6\u4e3a 2  \n> \u4f8b\u5982\uff1a  \n>   Equals    -> T\\*F\\*\\*FFF*  \n>   Disjoint  -> FF\\*FF****  \n>   Contains  -> T*****FF*  \n>  \n> | Parameter | Type           | Description                                                                                                  |\n> |:----------|:---------------|:-------------------------------------------------------------------------------------------------------------|\n> | a         | dict list str  | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> | b         | dict list str  | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> \n> \u8fd4\u56de\u4e24\u51e0\u4f55\u4f53\u7684\u201c\u5185\u90e8\uff0c\u8fb9\u754c\uff0c\u5916\u90e8\u201d\u4e09\u8005\u6784\u6210\u7684\u7a7a\u95f4\u5173\u7cfb\u6a21\u578b\uff083\u00d73\uff09\u77e9\u9635\u5b57\u7b26\u4e32\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n> \n> \u793a\u4f8b\uff1a\n>> ```python\n>> ellipsoid.Topology.relate(\n>>     {\"type\": \"LineString\", \"coordinates\": [[0, 0], [10, 10]]},\n>>     {\"type\": \"LineString\", \"coordinates\": [[10, 0], [0, 10]]}\n>> )\n>> # 0F1FF0102\n>> ``` \n\n***Topology.repair***\n> ```python\n> @classmethod\n> def repair(\n>         cls,\n>         geometry: dict | list | str\n> ) -> shapely.geometry\n> ```\n> \u4fee\u590d\u51e0\u4f55\u8981\u7d20\n>  \n> | Parameter | Type          | Description                                                                                                 |\n> |:----------|:--------------|:------------------------------------------------------------------------------------------------------------|\n> | geometry  | dict list str | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4 |\n> \n> \u8fd4\u56de\u4fee\u590d\u540e\u7684\u51e0\u4f55\u90e8\u4ef6\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n> \n> \u793a\u4f8b\uff1a\n>> ```python\n>> ellipsoid.Topology.repair(\n>>     '0 0,10 0,10 0,10 10,0 0'  # \u81ea\u7531\u683c\u5f0f\u7684\u7ebf\u8981\u7d20\uff0c\u5b58\u5728\u91cd\u53e0\u70b9\u95ee\u9898\n>> )\n>> # LINESTRING (0 0, 10 0, 10 10, 0 0)\n>> ```\n\n***Topology.shortest***\n> ```python\n> @classmethod\n> def shortest(\n>         cls,\n>         a: dict | list | str,\n>         b: dict | list | str\n> ) -> shapely.geometry\n> ```\n> \u751f\u6210\u4e24\u4e2a\u51e0\u4f55\u8981\u7d20\u4e4b\u95f4\u7684\u6700\u77ed\u7ebf\u6bb5\uff0c\u6b64\u7ebf\u6bb5\u4ecea\u81f3b\u7531\u4e24\u4e2a\u7aef\u70b9\u6784\u6210\n>  \n> | Parameter | Type           | Description                                                                                                  |\n> |:----------|:---------------|:-------------------------------------------------------------------------------------------------------------|\n> | a         | dict list str  | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> | b         | dict list str  | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> \n> \u8fd4\u56de\u7684\u6700\u77ed\u51e0\u4f55\u90e8\u4ef6\uff08LineString\u7c7b\u578b\uff09\u662f\u7531\u4e24\u4e2a\u7aef\u70b9\u6784\u6210\u7684\u7ebf\u6bb5\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n> \n> \u793a\u4f8b\uff1a\n>> ```python\n>> ellipsoid.Topology.shortest(\n>>     {'type': 'Point', 'coordinates': [0, 0]},\n>>     {'coordinates': [[10, 0], [0, 10]], 'type': 'LineString'}\n>> )\n>> # LINESTRING (0 0, 5 5)\n>> ``` \n\n***Topology.similarity***\n> ```python\n> @classmethod\n> def similarity(\n>         cls,\n>         a: dict | list | str,\n>         b: dict | list | str,\n>         densify: float = None\n> ) -> float\n> ```\n> \u8ba1\u7b97\u4e24\u4e2a\u51e0\u4f55\u8981\u7d20\u4e4b\u95f4\u7684\u76f8\u4f3c\u5ea6\uff0c\u6b64\u503c\u4e3aa\u4e2d\u7684\u4efb\u610f\u70b9\u4e0eb\u4e2d\u7684\u6700\u8fd1\u70b9\u4e4b\u95f4\u8ddd\u79bb\u7684\u6700\u5927\u503c\n>  \n> | Parameter | Type          | Description                                                                                                 |\n> |:----------|:--------------|:------------------------------------------------------------------------------------------------------------|\n> | a         | dict list str | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4 |\n> | b         | dict list str | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4 |\n> | densify   | float         | \u91c7\u6837\u5bc6\u5ea6\u503c\uff0c\u4ecb\u4e8e[0 1]\u4e4b\u95f4\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1aNone                                                                                |\n> \n> \u8fd4\u56de\u76f8\u4f3c\u5ea6\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Topology.simplify***\n> ```python\n> @classmethod\n> def simplify(\n>         cls,\n>         geometry: dict | list | str,\n>         tolerance: float,\n>         preserveTopology: bool = True\n> ) -> shapely.geometry\n> ```\n> \u51e0\u4f55\u62bd\u7a00\uff08\u91c7\u7528 Douglas-Peucker \u7b97\u6cd5\uff09\n>  \n> | Parameter           | Type          | Description                                                                                                     |\n> |:--------------------|:--------------|:----------------------------------------------------------------------------------------------------------------|\n> | geometry            | dict list str | \u7ebf\u8981\u7d20\uff0cGeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4 |\n> | tolerance           | float         | \u5141\u8bb8\u7684\u6700\u5927\u51e0\u4f55\u4f53\u79fb\u4f4d\u5bb9\u5dee\uff08\u8be5\u503c\u8d8a\u5927\u9876\u70b9\u6570\u5c31\u8d8a\u5c11\uff09                                                                                        |\n> | preserveTopology    | bool          | \u662f\u5426\u907f\u514d\u521b\u5efa\u65e0\u6548\u7684\u51e0\u4f55\u56fe\u5f62\uff08\u8017\u65f6\u68c0\u67e5\u6298\u53e0\u3001\u7ebf\u73af\u76f8\u4ea4\u7b49\uff09\uff0c\u9ed8\u8ba4\u503c\uff1aTrue                                                                            |\n> \n> \u8fd4\u56de\u6309\u6307\u5b9a\u7684\u5bb9\u5dee\u62bd\u7a00\u540e\u7684\u51e0\u4f55\u90e8\u4ef6\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Topology.snap***\n> ```python\n> @classmethod\n> def snap(\n>         cls,\n>         geometry: dict | list | str,\n>         reference: dict | list | str,\n>         tolerance: float\n> ) -> shapely.geometry\n> ```\n> \u5c06\u6307\u5b9a\u7684\u51e0\u4f55\u4f53\u6355\u6349\u5230\u53c2\u8003\u51e0\u4f55\u4f53\u7684\u9876\u70b9\u3002\u7b2c\u4e00\u4e2a\u51e0\u4f55\u4f53\u7684\u9876\u70b9\u5c06\u6355\u6349\u5230\u7b2c\u4e8c\u4e2a\u51e0\u4f55\u4f53\u9876\u70b9\u5e76\u8fd4\u56de\u65b0\u7684\u51e0\u4f55\u4f53\u3002\u5982\u679c\u672a\u53d1\u751f\u6355\u6349\uff0c\u5219\u8fd4\u56de\u7684\u8f93\u5165\u51e0\u4f55\u56fe\u5f62\u5c06\u4fdd\u6301\u4e0d\u53d8\u3002\u5bb9\u5dee\u7528\u4e8e\u63a7\u5236\u6355\u6349\u7684\u5438\u9644\u4f4d\u7f6e\uff0c\u8c03\u7528\u65b9\u5e94\u8d1f\u8d23\u68c0\u67e5\u548c\u5904\u7406\u56e0\u6355\u6349\u8fc7\u591a\u53ef\u80fd\u4f1a\u5bfc\u81f4\u521b\u5efa\u65e0\u6548\u7684\u51e0\u4f55\u56fe\u5f62\n>  \n> | Parameter  | Type          | Description                                                                                                 |\n> |:-----------|:--------------|:------------------------------------------------------------------------------------------------------------|\n> | geometry   | dict list str | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4 |\n> | reference  | dict list str | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4 |\n> | tolerance  | float         | \u5141\u8bb8\u7684\u6700\u5927\u51e0\u4f55\u4f53\u79fb\u4f4d\u5bb9\u5dee\uff08\u8be5\u503c\u8d8a\u5927\u9876\u70b9\u6570\u5c31\u8d8a\u5c11\uff09                                                                                    |\n> \n> \u8fd4\u56de\u6309\u6307\u5b9a\u7684\u5bb9\u5dee\u5411\u53c2\u8003\u51e0\u4f55\u9760\u8fd1\u540e\u7684\u51e0\u4f55\u90e8\u4ef6\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Topology.touches***\n> ```python\n> @classmethod\n> def touches(\n>         cls,\n>         a: dict | list | str,\n>         b: dict | list | str\n> ) -> bool\n> ```\n> \u5224\u65ad[a]\u51e0\u4f55\u4e0e[b]\u51e0\u4f55\u5728\u7a7a\u95f4\u4e0a\u662f\u5426\u63a5\u89e6\uff08\u4e24\u51e0\u4f55\u7684\u8fb9\u754c\u5b58\u5728\u90e8\u5206\u91cd\u53e0\u73b0\u8c61\uff0c\u4ea6\u5373\u5b58\u5728\u516c\u5171\u70b9\u6216\u8005\u516c\u5171\u8fb9\uff09\n>  \n> | Parameter | Type           | Description                                                                                                  |\n> |:----------|:---------------|:-------------------------------------------------------------------------------------------------------------|\n> | a         | dict list str  | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> | b         | dict list str  | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> \n> \u8fd4\u56de\u662f\u5426\u63a5\u89e6\u7684\u903b\u8f91\u503c\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Topology.triangulate***\n> ```python\n> @classmethod\n> def triangulate(\n>         cls,\n>         geometry: dict | list | str,\n>         tolerance: float = 0.0,\n>         edges: bool = False\n> ) -> list\n> ```\n> \u4f9d\u636e\u6307\u5b9a\u51e0\u4f55\u4f53\u7684\u6240\u6709\u9876\u70b9\u751f\u6210\u5fb7\u52d2\u5185\u4e09\u89d2\u51e0\u4f55\uff08Delaunay triangulation\uff09\u591a\u8fb9\u5f62\u90e8\u4ef6\n>  \n> | Parameter | Type          | Description                                                                                                 |\n> |:----------|:--------------|:------------------------------------------------------------------------------------------------------------|\n> | geometry  | dict list str | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4 |\n> | tolerance | float         | \u6355\u6349\u5bb9\u5dee\u7528\u4e8e\u63d0\u9ad8\u4e09\u89d2\u5256\u5206\u8ba1\u7b97\u7684\u7a33\u5065\u6027\uff0c\u5982\u679c\u4e0d\u8fdb\u884c\u6355\u6349\u53ef\u53d6\u9ed8\u8ba4\u503c\uff1a0.0                                                                         |\n> | edges     | bool          | \u5982\u679c\u8bbe\u4e3a\u9ed8\u8ba4\u503c\uff1aFalse\uff0c\u5c06\u8fd4\u56de\u591a\u8fb9\u5f62\u4e09\u89d2\u5f62\u5217\u8868\uff0c\u5426\u5219\u8fd4\u56de\u8fb9\u754c\u7ebf\u5217\u8868                                                                         |\n> \n> \u8fd4\u56de\u5fb7\u52d2\u5185\u4e09\u89d2\u51e0\u4f55\u591a\u8fb9\u5f62\u90e8\u4ef6\u5217\u8868\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Topology.unions***\n> ```python\n> @classmethod\n> def unions(\n>         cls,\n>         geometries: list,\n>         gridSize: float = None,\n>         axis: int = None\n> ) -> shapely.geometry\n> ```\n> \u83b7\u53d6[geometries]\u51e0\u4f55\u5217\u8868\u4e2d\u7684\u6240\u6709\u51e0\u4f55\u5f52\u5e76\u540e\u7684\u51e0\u4f55\u90e8\u4ef6\uff08\u53ef\u5145\u5f53\u81ea\u52a8\u526a\u65ad\u7ebf\u3001\u591a\u8fb9\u5f62\u62c6\u5206\u7b49\u529f\u80fd\uff09\n>  \n> | Parameter  | Type  | Description                            |\n> |:-----------|:------|:---------------------------------------|\n> | geometries | list  | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\u7c7b\u578b\u5217\u8868            |\n> | gridSize   | float | \u7f51\u683c\u5316\u878d\u5408\u7cbe\u5ea6\uff08\u9ed8\u8ba4\u53d6\u6700\u9ad8\u7cbe\u5ea6\uff09\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1aNone          |\n> | axis       | int   | \u6267\u884c\u64cd\u4f5c\u7684\u8f74\uff0c\u9ed8\u8ba4\u5728\u6240\u6709\u8f74\u4e0a\u6267\u884c\u64cd\u4f5c\u5e76\u8fd4\u56de\u6807\u91cf\u503c\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1aNone  |\n> \n> \u8fd4\u56de\u5f52\u5e76\u540e\u7684\u51e0\u4f55\u90e8\u4ef6\uff0c\u65e0\u7ed3\u679c\u65f6\u8fd4\u56deNone\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n> \n> \u793a\u4f8b\uff1a\n>> ```python\n>> ellipsoid.Topology.unions(\n>>     ['0 0,10 0,0 10,10 10,0 0']  # \u81ea\u7531\u683c\u5f0f\u7ebf\u8981\u7d20\u6570\u7ec4\n>> )\n>> # MULTILINESTRING ((0 0, 10 0, 5 5), (5 5, 0 10, 10 10, 5 5), (5 5, 0 0))\n>> ``` \n\n***Topology.union***\n> ```python\n> @classmethod\n> def union(\n>         cls,\n>         a: dict | list | str,\n>         b: dict | list | str\n> ) -> shapely.geometry\n> ```\n> \u83b7\u53d6[a]\u51e0\u4f55\u4e0e[b]\u51e0\u4f55\u5408\u5e76\u540e\u7684\u51e0\u4f55\u90e8\u4ef6\n>  \n> | Parameter | Type           | Description                                                                                                  |\n> |:----------|:---------------|:-------------------------------------------------------------------------------------------------------------|\n> | a         | dict list str  | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> | b         | dict list str  | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4  |\n> \n> \u8fd4\u56de\u5408\u5e76\u540e\u7684\u51e0\u4f55\u90e8\u4ef6\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n***Topology.voronoiDiagram***\n> ```python\n> @classmethod\n> def voronoiDiagram(\n>         cls,\n>         geometry: dict | list | str,\n>         envelope: shapely.geometry = None,\n>         tolerance: float = 0.0,\n>         edges: bool = False\n> ) -> list\n> ```\n> \u5229\u7528\u6307\u5b9a\u51e0\u4f55\u4f53\u7684\u9876\u70b9\u6784\u9020\u6c83\u7f57\u8bfa\u4f0a\u56fe\uff08\u6cf0\u68ee\u591a\u8fb9\u5f62\u90e8\u4ef6\uff09\n>  \n> | Parameter | Type             | Description                                                                                                 |\n> |:----------|:-----------------|:------------------------------------------------------------------------------------------------------------|\n> | geometry  | dict list str    | GeoJSON\u51e0\u4f55\u5b57\u7b26\u4e32\u6216\u5b57\u5178\u5bf9\u8c61\u4ee5\u53ca\u5217\u8868\u5bf9\u8c61\uff0c\u8fd8\u53ef\u652f\u6301[shapely.geometry]\u683c\u5f0f\uff0c\u51e0\u4f55\u5b57\u5178\u53c2\u6570\u4e2d\u7684\u3010type\u3011\u6210\u5458\u4e3a\u51e0\u4f55\u7c7b\u578b\u540d\u79f0\uff0c\u3010coordinates\u3011\u6210\u5458\u4e3a\u7b26\u5408GeoJson\u683c\u5f0f\u7684\u51e0\u4f55\u5750\u6807\u6570\u7ec4 |\n> | envelope  | shapely.geometry | \u7528\u4e8e\u5c06\u7ed3\u679c\u8fdb\u884c\u88c1\u526a\u7684\u51e0\u4f55\u5c01\u5957\uff0c\u9ed8\u8ba4\u503c\uff1aNone                                                                                     |\n> | tolerance | float            | \u8bbe\u7f6e\u7528\u4e8e\u63d0\u9ad8\u8ba1\u7b97\u7a33\u5065\u6027\u7684\u6355\u6349\u5bb9\u5dee\u503c\uff0c\u9ed8\u8ba4\u503c\uff1a0.0=\u4e0d\u8fdb\u884c\u6355\u6349                                                                             |\n> | edges     | bool             | \u5982\u679c\u8bbe\u4e3a\u9ed8\u8ba4\u503c\uff1aFalse\uff0c\u5c06\u8fd4\u56de\u591a\u8fb9\u5f62\u4e09\u89d2\u5f62\u5217\u8868\uff0c\u5426\u5219\u8fd4\u56de\u8fb9\u754c\u7ebf\u5217\u8868                                                                         |\n> \n> \u8fd4\u56de\u6c83\u7f57\u8bfa\u4f0a\u56fe\uff08\u6cf0\u68ee\u591a\u8fb9\u5f62\u90e8\u4ef6\u5217\u8868\uff09\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n\n*****\n* ### Class Astronomy(builtins.object)  \n\n*****\n\n***Astronomy.UTCtoJulian***  \n> ```python  \n> @staticmethod  \n> def UTCtoJulian(  \n>     year: int | str | tuple | datetime = 1970,  \n>     month: int = 1,  \n>     day: int = 1,  \n>     hour: int = 0,  \n>     minute: int = 0,  \n>     second: float = 0.0  \n> ) -> float\n> ```\n> \u5929\u6587\u7eaa\u5e74\uff08UTC\u516c\u5386-\u5e74\u6708\u65e5\u65f6\u5206\u79d2\uff09\u8f6c\u5112\u7565\u65e5\u3002  \n> \u6ce81\uff1aUTC\u662f\u534f\u8c03\u4e16\u754c\u65f6\uff08Coordinated Universal Time\uff09\u7684\u7f29\u5199\uff0c\u4ee5\u524d\u4e5f\u88ab\u79f0\u4e3a\u683c\u6797\u5a01\u6cbb\u6807\u51c6\u65f6\u95f4\uff08GMT\uff09  \n> \u6ce82\uff1aUTC\u516c\u53861970\u5e741\u67081\u65e500\u65f600\u520600\u79d2\uff0c\u76f8\u5f53\u4e8e\u5317\u4eac\u65f6\u95f41970\u5e741\u67081\u65e508\u65f600\u520600\u79d2\uff0c\u5176\u5112\u7565\u65e5\u6570\u4e3a2440587.5  \n>\n> | Parameter           | Type                   | Description                                                                     |\n> |:--------------------|:-----------------------|:--------------------------------------------------------------------------------|\n> | year                | int str tuple datetime | \u5e74\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a1970\u3002\u6ce8\uff1a\u6b64\u53c2\u6570\u53ef\u4e3a(\u5e74,\u6708,\u65e5,\u65f6,\u5206,\u79d2)\u6784\u6210\u7684\u5143\u7ec4\u6216\u4e3aUTC\u516c\u5386datetime\u7c7b\u578b\u5bf9\u8c61\uff0c\u82e5\u7b26\u5408\u8981\u6c42\u4fbf\u5ffd\u7565\u540e\u7eed\u53c2\u6570\uff0c\u5426\u5219\u629b\u51fa\u5f02\u5e38 |\n> | month               | int                    | \u6708\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a1                                                                     |\n> | day                 | int                    | \u65e5\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a1                                                                     |\n> | hour                | int                    | \u65f6\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a0                                                                     |\n> | minute              | int                    | \u5206\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a0                                                                     |\n> | second              | float                  | \u79d2\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a0.0                                                                   |\n> \n> \u8fd4\u56de\u5112\u7565\u65e5\uff08\u4ece\u516c\u5143\u524d4713\u5e741\u67081\u65e5\u6b63\u534812\u70b9\u8d77\u7b97\u7684\u7d2f\u79ef\u5929\u6570\uff09\uff0c\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n> \n> \u793a\u4f8b\uff1a\n>> ```python\n>> ellipsoid.Astronomy.UTCtoJulian(\n>>     1970, 1, 1, 0, 0, 0\n>> )\n>> ellipsoid.Astronomy.UTCtoJulian(\n>>     (1970, 1, 1, 0, 0, 0)\n>> )\n>> ellipsoid.Astronomy.UTCtoJulian(  \n>>     '1970-1-1T0:00:00+00:00'  \n>> )   \n>> ellipsoid.Astronomy.UTCtoJulian(  \n>>     datetime(1970, 1, 1, 0, 0, 0, tzinfo=pytz.timezone('UTC'))\n>> )\n>> # 2440587.5  \n>> ```\n\n*****\n\n***Astronomy.JulianToUTC***  \n> ```python  \n> @staticmethod  \n> def JulianToUTC(  \n>     julian: float = 2440587.5\n> ) -> datetime\n> ```\n> \u5112\u7565\u65e5\u8f6c\u5929\u6587\u7eaa\u5e74\uff08UTC\u516c\u5386\uff09\n>\n> | Parameter | Type   | Description                                         |\n> |:----------|:-------|:----------------------------------------------------|\n> | julian    | float  | \u5112\u7565\u65e5\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a2440587.5\uff08UTC\u516c\u53861970\u5e741\u67081\u65e500\u65f600\u520600\u79d2\u7684\u5112\u7565\u65e5\uff09  |\n> \n> \u8fd4\u56de\u5929\u6587\u7eaa\u5e74\uff08UTC\u516c\u5386\uff09\n> \n> \u793a\u4f8b\uff1a\n>> ```python\n>> ellipsoid.Astronomy.JulianToUTC(\n>>     2440587.5\n>> )\n>> # 1970-01-01 00:00:00+00:00  \n>> ```\n\n*****\n\n***Astronomy.sun***  \n> ```python  \n> @classmethod   \n> def sun(  \n>     cls,  \n>     longitude: float,  \n>     latitude: float,  \n>     elevation: float = 0.0,  \n>     year: int | None = 1970,  \n>     month: int | None = 1,  \n>     day: int | None = 1,  \n>     hour: int | None = 0,  \n>     minute: int | None = 0,  \n>     second: float | None = 0.0  \n> ) -> dict  \n> ```\n> \u4f9d\u636e\u5730\u7406\u4f4d\u7f6e\u548cUTC\u516c\u5386\uff08\u534f\u8c03\u4e16\u754c\u65f6\uff09\u8ba1\u7b97\u592a\u9633\u76f8\u4f4d\uff08\u771f\u5317\u65b9\u4f4d\u89d2\u3001\u6c34\u5e73\u9762\u4ef0\u4fef\u89d2\u3001\u65e5\u51fa\u65e5\u843d\u65f6\u95f4\u6233\u7b49\uff09\n>\n> | Parameter | Type       | Description                                                              |\n> |:----------|:-----------|:-------------------------------------------------------------------------|\n> | longitude | float      | \u5341\u8fdb\u5236\u7ecf\u5ea6\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-180 \uff5e +180]                                                 |\n> | latitude  | float      | \u5341\u8fdb\u5236\u7eac\u5ea6\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-90 \uff5e +90]                                                   |\n> | elevation | float      | \u6d77\u62d4\u9ad8\u5ea6\uff08\u7c73\u5236\uff09\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-10000 \uff5e +10000]\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a0.0                              |\n> | year      | int None   | \u5e74\uff081 \uff5e 9999\uff09\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a1970\uff1b\u82e5\u8bbe\u4e3aNone\uff0c\u4fbf\u53d6\u5f53\u524d\u5e74\u4efd\uff08UTC\u516c\u5386\uff09                           |\n> | month     | int None   | \u6708\uff081 \uff5e 12\uff09\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a1\uff1b\u82e5\u8bbe\u4e3aNone\uff0c\u4fbf\u53d6\u5f53\u524d\u6708\u4efd\uff08UTC\u516c\u5386\uff09                                |\n> | day       | int None   | \u65e5\uff081 \uff5e 31\uff09\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a1\uff1b\uff1b\u82e5\u8bbe\u4e3aNone\uff0c\u4fbf\u53d6\u5f53\u524d\u65f6\u95f4\uff08UTC\u516c\u5386\uff09                               |\n> | hour      | int None   | \u65f6\uff080 \uff5e 23\uff09\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a0\uff1b\u82e5\u8bbe\u4e3aNone\uff0c\u4fbf\u53d6\u5f53\u524d\u65f6\u95f4\uff08UTC\u516c\u5386\uff09                                |\n> | minute    | int None   | \u5206\uff080 \uff5e 59\uff09\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a0\uff1b\u82e5\u8bbe\u4e3aNone\uff0c\u4fbf\u53d6\u5f53\u524d\u65f6\u95f4\uff08UTC\u516c\u5386\uff09                                |\n> | second    | float None | \u79d2\uff08\u6d6e\u70b9\u578b\uff1a0 \uff5e 59 / 60 / 61\uff09(\u5176\u4e2d\uff0c60\u621661\u8868\u793a\u95f0\u79d2)\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a0.0\uff1b\u82e5\u8bbe\u4e3aNone\uff0c\u4fbf\u53d6\u5f53\u524d\u65f6\u95f4\uff08UTC\u516c\u5386\uff09  |\n> \n> \u8fd4\u56de\u592a\u9633\u76f8\u4f4d\u5b57\u5178\u5bf9\u8c61\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n>  \n> \u793a\u4f8b\uff1a \n>> ```python  \n>> ellipsoid.Astronomy.sun(  \n>>     101.75232400194169, 36.61087110483754, 2222,  \n>>     2024, 7, 22, 4, 0, 0  # \u76f8\u5f53\u4e8e\u5317\u4eac\u65f6\u95f4\uff1a2024\u5e747\u670822\u65e512\u65f60\u52060\u79d2  \n>> )  \n>> # {  \n>> #     'Body': 'Sun',  \n>> #     'TimeStamp': {  \n>> #         'UTC': '2024-07-22 04:00:00.000000+00:00',  \n>> #         'ServerDateTime': '2024-07-22 12:00:00.000000+08:00',  \n>> #         'ServerTimeZone': '\u4e2d\u56fd\u6807\u51c6\u65f6\u95f4'  \n>> #     },  \n>> #     'Location': {\n>> #         'Longitude': 101.75232400194169,\n>> #         'Latitude': 36.61087110483754,\n>> #         'Elevation': 2222\n>> #     },\n>> #     'Azimuth': 127.74113964795328,  # \u65b9\u4f4d\u89d2\uff08\u5341\u8fdb\u5236\u5ea6\uff09\uff0c\u81ea\u771f\u5317\u65b9\u5411\u987a\u65f6\u9488\u65cb\u8f6c\n>> #     'Altitude': 66.12070428489565,  # \u4ef0\u4fef\u89d2\uff08\u5341\u8fdb\u5236\u5ea6\uff09\uff0c\u81ea\u6c34\u5e73\u9762\u4e4b\u4e0a\u4e3a\u6b63\u4ef0\u89d2\uff0c\u53cd\u4e4b\u4e3a\u8d1f\u4fef\u89d2\n>> #     'Distance': 149598000,  # \u89c6\u8ddd\uff08KM\uff09\n>> #     'Phase': {\n>> #         'midnight': '2024-07-21 17:20:33.406157+00:00',  # \u5348\u591c\n>> #         'nightEnd': '2024-07-21 20:16:13.217144+00:00',  # \u62c2\u6653\n>> #         'nauticalDawn': '2024-07-21 20:56:43.765055+00:00',  # \u9ece\u660e\u5f00\u59cb\n>> #         'dawn': '2024-07-21 21:33:26.242346+00:00',  # \u9ece\u660e\u7ed3\u675f\n>> #         'sunrise': '2024-07-21 22:03:09.763230+00:00',  # \u65e5\u51fa\u5f00\u59cb\n>> #         'sunriseEnd': '2024-07-21 22:06:09.262196+00:00',  # \u65e5\u51fa\u7ed3\u675f\n>> #         'morning': '2024-07-21 22:40:41.599416+00:00',  # \u4e0a\u5348\n>> #         'noon': '2024-07-22 05:20:33.406157+00:00',  # \u4e2d\u5348\n>> #         'evening': '2024-07-22 12:00:25.212898+00:00',  # \u4e0b\u5348\n>> #         'sunsetStart': '2024-07-22 12:34:57.550119+00:00',  # \u65e5\u843d\u5f00\u59cb\n>> #         'sunset': '2024-07-22 12:37:57.049085+00:00',  # \u65e5\u843d\u7ed3\u675f\n>> #         'dusk': '2024-07-22 13:07:40.569968+00:00',  # \u9ec4\u660f\u5f00\u59cb\n>> #         'nauticalDusk': '2024-07-22 13:44:23.047260+00:00',  # \u9ec4\u660f\u7ed3\u675f\n>> #         'night': '2024-07-22 14:24:53.595170+00:00'  # \u591c\u665a\n>> #     }\n>> # }\n>> ```\n\n*****\n\n***Astronomy.moon***  \n> ```python  \n> @classmethod   \n> def moon(  \n>     cls,  \n>     longitude: float,  \n>     latitude: float,  \n>     elevation: float = 0.0,  \n>     year: int | None = 1970,  \n>     month: int | None = 1,  \n>     day: int | None = 1,  \n>     hour: int | None = 0,  \n>     minute: int | None = 0,  \n>     second: float | None = 0.0  \n> ) -> dict  \n> ```\n> \u4f9d\u636e\u5730\u7406\u4f4d\u7f6e\u548cUTC\u516c\u5386\uff08\u534f\u8c03\u4e16\u754c\u65f6\uff09\u8ba1\u7b97\u6708\u4eae\u76f8\u4f4d\n>\n> | Parameter | Type       | Description                                                              |\n> |:----------|:-----------|:-------------------------------------------------------------------------|\n> | longitude | float      | \u5341\u8fdb\u5236\u7ecf\u5ea6\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-180 \uff5e +180]                                                 |\n> | latitude  | float      | \u5341\u8fdb\u5236\u7eac\u5ea6\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-90 \uff5e +90]                                                   |\n> | elevation | float      | \u6d77\u62d4\u9ad8\u5ea6\uff08\u7c73\u5236\uff09\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-10000 \uff5e +10000]\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a0.0                              |\n> | year      | int None   | \u5e74\uff081 \uff5e 9999\uff09\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a1970\uff1b\u82e5\u8bbe\u4e3aNone\uff0c\u4fbf\u53d6\u5f53\u524d\u5e74\u4efd\uff08UTC\u516c\u5386\uff09                           |\n> | month     | int None   | \u6708\uff081 \uff5e 12\uff09\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a1\uff1b\u82e5\u8bbe\u4e3aNone\uff0c\u4fbf\u53d6\u5f53\u524d\u6708\u4efd\uff08UTC\u516c\u5386\uff09                                |\n> | day       | int None   | \u65e5\uff081 \uff5e 31\uff09\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a1\uff1b\uff1b\u82e5\u8bbe\u4e3aNone\uff0c\u4fbf\u53d6\u5f53\u524d\u65f6\u95f4\uff08UTC\u516c\u5386\uff09                               |\n> | hour      | int None   | \u65f6\uff080 \uff5e 23\uff09\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a0\uff1b\u82e5\u8bbe\u4e3aNone\uff0c\u4fbf\u53d6\u5f53\u524d\u65f6\u95f4\uff08UTC\u516c\u5386\uff09                                |\n> | minute    | int None   | \u5206\uff080 \uff5e 59\uff09\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a0\uff1b\u82e5\u8bbe\u4e3aNone\uff0c\u4fbf\u53d6\u5f53\u524d\u65f6\u95f4\uff08UTC\u516c\u5386\uff09                                |\n> | second    | float None | \u79d2\uff08\u6d6e\u70b9\u578b\uff1a0 \uff5e 59 / 60 / 61\uff09(\u5176\u4e2d\uff0c60\u621661\u8868\u793a\u95f0\u79d2)\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a0.0\uff1b\u82e5\u8bbe\u4e3aNone\uff0c\u4fbf\u53d6\u5f53\u524d\u65f6\u95f4\uff08UTC\u516c\u5386\uff09  |\n> \n> \u8fd4\u56de\u6708\u4eae\u76f8\u4f4d\u5b57\u5178\u5bf9\u8c61\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n>  \n> \u793a\u4f8b\uff1a \n>> ```python  \n>> ellipsoid.Astronomy.moon(  \n>>     101.75232400194169, 36.61087110483754, 2222,\n>>     2024, 7, 22, 14, 0, 0  # \u76f8\u5f53\u4e8e\u5317\u4eac\u65f6\u95f4\uff1a2024\u5e747\u670822\u65e522\u65f60\u52060\u79d2\n>> )  \n>> # {\n>> #     'Body': 'Moon',\n>> #     'TimeStamp': {\n>> #         'UTC': '2024-07-22 14:00:00+00:00',\n>> #         'ServerDateTime': '2024-07-22 22:00:00+08:00',\n>> #         'ServerTimeZone': '\u4e2d\u56fd\u6807\u51c6\u65f6\u95f4'\n>> #     },\n>> #     'Location': {\n>> #         'Longitude': 101.75232400194169,\n>> #         'Latitude': 36.61087110483754,\n>> #         'Elevation': 2222\n>> #     },\n>> #     'Azimuth': 120.79256273582314,  # \u65b9\u4f4d\u89d2\uff08\u5341\u8fdb\u5236\u5ea6\uff09\uff0c\u81ea\u771f\u5317\u65b9\u5411\u987a\u65f6\u9488\u65cb\u8f6c\n>> #     'Altitude': 5.8997720191911736,  # \u4ef0\u4fef\u89d2\uff08\u5341\u8fdb\u5236\u5ea6\uff09\uff0c\u81ea\u6c34\u5e73\u9762\u4e4b\u4e0a\u4e3a\u6b63\u4ef0\u89d2\uff0c\u53cd\u4e4b\u4e3a\u8d1f\u4fef\u89d2\n>> #     'Distance': 369969.80133619666,  # \u89c6\u8ddd\uff08KM\uff09\n>> #     'Phase': {\n>> #         'parallacticAngle': -47.37708070122644,  # \u89c6\u5dee\u89d2\n>> #         'fraction': 0.9833872391333955,  # \u5145\u76c8\u5ea6\uff1a0.0=\u65b0\u6708 1.0=\u6ee1\u6708\n>> #         'phaseName': '\u6b8b\u6708',  # \u6714\u65e5 \u4e0a\u5ce8\u5d4b\u6708 \u4e0a\u5f26\u6708 \u51f8\u6708 \u6ee1\u6708 \u6b8b\u6708 \u4e0b\u5f26\u6708 \u4e0b\u5ce8\u5d4b\u6708 \u6666\u65e5\n>> #         'angle': 88.17110226541216,  # \u5317\u504f\u89d2\n>> #         'Rise': '2024-07-23 13:58:53.804315+00:00',  # \u6708\u5347\n>> #         'Set': '2024-07-22 23:49:05.982344+00:00',  # \u6708\u843d\n>> #         'AlwaysUp': False,  # \u6708\u663e\n>> #         'AlwaysDown': False  # \u6708\u9690\n>> #     }\n>> # }\n>> ```\n\n*****\n\n***Astronomy.geostationarySatellite***  \n> ```python  \n> @classmethod   \n> def geostationarySatellite(  \n>     cls,  \n>     longitude: float,  \n>     latitude: float,  \n>     elevation: float = 0.0,  \n>     satelliteLongitude: float = 140.0\n> ) -> dict  \n> ```\n> \u4f9d\u636e\u5730\u9762\u70b9\u4f4d\u7f6e\uff08\u7ecf\u5ea6\u3001\u7eac\u5ea6\u548c\u6d77\u62d4\u9ad8\u5ea6)\u4ee5\u53ca\u5730\u7403\u540c\u6b65\u536b\u661f\u7ecf\u5ea6\uff0c\u8ba1\u7b97\u536b\u661f\u7684\u771f\u5317\u65b9\u4f4d\u89d2\u3001\u4ef0\u89d2\u548c\u89c6\u8ddd\n>\n> | Parameter           | Type     | Description                                 |\n> |:--------------------|:---------|:--------------------------------------------|\n> | longitude           | float    | \u5341\u8fdb\u5236\u7ecf\u5ea6\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-180 \uff5e +180]                    |\n> | latitude            | float    | \u5341\u8fdb\u5236\u7eac\u5ea6\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-90 \uff5e +90]                      |\n> | elevation           | float    | \u6d77\u62d4\u9ad8\u5ea6\uff08\u7c73\u5236\uff09\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-10000 \uff5e +10000]\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a0.0 |\n> | satelliteLongitude  | float    | \u536b\u661f\u7ecf\u5ea6\uff0c\u5b9a\u4e49\u57df\u4e3a\uff1a[-180 \uff5e +180]\uff0c\u7701\u7565\u65f6\u53d6\u9ed8\u8ba4\u503c\uff1a140.0       |\n> \n> \u8fd4\u56de\u7531\u536b\u661f\u7684\u771f\u5317\u65b9\u4f4d\u89d2\u3001\u4ef0\u89d2\u548c\u89c6\u8ddd\u6784\u6210\u7684\u5b57\u5178\u5bf9\u8c61\u3002\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38\n>  \n> \u793a\u4f8b\uff1a \n>> ```python  \n>> ellipsoid.Astronomy.geostationarySatellite(  \n>>     101.75232400194169, 36.61087110483754, 2222,\n>>     140.0\n>> )  \n>> # {\n>> #     'Body': 'Geostationary Satellite',\n>> #     'Location': {\n>> #         'Longitude': 101.75232400194169,\n>> #         'Latitude': 36.61087110483754,\n>> #         'Elevation': 2222\n>> #     },\n>> #     'Satellite Longitude': 140.0,\n>> #     'Azimuth': 127.2003766284867,  # \u65b9\u4f4d\u89d2\uff08\u5341\u8fdb\u5236\u5ea6\uff09\uff0c\u81ea\u771f\u5317\u65b9\u5411\u987a\u65f6\u9488\u65cb\u8f6c\n>> #     'Altitude': 31.575385865111475,  # \u4ef0\u4fef\u89d2\uff08\u5341\u8fdb\u5236\u5ea6\uff09\uff0c\u81ea\u6c34\u5e73\u9762\u4e4b\u4e0a\u4e3a\u6b63\u4ef0\u89d2\uff0c\u4e4b\u4e0b\u4e3a\u8d1f\u4fef\u89d2\n>> #     'Distance': 38447.30012331335  # \u89c6\u8ddd\uff08KM\uff09\n>> # }\n>> ```\n\n*****\n## License  \n[MIT](https://choosealicense.com/licenses/mit/)  \n\n## Contributing  \nContributions are always welcome!  \n\n## Authors  \n\u00a9 GeoWheel Studio 2024 @ Xiong'an China \n\n## Support  \nFor support, email flylyisflying@gmail.com or join our Community Discussion Channel.  \n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "\u53c2\u8003\u692d\u7403\u4f53\u57fa\u7840\u8f6f\u4ef6\u5305\uff0c\u4e3b\u8981\u5305\u62ec\uff1aGeometry-\u51e0\u4f55\u8981\u7d20\u7c7b\uff1bTopology-\u51e0\u4f55\u8981\u7d20\u62d3\u6251\u7c7b\uff1bMapGrid-\u56fd\u9645\u6807\u51c6\u6bd4\u4f8b\u5c3a\u56fe\u5e45\u5206\u5e45\u7f51\u683c\u7c7b\uff1bProjection-\u51e0\u4f55\u8981\u7d20\u5750\u6807\u6295\u5f71\u53d8\u6362\u7c7b\uff1bProjectionHelper-\u51e0\u4f55\u8981\u7d20\u5750\u6807\u6295\u5f71\u52a9\u624b\u7c7b\uff1bAstronomy-\u5929\u6587\u5bfb\u661f\u8ba1\u7b97\u7c7b",
    "version": "2024.8.22",
    "project_urls": null,
    "split_keywords": [
        "geometry",
        " geojson",
        " gml",
        " kml",
        " topology",
        " projection",
        " mapgrid",
        " astronomy"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "deb0b5007bd77f285059be24389130a3d3403b9fb5c9476a9b05a43ad7d1bc58",
                "md5": "44cfaf6c69038523d8d81135a6f1c85f",
                "sha256": "0b95c0c6de5fa72e50406addac0a4b634279cd87c80879bd5135fbf7748badc1"
            },
            "downloads": -1,
            "filename": "ellipsoid-2024.8.22-py3-none-macosx_13_0_intel.whl",
            "has_sig": false,
            "md5_digest": "44cfaf6c69038523d8d81135a6f1c85f",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 1473223,
            "upload_time": "2024-08-24T09:29:25",
            "upload_time_iso_8601": "2024-08-24T09:29:25.568076Z",
            "url": "https://files.pythonhosted.org/packages/de/b0/b5007bd77f285059be24389130a3d3403b9fb5c9476a9b05a43ad7d1bc58/ellipsoid-2024.8.22-py3-none-macosx_13_0_intel.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4a11972def9bdea95c27b05ec3991d39f221dd427c16a850bfbd4c7f9342b43d",
                "md5": "15fc7917588aa59ca80cada6345b3fc1",
                "sha256": "30f52c1151118357b5149a141721d560a26598b94e45faacb61d12d75099ed3e"
            },
            "downloads": -1,
            "filename": "ellipsoid-2024.8.22-py3-none-manylinux_2_36_x86_64.whl",
            "has_sig": false,
            "md5_digest": "15fc7917588aa59ca80cada6345b3fc1",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 4663963,
            "upload_time": "2024-08-24T09:29:29",
            "upload_time_iso_8601": "2024-08-24T09:29:29.166582Z",
            "url": "https://files.pythonhosted.org/packages/4a/11/972def9bdea95c27b05ec3991d39f221dd427c16a850bfbd4c7f9342b43d/ellipsoid-2024.8.22-py3-none-manylinux_2_36_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "eaf6e5be0894864b554d751dca83023b83277e2f50cdaf5b8f6e284d5e6a8798",
                "md5": "0126fdb983b594c1211d9b865d1efcbe",
                "sha256": "62c2f20ca656839b0626de276fc83ebf2afcca222974f0f6b01e793fab5f0559"
            },
            "downloads": -1,
            "filename": "ellipsoid-2024.8.22-py3-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "0126fdb983b594c1211d9b865d1efcbe",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 578019,
            "upload_time": "2024-08-24T09:29:31",
            "upload_time_iso_8601": "2024-08-24T09:29:31.910840Z",
            "url": "https://files.pythonhosted.org/packages/ea/f6/e5be0894864b554d751dca83023b83277e2f50cdaf5b8f6e284d5e6a8798/ellipsoid-2024.8.22-py3-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-08-24 09:29:25",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "ellipsoid"
}
        
Elapsed time: 0.28936s