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()

```

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
     ----------

{"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"}]}