prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  DEP: Depcrated `utm_crs`
  <!--
  Thanks for contributing a pull request!
  
  Please follow these standard acronyms to start the commit message:
  
  - ENH: enhancement
  - BUG: bug fix
  - DOC: documentation
  - TYP: type annotations
  - TST: addition or modification of tests
  - MAINT: maintenance commit (refactoring, typos, etc.)
  - BLD: change related to building
  - REL: related to releasing
  - API: an (incompatible) API change
  - DEP: deprecate something, or remove a deprecated object
  - DEV: development tool or utility
  - REV: revert an earlier commit
  - PERF: performance improvement
  - BOT: always commit via a bot
  - CI: related to CI or CD
  - CLN: Code cleanup
  -->
  
  - [ ] closes #xxxx
  - [x] whatsnew entry
  
  `pyproj.database.query_utm_crs_info` too slow to query all data.
  For 1 point will cost 200ms but for 2000 points will cost 200s.
  Even try `parallelize` to `utm_crs`, but the speed is still so lower.
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `dtoolkit/geoaccessor/geoseries/utm_crs.py`
  Content:
  ```
  1 import geopandas as gpd
  2 import pandas as pd
  3 from pyproj.aoi import AreaOfInterest
  4 from pyproj.database import query_utm_crs_info
  5 
  6 from dtoolkit.geoaccessor.register import register_geoseries_method
  7 from dtoolkit.util._decorator import warning
  8 
  9 
  10 @register_geoseries_method
  11 @warning(
  12     "The 'utm_crs' is deprecated and will be removed in 0.0.17. "
  13     "(Warning added DToolKit 0.0.16)",
  14     DeprecationWarning,
  15     stacklevel=3,
  16 )
  17 def utm_crs(s: gpd.GeoSeries, /, datum_name: str = "WGS 84") -> pd.Series:
  18     """
  19     Returns the estimated UTM CRS based on the bounds of each geometry.
  20 
  21     .. deprecated:: 0.0.17
  22         The 'utm_crs' is deprecated and will be removed in 0.0.17.
  23         (Warning added DToolKit 0.0.16)
  24 
  25     Parameters
  26     ----------
  27     datum_name : str, default 'WGS 84'
  28         The name of the datum in the CRS name ('NAD27', 'NAD83', 'WGS 84', …).
  29 
  30     Returns
  31     -------
  32     Series
  33         The element type is :class:`~pyproj.database.CRSInfo`.
  34 
  35     See Also
  36     --------
  37     dtoolkit.geoaccessor.geoseries.utm_crs
  38         Returns the estimated UTM CRS based on the bounds of each geometry.
  39 
  40     dtoolkit.geoaccessor.geodataframe.utm_crs
  41         Returns the estimated UTM CRS based on the bounds of each geometry.
  42 
  43     geopandas.GeoSeries.estimate_utm_crs
  44         Returns the estimated UTM CRS based on the bounds of the dataset.
  45 
  46     geopandas.GeoDataFrame.estimate_utm_crs
  47         Returns the estimated UTM CRS based on the bounds of the dataset.
  48 
  49     Examples
  50     --------
  51     >>> import dtoolkit.accessor
  52     >>> import dtoolkit.geoaccessor
  53     >>> import geopandas as gpd
  54     >>> s = gpd.GeoSeries.from_wkt(["Point (120 50)", "Point (100 1)"], crs="epsg:4326")
  55     >>> s.utm_crs()
  56     0    (EPSG, 32650, WGS 84 / UTM zone 50N, PJType.PR...
  57     1    (EPSG, 32647, WGS 84 / UTM zone 47N, PJType.PR...
  58     dtype: object
  59 
  60     Same operate for GeoDataFrame.
  61 
  62     >>> s.to_frame("geometry").utm_crs()
  63     0    (EPSG, 32650, WGS 84 / UTM zone 50N, PJType.PR...
  64     1    (EPSG, 32647, WGS 84 / UTM zone 47N, PJType.PR...
  65     dtype: object
  66 
  67     Get the EPSG code.
  68 
  69     >>> s.utm_crs().getattr("code")
  70     0    32650
  71     1    32647
  72     dtype: object
  73     """
  74 
  75     return s.bounds.apply(
  76         lambda bound: None
  77         if bound.isna().all()
  78         else query_utm_crs_info(
  79             datum_name=datum_name,
  80             area_of_interest=AreaOfInterest(
  81                 west_lon_degree=bound["minx"],
  82                 south_lat_degree=bound["miny"],
  83                 east_lon_degree=bound["maxx"],
  84                 north_lat_degree=bound["maxy"],
  85             ),
  86         )[0],
  87         axis=1,
  88     )
  89
  ```
  --- END FILES ---
  
  Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.
  
  Here is an example:
  
  ```diff
  diff --git a/examples/server_async.py b/examples/server_async.py
  --- a/examples/server_async.py
  +++ b/examples/server_async.py
  @@ -313,4 +313,4 @@
   
   
   if __name__ == "__main__":
  -    asyncio.run(run_async_server("."), debug=True)
  +    asyncio.run(run_async_server(), debug=True)
  diff --git a/examples/server_sync.py b/examples/server_sync.py
  --- a/examples/server_sync.py
  +++ b/examples/server_sync.py
  @@ -313,5 +313,5 @@
   
   
   if __name__ == "__main__":
  -    server = run_sync_server(".")
  +    server = run_sync_server()
       server.shutdown()
  
  ```
  
