我对MySQL 8.0.13服务器的空间功能有疑问。 我尝试使用ST_Contains函数确定多边形是否包含点。 在我的测试中,两个球形对象(多边形和点)都使用SGID 4326(WGS84投影)定义。
地球东北四分之一多边形:
SELECT(ST_Contains( ST_GeomFromText('POLYGON((0 0,0 180,90 180,90 0,0 0))',4326), ST_GeomFromText('POINT(10 10)',4326) ))
...返回1:确定,该点包含在多边形中。
法国的多边形使格林威治子午线弯曲
SELECT(ST_Contains( ST_GeomFromText('POLYGON((41 -6,41 10.5,51.5 10.5,51.5 -6,41 -6))',4326), ST_GeomFromText('POINT(45 2)',4326) ))
...返回1:确定,该点包含在多边形中。
SELECT (ST_Contains(
ST_GeomFromText( 'POLYGON((41 -6,41 10.5,51.5 10.5,51.5 -6,41 -6))',4326),
ST_GeomFromText( 'POINT(45 -2)',4326 )
))
...返回1:确定,该点包含在多边形中。
穿越国际日期变更线的太平洋中的多边形
SELECT(ST_Contains( ST_GeomFromText('POLYGON((-45 100,-45 -100,45 -100,45 100,-45 100))',4326), ST_GeomFromText('POINT(0 179)',4326) ))
...返回1:确定,该点包含在多边形中。
SELECT (ST_Contains(
ST_GeomFromText( 'POLYGON((-45 100,-45 -100,45 -100, 45 100, -45 100))',4326),
ST_GeomFromText( 'POINT(0 -179)',4326 )
))
...返回1:确定,该点包含在多边形中。
世界顺时针:SW,SE,NE,NW,SW
SELECT(ST_Contains( ST_GeomFromText('POLYGON((-90 -180,-90 180,90 180,90 -180,-90 -180))',4326), ST_GeomFromText('POINT(0 0)',4326) ))
...返回0。KO,未将点检测为多边形的一部分。
SELECT (ST_Contains(
ST_GeomFromText( 'POLYGON((-90 -180,-90 180,90 180,90 -180,-90 -180))',0),
ST_GeomFromText( 'POINT(0 0)',0)
))
...返回1:确定,该点包含在多边形中。
SELECT (ST_Contains(
ST_GeomFromText( 'POLYGON((-89.99 -180,-89.99 180,89.99 180,89.99 -180,-89.99 -180))',0),
ST_GeomFromText( 'POINT(0 0)',0)
))
...返回1:确定,该点包含在多边形中。
我认为POLYGON((-90 -180,-90 180,90 180,90 -180,-90 -180))与空间WGS84坐标无关;该多边形中使用的所有点都是北极! 使用平面投影(SGID 0)时,效果很好。 我还尝试减少纬度以避免使用杆子。 89.99°而不是90°也可以。
然后我的问题是,是否有解决方法/其他解决方案来定义一个完整的地球“多边形”(使用90°纬度),所以我可以使用适用于每种情况的通用SQL查询。
克里斯托夫