回答

收藏

以米为单位获得距离,而不是以米为单位Spatialite为单位获得距离

技术问答 技术问答 412 人阅读 | 0 人回复 | 2023-09-14

我有以下查询:9 d" U& C" J1 M3 r1 T
select distance(GeomFromText('POINT4326,GeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)',4326))这给我0.97度。但是我需要以米为单位,不知道转换成哪个SRID。
6 ?6 T) D  j8 ~  S) Y有人能给我举个例子,如何获得空间元素的米数?* C6 l6 C/ R/ }+ O9 M7 Q$ V; r
这些职位都在欧洲。
2 f. b  C1 T; \$ D; o9 K                                                                " u  M# n8 Z& W- |1 G% k  W
    解决方案:                                                                1 n' G( a- a2 Z% S1 {; X
                                                                只需将以度为单位的值乘以11195-这个值是(Earth meanradius)*PI/180-“地球表面上一个大圆度的平均长度(以米为单位)”。
5 ^' u3 s% L& ~; m使用该方法获得的结果是WGS84椭球的测地距离为1%以内。
' ]( Y. F8 A2 j6 C) a编辑5 t3 a, N8 y1 _* ]
好吧,我上面的回答仍然代表着一个问题:如何将弧度转换为米长,但这不是你想问的(应该问的)。
' ?# g# O. q" t  k) T0 X) p% s- M我没有专业使用Spatialite,所以我假设你的示例查询确实回到了长度(以度为单位)。这不是真的。2 @0 k; o( T7 E# D6 P6 g: c6 d
不幸的是,看来Spatialite距离不能用地理意义来计算。虽然使用了你的几何图形SRID 4326定义,但仍将其视为在飞机上。
+ R& |' g9 ?% j' w这是一个简单的证明:+ S) Z" X- i" a4 v, d: k' O
select Distance(GeomFromText('POINT4326,GeomFromText('POINT(3 4),4326);返回5.0。* N" S# z( Q6 _2 M
这是耻辱 …1 T8 _! q) q, o9 a" R+ b/ i
让我们来看看你的原始查询:- a7 N, M. H6 }/ R  \
select Distance(  GeomFromText('POINT GeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)',4326))MS SQL Server等效查询:* G/ F) t* z3 R# _# V
SELECT (geography::STGeomFromText('POINT(8 49)',4326)).STDistance(geography::STGeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468),4326);立即为您提供正确的结果:105006.5967308468,以米为单位,无任何额外麻烦。
, s) Q* L0 @* ~% m' b. r那么,您对Spatialite选择是什么?5 Q( g- C$ f- j- ~; ]& g! n3 T  I. q
的确,正如你在评论中所说,一个选择是投影你的几何形状,然后计算它。在欧洲使用SRID 3035也很有意义(如果你的位置主要在德国,考虑使用SRID; M3 x$ R: l4 i1 z) [# R$ v' h
25832)。
8 B7 T) B# I2 Q5 n  R! ]( [select Distance(  Transform(GeomFromText('POINT Transform(GeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)返回104969.401605453。
9 y: }5 Z+ F* E* _2 j; ]至于你的其他例子(在注释中):
. B0 f! P8 R' j; b/ ]select distance(  Transform(GeomFromText('POINT(8.328957 49.3035),920900)Transform(GeomFromText('POINT(8.339665 49.3035)有一个更简单的方法(如果你有两个)POINT,而不是POINT和LINESTRING):使用POINT创建LINESTRING并使用GeodesicLength函数,如下所示:9 v$ l0 v% p6 U
select GeodesicLength(GeomFromText('LINESTRING(8.328957 49.920900,8.339665 49.918000)',4326))它833.9100回9100069873。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则