golden_diff: diff --git a/dtoolkit/geoaccessor/geoseries/utm_crs.py b/dtoolkit/geoaccessor/geoseries/utm_crs.py
  --- a/dtoolkit/geoaccessor/geoseries/utm_crs.py
  +++ b/dtoolkit/geoaccessor/geoseries/utm_crs.py
  @@ -9,8 +9,8 @@
   
   @register_geoseries_method
   @warning(
  -    "The 'utm_crs' is deprecated and will be removed in 0.0.17. "
  -    "(Warning added DToolKit 0.0.16)",
  +    "The 'utm_crs' is deprecated and will be removed in 0.0.18. "
  +    "(Warning added DToolKit 0.0.17)",
       DeprecationWarning,
       stacklevel=3,
   )
  @@ -18,9 +18,9 @@
       """
       Returns the estimated UTM CRS based on the bounds of each geometry.
   
  -    .. deprecated:: 0.0.17
  -        The 'utm_crs' is deprecated and will be removed in 0.0.17.
  -        (Warning added DToolKit 0.0.16)
  +    .. deprecated:: 0.0.18
  +        The 'utm_crs' is deprecated and will be removed in 0.0.18.
  +        (Warning added DToolKit 0.0.17)
   
       Parameters
       ----------
  
verification_info: {"golden_diff": "diff --git a/dtoolkit/geoaccessor/geoseries/utm_crs.py b/dtoolkit/geoaccessor/geoseries/utm_crs.py\n--- a/dtoolkit/geoaccessor/geoseries/utm_crs.py\n+++ b/dtoolkit/geoaccessor/geoseries/utm_crs.py\n@@ -9,8 +9,8 @@\n \n @register_geoseries_method\n @warning(\n-    \"The 'utm_crs' is deprecated and will be removed in 0.0.17. \"\n-    \"(Warning added DToolKit 0.0.16)\",\n+    \"The 'utm_crs' is deprecated and will be removed in 0.0.18. \"\n+    \"(Warning added DToolKit 0.0.17)\",\n     DeprecationWarning,\n     stacklevel=3,\n )\n@@ -18,9 +18,9 @@\n     \"\"\"\n     Returns the estimated UTM CRS based on the bounds of each geometry.\n \n-    .. deprecated:: 0.0.17\n-        The 'utm_crs' is deprecated and will be removed in 0.0.17.\n-        (Warning added DToolKit 0.0.16)\n+    .. deprecated:: 0.0.18\n+        The 'utm_crs' is deprecated and will be removed in 0.0.18.\n+        (Warning added DToolKit 0.0.17)\n \n     Parameters\n     ----------\n", "issue": "DEP: Depcrated `utm_crs`\n<!--\r\nThanks for contributing a pull request!\r\n\r\nPlease follow these standard acronyms to start the commit message:\r\n\r\n- ENH: enhancement\r\n- BUG: bug fix\r\n- DOC: documentation\r\n- TYP: type annotations\r\n- TST: addition or modification of tests\r\n- MAINT: maintenance commit (refactoring, typos, etc.)\r\n- BLD: change related to building\r\n- REL: related to releasing\r\n- API: an (incompatible) API change\r\n- DEP: deprecate something, or remove a deprecated object\r\n- DEV: development tool or utility\r\n- REV: revert an earlier commit\r\n- PERF: performance improvement\r\n- BOT: always commit via a bot\r\n- CI: related to CI or CD\r\n- CLN: Code cleanup\r\n-->\r\n\r\n- [ ] closes #xxxx\r\n- [x] whatsnew entry\r\n\r\n`pyproj.database.query_utm_crs_info` too slow to query all data.\r\nFor 1 point will cost 200ms but for 2000 points will cost 200s.\r\nEven try `parallelize` to `utm_crs`, but the speed is still so lower.\n", "before_files": [{"content": "import geopandas as gpd\nimport pandas as pd\nfrom pyproj.aoi import AreaOfInterest\nfrom pyproj.database import query_utm_crs_info\n\nfrom dtoolkit.geoaccessor.register import register_geoseries_method\nfrom dtoolkit.util._decorator import warning\n\n\n@register_geoseries_method\n@warning(\n    \"The 'utm_crs' is deprecated and will be removed in 0.0.17. \"\n    \"(Warning added DToolKit 0.0.16)\",\n    DeprecationWarning,\n    stacklevel=3,\n)\ndef utm_crs(s: gpd.GeoSeries, /, datum_name: str = \"WGS 84\") -> pd.Series:\n    \"\"\"\n    Returns the estimated UTM CRS based on the bounds of each geometry.\n\n    .. deprecated:: 0.0.17\n        The 'utm_crs' is deprecated and will be removed in 0.0.17.\n        (Warning added DToolKit 0.0.16)\n\n    Parameters\n    ----------\n    datum_name : str, default 'WGS 84'\n        The name of the datum in the CRS name ('NAD27', 'NAD83', 'WGS 84', \u2026).\n\n    Returns\n    -------\n    Series\n        The element type is :class:`~pyproj.database.CRSInfo`.\n\n    See Also\n    --------\n    dtoolkit.geoaccessor.geoseries.utm_crs\n        Returns the estimated UTM CRS based on the bounds of each geometry.\n\n    dtoolkit.geoaccessor.geodataframe.utm_crs\n        Returns the estimated UTM CRS based on the bounds of each geometry.\n\n    geopandas.GeoSeries.estimate_utm_crs\n        Returns the estimated UTM CRS based on the bounds of the dataset.\n\n    geopandas.GeoDataFrame.estimate_utm_crs\n        Returns the estimated UTM CRS based on the bounds of the dataset.\n\n    Examples\n    --------\n    >>> import dtoolkit.accessor\n    >>> import dtoolkit.geoaccessor\n    >>> import geopandas as gpd\n    >>> s = gpd.GeoSeries.from_wkt([\"Point (120 50)\", \"Point (100 1)\"], crs=\"epsg:4326\")\n    >>> s.utm_crs()\n    0    (EPSG, 32650, WGS 84 / UTM zone 50N, PJType.PR...\n    1    (EPSG, 32647, WGS 84 / UTM zone 47N, PJType.PR...\n    dtype: object\n\n    Same operate for GeoDataFrame.\n\n    >>> s.to_frame(\"geometry\").utm_crs()\n    0    (EPSG, 32650, WGS 84 / UTM zone 50N, PJType.PR...\n    1    (EPSG, 32647, WGS 84 / UTM zone 47N, PJType.PR...\n    dtype: object\n\n    Get the EPSG code.\n\n    >>> s.utm_crs().getattr(\"code\")\n    0    32650\n    1    32647\n    dtype: object\n    \"\"\"\n\n    return s.bounds.apply(\n        lambda bound: None\n        if bound.isna().all()\n        else query_utm_crs_info(\n            datum_name=datum_name,\n            area_of_interest=AreaOfInterest(\n                west_lon_degree=bound[\"minx\"],\n                south_lat_degree=bound[\"miny\"],\n                east_lon_degree=bound[\"maxx\"],\n                north_lat_degree=bound[\"maxy\"],\n            ),\n        )[0],\n        axis=1,\n    )\n", "path": "dtoolkit/geoaccessor/geoseries/utm_crs.py"}], "after_files": [{"content": "import geopandas as gpd\nimport pandas as pd\nfrom pyproj.aoi import AreaOfInterest\nfrom pyproj.database import query_utm_crs_info\n\nfrom dtoolkit.geoaccessor.register import register_geoseries_method\nfrom dtoolkit.util._decorator import warning\n\n\n@register_geoseries_method\n@warning(\n    \"The 'utm_crs' is deprecated and will be removed in 0.0.18. \"\n    \"(Warning added DToolKit 0.0.17)\",\n    DeprecationWarning,\n    stacklevel=3,\n)\ndef utm_crs(s: gpd.GeoSeries, /, datum_name: str = \"WGS 84\") -> pd.Series:\n    \"\"\"\n    Returns the estimated UTM CRS based on the bounds of each geometry.\n\n    .. deprecated:: 0.0.18\n        The 'utm_crs' is deprecated and will be removed in 0.0.18.\n        (Warning added DToolKit 0.0.17)\n\n    Parameters\n    ----------\n    datum_name : str, default 'WGS 84'\n        The name of the datum in the CRS name ('NAD27', 'NAD83', 'WGS 84', \u2026).\n\n    Returns\n    -------\n    Series\n        The element type is :class:`~pyproj.database.CRSInfo`.\n\n    See Also\n    --------\n    dtoolkit.geoaccessor.geoseries.utm_crs\n        Returns the estimated UTM CRS based on the bounds of each geometry.\n\n    dtoolkit.geoaccessor.geodataframe.utm_crs\n        Returns the estimated UTM CRS based on the bounds of each geometry.\n\n    geopandas.GeoSeries.estimate_utm_crs\n        Returns the estimated UTM CRS based on the bounds of the dataset.\n\n    geopandas.GeoDataFrame.estimate_utm_crs\n        Returns the estimated UTM CRS based on the bounds of the dataset.\n\n    Examples\n    --------\n    >>> import dtoolkit.accessor\n    >>> import dtoolkit.geoaccessor\n    >>> import geopandas as gpd\n    >>> s = gpd.GeoSeries.from_wkt([\"Point (120 50)\", \"Point (100 1)\"], crs=\"epsg:4326\")\n    >>> s.utm_crs()\n    0    (EPSG, 32650, WGS 84 / UTM zone 50N, PJType.PR...\n    1    (EPSG, 32647, WGS 84 / UTM zone 47N, PJType.PR...\n    dtype: object\n\n    Same operate for GeoDataFrame.\n\n    >>> s.to_frame(\"geometry\").utm_crs()\n    0    (EPSG, 32650, WGS 84 / UTM zone 50N, PJType.PR...\n    1    (EPSG, 32647, WGS 84 / UTM zone 47N, PJType.PR...\n    dtype: object\n\n    Get the EPSG code.\n\n    >>> s.utm_crs().getattr(\"code\")\n    0    32650\n    1    32647\n    dtype: object\n    \"\"\"\n\n    return s.bounds.apply(\n        lambda bound: None\n        if bound.isna().all()\n        else query_utm_crs_info(\n            datum_name=datum_name,\n            area_of_interest=AreaOfInterest(\n                west_lon_degree=bound[\"minx\"],\n                south_lat_degree=bound[\"miny\"],\n                east_lon_degree=bound[\"maxx\"],\n                north_lat_degree=bound[\"maxy\"],\n            ),\n        )[0],\n        axis=1,\n    )\n", "path": "dtoolkit/geoaccessor/geoseries/utm_crs.py"}]}