GEOS 代表着 Geometry Engine - Open Source ,是一个C++库,从 `Java Topology Suite`_ ②GEOS实现了OpenGIS `Simple Features for SQL`_ _空间谓词函数和空间运算符。GEOS,现在是一个OSGEO项目,最初由 `Refractions Research`_ _加拿大维多利亚州。
geodjango为geos库实现了一个高级的python包装器,其功能包括:
一个获得BSD许可的geos几何例程接口,仅在python中使用 ctypes .
与GeoDjango松散耦合。 例如, GEOSGeometry 对象可以在Django项目/应用程序之外使用。 换句话说,不需要有 DJANGO_SETTINGS_MODULE 设置或使用数据库等。
Mutability: GEOSGeometry 可以修改对象。
跨平台测试。
本节包含使用的简介和教程 GEOSGeometry 对象。
GEOSGeometry 可以通过几种方式创建对象。第一种方法是在一些空间输入上简单地实例化对象--以下是从WKT、HEX、WKB和GeoJSON创建相同几何体的示例:
>>> from django.contrib.gis.geos import GEOSGeometry
>>> pnt = GEOSGeometry("POINT(5 23)") # WKT
>>> pnt = GEOSGeometry("010100000000000000000014400000000000003740") # HEX
>>> pnt = GEOSGeometry(
... memoryview(
... b"\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14@\x00\x00\x00\x00\x00\x007@"
... )
... ) # WKB
>>> pnt = GEOSGeometry(
... '{ "type": "Point", "coordinates": [ 5.000000, 23.000000 ] }'
... ) # GeoJSON
另一种选择是使用要创建的特定几何体类型的构造函数。例如,一个 Point 可以通过将X和Y坐标传入其构造函数来创建对象:
>>> from django.contrib.gis.geos import Point
>>> pnt = Point(5, 23)
所有这些构造函数都带有关键字参数 srid 。例如:
>>> from django.contrib.gis.geos import GEOSGeometry, LineString, Point
>>> print(GEOSGeometry("POINT (0 0)", srid=4326))
SRID=4326;POINT (0 0)
>>> print(LineString((0, 0), (1, 1), srid=4326))
SRID=4326;LINESTRING (0 0, 1 1)
>>> print(Point(0, 0, srid=32140))
SRID=32140;POINT (0 0)
最后,还有 fromfile() 工厂方法,该方法返回 GEOSGeometry 文件中的对象:
>>> from django.contrib.gis.geos import fromfile
>>> pnt = fromfile("/path/to/pnt.wkt")
>>> pnt = fromfile(open("/path/to/pnt.wkt"))
GEOSGeometry 对象是“Pythonic”的,换句话说,可以使用标准的Python约定来访问、修改和迭代组件。例如,您可以迭代 Point :
>>> pnt = Point(5, 23)
>>> [coord for coord in pnt]
[5.0, 23.0]
对于任何几何体对象, GEOSGeometry.coords 属性可用于获取作为Python元组的几何体坐标:
>>> pnt.coords
(5.0, 23.0)
您可以使用标准的Python索引技术获取/设置几何体组件。但是,返回的内容取决于对象的几何体类型。例如,对 LineString 返回坐标元组:
>>> from django.contrib.gis.geos import LineString
>>> line = LineString((0, 0), (0, 50), (50, 50), (50, 0), (0, 0))
>>> line[0]
(0.0, 0.0)
>>> line[-2]
(50.0, 0.0)
而索引则基于 Polygon 将归还戒指(a LinearRing 对象)对应于该索引:
>>> from django.contrib.gis.geos import Polygon
>>> poly = Polygon(((0.0, 0.0), (0.0, 50.0), (50.0, 50.0), (50.0, 0.0), (0.0, 0.0)))
>>> poly[0]
<LinearRing object at 0x1044395b0>
>>> poly[0][-2] # second-to-last coordinate of external ring
(50.0, 0.0)
此外,可以添加或修改几何体的坐标/组件,就像Python列表一样:
>>> line[0] = (1.0, 1.0)
>>> line.pop()
(0.0, 0.0)
>>> line.append((1.0, 1.0))
>>> line.coords
((1.0, 1.0), (0.0, 50.0), (50.0, 50.0), (50.0, 0.0), (1.0, 1.0))
几何图形支持类似集合的运算符:
>>> from django.contrib.gis.geos import LineString
>>> ls1 = LineString((0, 0), (2, 2))
>>> ls2 = LineString((1, 1), (3, 3))
>>> print(ls1 | ls2) # equivalent to `ls1.union(ls2)`
MULTILINESTRING ((0 0, 1 1), (1 1, 2 2), (2 2, 3 3))
>>> print(ls1 & ls2) # equivalent to `ls1.intersection(ls2)`
LINESTRING (1 1, 2 2)
>>> print(ls1 - ls2) # equivalent to `ls1.difference(ls2)`
LINESTRING(0 0, 1 1)
>>> print(ls1 ^ ls2) # equivalent to `ls1.sym_difference(ls2)`
MULTILINESTRING ((0 0, 1 1), (2 2, 3 3))
相等运算符不检查空间相等
这个 GEOSGeometry 相等运算符使用 equals_exact() ,不是 equals() 即,它要求比较的几何图形在相同位置具有相同的坐标,具有相同的SRID:
>>> from django.contrib.gis.geos import LineString
>>> ls1 = LineString((0, 0), (1, 1))
>>> ls2 = LineString((1, 1), (0, 0))
>>> ls3 = LineString((1, 1), (0, 0), srid=4326)
>>> ls1.equals(ls2)
True
>>> ls1 == ls2
False
>>> ls3 == ls2 # different SRIDs
False
GEOSGeometry¶geo_input -- 几何输入值(字符串或 memoryview )
srid (int) -- 空间引用标识符
这是所有地理几何图形对象的基类。它在给定的 geo_input 参数,然后假定正确的几何子类(例如, GEOSGeometry('POINT(1 1)') 将创建一个 Point 对象)。
这个 srid 如果满足以下条件,则将参数设置为所创建几何的SRID geo_input 没有SRID。如果不同的SRID通过 geo_input 和 srid 参数、 ValueError 已提出:
>>> from django.contrib.gis.geos import GEOSGeometry
>>> GEOSGeometry("POINT EMPTY", srid=4326).ewkt
'SRID=4326;POINT EMPTY'
>>> GEOSGeometry("SRID=4326;POINT EMPTY", srid=4326).ewkt
'SRID=4326;POINT EMPTY'
>>> GEOSGeometry("SRID=1;POINT EMPTY", srid=4326)
Traceback (most recent call last):
...
ValueError: Input geometry already has SRID: 1.
接受以下输入格式及其相应的python类型:
格式 |
输入类型 |
|---|---|
WKT/EWKT |
|
六角/HEXEWKB |
|
WKB/EWKB |
|
|
对于geojson格式,srid是基于 crs 成员。如果 crs 未提供,srid默认为4326。
构建一个 GEOSGeometry 来自给定的GML字符串。
以元组形式返回几何图形的坐标。
返回几何图形的尺寸:
0 对于 Point S和 MultiPoint 的S
1 对于 LineString S和 MultiLineString 的S
2 对于 Polygon S和 MultiPolygon 的S
-1 为空 GeometryCollection 的S
非空元素的最大维度 GeometryCollection 的S
返回几何图形中的点集是否为空。
返回与几何图形类型对应的字符串。例如:
>>> pnt = GEOSGeometry("POINT(5 23)")
>>> pnt.geom_type
'Point'
返回几何图形类型标识号。下表显示了每种几何图形类型的值:
几何图形 |
ID |
|---|---|
0 |
|
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
返回几何图形中的坐标数。
返回此几何图形中的几何图形数。换言之,除了几何集合之外,将返回1。
返回一个布尔值,指示几何体是否具有Z维度。
返回一个布尔值,指示几何体是否具有M维度。需要GEOS 3.12。
返回一个布尔值,指示几何图形是否为 LinearRing .
返回一个布尔值,该布尔值指示几何图形是否“简单”。几何图形是简单的,当且仅当它不与自身相交(边界点除外)。例如,一个 LineString 如果对象本身相交,它就不是简单的。因此, LinearRing 和 Polygon 对象总是简单的,因为根据定义,它们不能自己相交。
返回一个布尔值,指示几何图形是否有效。
返回描述几何图形无效原因的字符串。
属性,该属性可用于检索或设置与几何图形关联的SRID。例如:
>>> pnt = Point(5, 23)
>>> print(pnt.srid)
None
>>> pnt.srid = 4326
>>> pnt.srid
4326
此部分中的属性导出 GEOSGeometry 对象转换为另一个。这个输出可以是字符串、缓冲区甚至是另一个对象的形式。
返回几何图形的“扩展”已知文本。这种表示是PostGIS特有的,是OGC WKT标准的超集。 [1] 例如,SRID基本上是在WKT表示之前准备的。 SRID=4326;POINT(5 23) .
备注
此属性的输出不包括PostGIS在其EWKT表示中支持的3dm、3dz和4d信息。
以十六进制形式返回此几何图形的WKB。请注意,SRID值不包括在该表示中,因为它不是OGC规范的一部分(请使用 GEOSGeometry.hexewkb 属性)。
以十六进制形式返回此几何图形的EWKB。这是wkb规范的扩展,其中包括作为该几何图形一部分的srid值。
返回几何图形的geojson表示形式。注意,结果不是一个完整的geojson结构,而是 geometry geojson结构的关键内容。也见 GeoJSON 串行化器 .
Alias GEOSGeometry.json .
返回一个 OGRGeometry 与几何图形相对应的对象。
将此几何图形的wkb(众所周知的二进制)表示形式返回为python缓冲区。不包括srid值,请使用 GEOSGeometry.ewkb 改为属性。
将此几何图形的EWKB表示返回为python缓冲区。这是wkb规范的扩展,其中包括属于此几何图形的任何srid值。
返回几何图形的已知文本(OGC标准)。
以下所有空间谓词方法都采用另一种方法 GEOSGeometry 实例 (other )作为参数,并返回布尔值。
返回 True 如果 other.within(this) 收益率 True .
返回 True 如果此几何图形覆盖指定的几何图形。
这个 covers 谓词具有以下等价定义:
其他几何体的每个点都是该几何体的一个点。
这个 DE-9IM 这两个几何图形的相交矩阵为 T*****FF* , *T****FF* , ***T**FF* ,或 ****T*FF* 。
如果任一几何体为空,则返回 False .
这个谓词类似于 GEOSGeometry.contains() ,但更具包容性(即回报 True 更多情况下)。特别是,不像 contains() 它不区分边界和几何图形内部的点。在大多数情况下, covers() 应该优先于 contains() . 作为附加利益, covers() 更易于优化,因此应优于 contains() .
返回 True 如果两个几何图形的de-9im交集矩阵为 T*T****** (对于点和曲线、点和区域或线和区域) 0******** (对于两条曲线)。
返回 True 如果两个几何图形的de-9im交集矩阵为 FF*FF**** .
返回 True 如果两个几何图形的de-9im交集矩阵为 T*F**FFF* .
如果两个几何图形完全相等,则返回“真”,直至达到指定的公差。这个 tolerance 值应该是表示比较中的误差容限的浮点数,例如, poly1.equals_exact(poly2, 0.001) 将等于千分之一单位内。
退货 True 检查所有顶点的结构、顺序和值在所有维度中是否相同,以确定两个几何图形在点上是等价的。 NaN 值被视为等于其他 NaN 价值观。需要GEOS 3.12。
返回 True 如果 GEOSGeometry.disjoint() 是 False .
如果两个几何图形的de-9im交集矩阵为 T*T***T** (对于两点或两个表面) 1*T***T** (对于两条曲线)。
Returns True if the elements in the DE-9IM intersection matrix
for this geometry and the other matches the given pattern --
a string of nine characters from the alphabet: {T, F, *, 0}.
返回 True 如果两个几何图形的de-9im交集矩阵为 FT******* , F**T***** 或 F***T**** .
返回 True 如果两个几何图形的de-9im交集矩阵为 T*F**F*** .
返回A GEOSGeometry 表示与此几何图形的距离小于或等于给定的 width . 可选的 quadsegs 关键字设置用于近似四分之一圆的段数(默认值为8)。
等同于 buffer() ,但允许自定义缓冲区的样式。
end_cap_style 可以是圆的 (1 ) (2 或平方 (3 )
join_style 可以是圆的 (1 米特 (2 )或斜面 (3 )
斜接比率限制 (mitre_limit )仅影响斜接连接样式。
返回A GEOSGeometry 表示组成此几何图形的点,而不是组成其他几何图形的点。
给定距离(浮点),返回几何图形中的点(或最近点) (LineString 或 MultiLineString )在那个距离。标准化版本将距离作为0(原点)和1(端点)之间的浮点值。
返回A GEOSGeometry 表示此几何图形和其他几何图形共享的点。
返回到几何图形原点的距离(浮动) (LineString 或 MultiLineString )投影到几何体上的点(即最接近给定点的直线点)。标准化版本以0(原点)和1(终点)之间的浮点形式返回距离。
返回表示此几何图形与其他几何图形之间拓扑关系的de-9im交集矩阵(字符串)。
返回新的 GEOSGeometry ,使用Douglas-Peucker算法简化为指定的公差。公差值越高,输出点越少。如果没有提供公差,则默认为0。
默认情况下,此函数不保留拓扑。例如, Polygon 对象可以拆分、折叠成线条或消失。 Polygon 孔可以创建或消失,线可以交叉。通过指定 preserve_topology=True ,结果将具有与输入相同的维度和组件数量;但是,这明显较慢。
返回A GEOSGeometry 组合此几何图形中不在其他几何图形中的点,以及其他不在此几何图形中的点。
返回A GEOSGeometry 表示此几何图形和其他几何图形中的所有点。
将边界作为新分配的几何图形对象返回。
计算此几何图形中所有元素的并集。
结果符合以下合同:
联合一组 LineString S具有完全点头和分解线条的效果。
联合一组 Polygon S将始终返回 Polygon 或 MultiPolygon 几何(与 GEOSGeometry.union() ,如果发生拓扑折叠,则可能返回较低维度的几何图形)。
此属性返回几何图形的面积。
此属性以4元组的形式返回此几何图形的范围,包括 (xmin, ymin, xmax, ymax) .
此方法返回 GEOSGeometry 那是原版的复制品。
返回此几何图形上最近点与给定点之间的距离 geom (另一) GEOSGeometry 对象)。
备注
地理距离计算是线性的——换句话说,即使SRID指定地理坐标系,GEOS也不执行球形计算。
返回此几何图形的长度(例如,对于 Point ,a的长度 LineString 或A的周长 Polygon )
返回GEOS PreparedGeometry 用于此几何图形的内容。 PreparedGeometry 对象针对包含、相交、覆盖、交叉、分离、重叠、接触和内部操作进行优化。参考 准备好的几何图形 有关详细信息的文档。
返回A SpatialReference 与几何体的srid相对应的对象或 None .
根据给定的坐标变换参数变换几何形状 (ct ),它可以是整个SRID、空间参考WKT字符串、PROJ字符串、 SpatialReference 对象,或一个 CoordTransform object.默认情况下,几何图形会就地转换并且不会返回任何内容。然而如果 clone 设置了关键字,则不会修改几何体,而是返回几何体的转换克隆。
备注
加薪 GEOSException 如果gdal不可用或几何体的srid为 None 或小于0。如果使用 CoordTransform 对象。
返回有效的 GEOSGeometry 等效项,尽量不丢失任何输入顶点。如果几何图形已经有效,则会原封不动地返回。这类似于 MakeValid 数据库功能。需要使用GEOS 3.8。
将此几何图形转换为规范形式。如果 clone 关键字,则不修改几何体,而是返回几何体的规格化克隆:
>>> g = MultiPoint(Point(0, 0), Point(2, 2), Point(1, 1))
>>> print(g)
MULTIPOINT (0 0, 2 2, 1 1)
>>> g.normalize()
>>> print(g)
MULTIPOINT (2 2, 1 1, 0 0)
Point¶LineString¶LineString 使用参数实例化对象,参数可以是坐标序列,也可以是 Point 物体。例如,以下内容是等效的:
>>> ls = LineString((0, 0), (1, 1))
>>> ls = LineString(Point(0, 0), Point(1, 1))
此外, LineString 对象也可以通过传入单个坐标序列或 Point 对象:
>>> ls = LineString(((0, 0), (1, 1)))
>>> ls = LineString([Point(0, 0), Point(1, 1)])
空的 LineString 可以通过不传递参数或空序列来实例化对象。以下内容相当:
>>> ls = LineString()
>>> ls = LineString([])
返回是否 LineString 关闭。
LinearRing¶LinearRing 对象的构造方式与 LineString 对象,但是坐标必须是 closed 换句话说,第一个坐标必须与最后一个坐标相同。例如:
>>> ls = LinearRing((0, 0), (0, 1), (1, 1), (0, 0))
注意到 (0, 0) 是第一个和最后一个坐标——如果它们不相等,就会产生一个错误。
Polygon¶Polygon 可以通过传递表示多边形环的参数来实例化对象。参数必须为 LinearRing 实例,或可用于构造 LinearRing :
>>> ext_coords = ((0, 0), (0, 1), (1, 1), (1, 0), (0, 0))
>>> int_coords = ((0.4, 0.4), (0.4, 0.6), (0.6, 0.6), (0.6, 0.4), (0.4, 0.4))
>>> poly = Polygon(ext_coords, int_coords)
>>> poly = Polygon(LinearRing(ext_coords), LinearRing(int_coords))
比较多边形
请注意,可以比较 Polygon 对象直接使用 < 或 > ,但由于比较是通过Polygon的 LineString ,它没有太大的意义(但始终如一、迅速)。您始终可以强制使用 area 物业:
>>> if poly_1.area > poly_2.area:
... pass
...
MultiPoint¶MultiLineString¶MultiLineString 对象可以通过传入 LineString 对象作为参数,或单个序列 LineString 对象:
>>> ls1 = LineString((0, 0), (1, 1))
>>> ls2 = LineString((2, 2), (3, 3))
>>> mls = MultiLineString(ls1, ls2)
>>> mls = MultiLineString([ls1, ls2])
返回A LineString 表示此中所有组件的行合并 MultiLineString .
退货 True 当且仅当所有元素都关闭时。
MultiPolygon¶GeometryCollection¶GeometryCollection 对象可以通过传入其他 GEOSGeometry 作为参数,或单个序列 GEOSGeometry 对象:
>>> poly = Polygon(((0, 0), (0, 1), (1, 1), (0, 0)))
>>> gc = GeometryCollection(Point(0, 0), MultiPoint(Point(0, 0), Point(1, 1)), poly)
>>> gc = GeometryCollection((Point(0, 0), MultiPoint(Point(0, 0), Point(1, 1)), poly))
为了获得准备好的几何图形,请访问 GEOSGeometry.prepared 财产 一旦你有一个 PreparedGeometry 例如,其空间预测方法(如下所列)可以与其他 GEOSGeometry 对象 具有准备好的几何形状的操作可以快几个数量级--准备好的几何形状越复杂,操作的加速就越大。 欲了解更多信息,请咨询 GEOS wiki page on prepared geometries 。
例如:
>>> from django.contrib.gis.geos import Point, Polygon
>>> poly = Polygon.from_bbox((0, 0, 5, 5))
>>> prep_poly = poly.prepared
>>> prep_poly.contains(Point(2.5, 2.5))
True
PreparedGeometry¶file_h (a Python file object or a string path to the file) -- 包含空间数据的输入文件
一 GEOSGeometry 与文件中的空间数据相对应
示例:
>>> from django.contrib.gis.geos import fromfile
>>> g = fromfile("/home/bob/geom.wkt")
一 GEOSGeometry 与字符串中的空间数据相对应
fromstr(string, srid) 等于 GEOSGeometry(string, srid) .
示例:
>>> from django.contrib.gis.geos import fromstr
>>> pnt = fromstr("POINT(-90.5 29.5)", srid=4326)
阅读器I/O类返回 GEOSGeometry 来自给予他们的WKB和/或WKT输入的实例 read(geom) 方法。
所有Writer对象都有一个 write(geom) 方法,返回给定几何体的wkb或wkt。此外, WKBWriter 对象还具有可用于更改字节顺序的属性,以及或包含srid值(换句话说,ewkb)。
WKBWriter 提供对其输出的最大控制。默认情况下,当其 write 方法被调用。但是,它的属性允许创建ewkb,这是wkb标准的超集,包含附加信息。见 WKBWriter.outdim 有关 dim 参数。
以Python形式返回给定几何的WKB buffer 对象。示例:
>>> from django.contrib.gis.geos import Point, WKBWriter
>>> pnt = Point(1, 1)
>>> wkb_w = WKBWriter()
>>> wkb_w.write(pnt)
<read-only buffer for 0x103a898f0, size -1, offset 0 at 0x103a89930>
返回以十六进制表示的几何体的WKB。示例:
>>> from django.contrib.gis.geos import Point, WKBWriter
>>> pnt = Point(1, 1)
>>> wkb_w = WKBWriter()
>>> wkb_w.write_hex(pnt)
'0101000000000000000000F03F000000000000F03F'
此属性可以设置为更改几何图形表示的字节顺序。
序值 |
描述 |
|---|---|
0 |
大端(例如,与RISC系统兼容) |
1 |
小endian(例如,与x86系统兼容) |
示例:
>>> from django.contrib.gis.geos import Point, WKBWriter
>>> wkb_w = WKBWriter()
>>> pnt = Point(1, 1)
>>> wkb_w.write_hex(pnt)
'0101000000000000000000F03F000000000000F03F'
>>> wkb_w.byteorder = 0
'00000000013FF00000000000003FF0000000000000'
此属性可以设置为更改几何图形表示的输出尺寸。换句话说,如果您有一个三维几何图形,那么设置为3,以便Z值包含在WKB中。
外差值 |
描述 |
|---|---|
2 |
默认值,输出2d wkb。 |
3 |
输出三维WKB。 |
示例:
>>> from django.contrib.gis.geos import Point, WKBWriter
>>> wkb_w = WKBWriter()
>>> wkb_w.outdim
2
>>> pnt = Point(1, 1, 1)
>>> wkb_w.write_hex(pnt) # By default, no Z value included:
'0101000000000000000000F03F000000000000F03F'
>>> wkb_w.outdim = 3 # Tell writer to include Z values
>>> wkb_w.write_hex(pnt)
'0101000080000000000000F03F000000000000F03F000000000000F03F'
使用布尔值设置此特性,以指示几何图形的SRID是否应包含在WKB表示中。示例:
>>> from django.contrib.gis.geos import Point, WKBWriter
>>> wkb_w = WKBWriter()
>>> pnt = Point(1, 1, srid=4326)
>>> wkb_w.write_hex(pnt) # By default, no SRID included:
'0101000000000000000000F03F000000000000F03F'
>>> wkb_w.srid = True # Tell writer to include SRID
>>> wkb_w.write_hex(pnt)
'0101000020E6100000000000000000F03F000000000000F03F'
此类允许输出几何图形的WKT表示形式。见 WKBWriter.outdim , trim 和 precision 有关构造函数参数的详细信息的属性。
返回给定几何图形的WKT。示例:
>>> from django.contrib.gis.geos import Point, WKTWriter
>>> pnt = Point(1, 1)
>>> wkt_w = WKTWriter()
>>> wkt_w.write(pnt)
'POINT (1.0000000000000000 1.0000000000000000)'
见 WKBWriter.outdim .
此属性用于启用或禁用修剪不必要的小数。
>>> from django.contrib.gis.geos import Point, WKTWriter
>>> pnt = Point(1, 1)
>>> wkt_w = WKTWriter()
>>> wkt_w.trim
False
>>> wkt_w.write(pnt)
'POINT (1.0000000000000000 1.0000000000000000)'
>>> wkt_w.trim = True
>>> wkt_w.write(pnt)
'POINT (1 1)'
此属性控制坐标的舍入精度;如果设置为 None 舍入已禁用。
>>> from django.contrib.gis.geos import Point, WKTWriter
>>> pnt = Point(1.44, 1.66)
>>> wkt_w = WKTWriter()
>>> print(wkt_w.precision)
None
>>> wkt_w.write(pnt)
'POINT (1.4399999999999999 1.6599999999999999)'
>>> wkt_w.precision = 0
>>> wkt_w.write(pnt)
'POINT (1 2)'
>>> wkt_w.precision = 1
>>> wkt_w.write(pnt)
'POINT (1.4 1.7)'
脚注
GEOS_LIBRARY_PATH¶指定geos c库位置的字符串。通常,仅当geos c库位于非标准位置(例如, /home/bob/lib/libgeos_c.so )
备注
设置必须是 full 路径到 C 共享库;换句话说,您要使用 libgeos_c.so 不是 libgeos.so .
5月 28, 2025