我有一张邮政编码表,其中包括每个邮政编码的中心纬度和 lng。我使用它从任意点获取给定英里半径内的邮政编码列表。
我突然想到,仅仅因为 zip 的中心点不在给定的半径内,并不意味着 zip 本身不在半径内。
我用我超高级的艺术技巧在这里说明了这一点:
绿色条纹斑点代表邮政编码 A、B 和 C。
红色污点是每个邮政编码的地理中心
紫红色圆点是目标位置,并且..
块状蓝色圆圈距离目标位置 1 英里
如果我对粉红色污迹 1 英里半径内的所有邮政编码运行查询,则仅返回邮政编码 B 和 C,因为 zip A 的中心点不在 1 英里半径内,即使粉红色污迹本身显然在邮政编码 A 中。
SELECT *,
p.distance_unit
* DEGREES(ACOS(COS(RADIANS(p.latpoint))
* COS(RADIANS(z.y))
* COS(RADIANS(p.longpoint) - RADIANS(z.x))
+ SIN(RADIANS(p.latpoint))
* SIN(RADIANS(z.y)))) AS dist
FROM standard_zip AS z
JOIN ( /* these are the query parameters */
SELECT $lat AS latpoint, $lng AS longpoint,
$miles AS radius, 69 AS distance_unit
) AS p ON 1=1
WHERE z.y …
Run Code Online (Sandbox Code Playgroud) 问题:
我有一个空间表(道路线),使用 ESRI 的SDE.ST_GEOMETRY
用户定义数据类型存储在 Oracle 12c地理数据库中。我想列出线顶点,以便我最终可以访问和更新它们的坐标。如果我使用的是 SDO_GEOMETRY/Oracle Locator,那么我会使用该
SDO_UTIL.GETVERTICES
函数。但是我没有使用 SDO_GEOMETRY/Oracle Locator,并且SDE.ST_GEOMETRY
. 唯一的SDE.ST_GEOMETRY
功能,我可以找到属于顶点ST_PointN
和ST_NumPoints
。
我想出了一个成功完成所有这些的查询 - 将线顶点作为行(受此页面启发):
1 SELECT a.ROAD_ID
2 ,b.NUMBERS VERTEX_INDEX
3 ,a.SDE.ST_X(SDE.ST_PointN(a.SHAPE, b.NUMBERS)) AS X
4 ,a.SDE.ST_Y(SDE.ST_PointN(a.SHAPE, b.NUMBERS)) AS Y
5 FROM ENG.ROADS a
6 CROSS JOIN ENG.NUMBERS b
7 WHERE b.NUMBERS <= SDE.ST_NumPoints(a.SHAPE)
8 --removed to do explain plan: ORDER BY ROAD_ID, b.NUMBERS
----------------------------------------------------------------------------------------------------
| Id | Operation | Name …
Run Code Online (Sandbox Code Playgroud) 我有一个性能不佳的现有数据库解决方案。我正在使用浮点数等使用传统表结构搜索多维数据。数据库包含约 1-2M 行。
经过一番搜索,我发现了 SQL Server 空间数据类型,您可以在其中定义基于 Point 或 MultiPoint 的几何图形,您可以在其中进行距离搜索。我认为这可能是一个解决方案,但我需要一些帮助才能朝着正确的方向开始。
我当前的表结构如下,其中每行包含 2 个(最终更多)XYZ 值:
| ID | X1 | Y1 | Z1 | X2 | Y2 | Z2 |
| 1 | 1.1 | 2.2 | 5.1 | 1.2 | 2.1 | 4.1 |
| 2 | 3.2 | 5.1 | 4.1 | 3.2 | 3.1 | 3.1 |
| 3 | 4.1 | 2.3 | 6.3 | 4.2 | 4.1 | 2.1 |
| 4 | 2.4 | …
Run Code Online (Sandbox Code Playgroud) 我正在 mysql 8 上尝试以下插入查询。
Insert Into fence Set
fenceName='aa',
radius=2,
fenceGeometry=ST_GeomFromText('POINT(102.1893310546875 3.880696482497261)', 4326)
Run Code Online (Sandbox Code Playgroud)
它在 mysql 5.7 上完美运行,但在 mysql 8 中我得到了这个 error Latitude 102.189331 is out of range in function st_geomfromtext. It must be within [-90.000000, 90.000000].
根据一些建议,我也这样做了。
ALTER TABLE fence MODIFY fenceGeometry geometry NOT NULL SRID 4326;
Run Code Online (Sandbox Code Playgroud)
但是它给了我相同的结果。