回答

收藏

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

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

我有以下查询:; h/ E; p. E; N' G* B
select distance(GeomFromText('POINT4326,GeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)',4326))这给我0.97度。但是我需要以米为单位,不知道转换成哪个SRID。+ t9 x; k- C" S2 y3 @7 Q( v+ T
有人能给我举个例子,如何获得空间元素的米数?' h/ J1 T5 u$ U. z7 F# e6 Z" e
这些职位都在欧洲。9 u7 A2 F0 _/ x9 Y1 y+ |! o' F3 t
                                                               
7 C1 t8 u6 M$ H7 L    解决方案:                                                               
1 P$ t9 d3 c6 K                                                                只需将以度为单位的值乘以11195-这个值是(Earth meanradius)*PI/180-“地球表面上一个大圆度的平均长度(以米为单位)”。
" }# N3 U& j# m使用该方法获得的结果是WGS84椭球的测地距离为1%以内。
$ M) h* i9 b$ V  P1 j! \编辑
, M: B  I! g6 x! a好吧,我上面的回答仍然代表着一个问题:如何将弧度转换为米长,但这不是你想问的(应该问的)。
9 n* F9 _2 n1 H4 k; E我没有专业使用Spatialite,所以我假设你的示例查询确实回到了长度(以度为单位)。这不是真的。/ F! E, ~& Z- W+ P& l& T: \" l
不幸的是,看来Spatialite距离不能用地理意义来计算。虽然使用了你的几何图形SRID 4326定义,但仍将其视为在飞机上。
$ o! T9 v- i9 s$ A8 `- x5 ~这是一个简单的证明:1 j* K6 r8 L+ `5 V& _; y7 A
select Distance(GeomFromText('POINT4326,GeomFromText('POINT(3 4),4326);返回5.0。
) z# }; M' Q) W( k# V$ T这是耻辱 …2 M' [/ Z. a& W! ]
让我们来看看你的原始查询:
# l: b9 r( s3 K8 m( ?; Fselect Distance(  GeomFromText('POINT GeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)',4326))MS SQL Server等效查询:7 c) ^+ q! w: r5 D, w9 g8 z
SELECT (geography::STGeomFromText('POINT(8 49)',4326)).STDistance(geography::STGeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468),4326);立即为您提供正确的结果:105006.5967308468,以米为单位,无任何额外麻烦。' K: U8 J2 Q( K  l, d. m5 J
那么,您对Spatialite选择是什么?
: O  m% R9 I+ Y6 J: l的确,正如你在评论中所说,一个选择是投影你的几何形状,然后计算它。在欧洲使用SRID 3035也很有意义(如果你的位置主要在德国,考虑使用SRID, g6 g& d# J) K, H# o% V
25832)。
4 p/ E4 i! S. _4 ?5 s( Hselect Distance(  Transform(GeomFromText('POINT Transform(GeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)返回104969.401605453。
) e5 y- S; m( _至于你的其他例子(在注释中):; C) A& q/ w5 a+ Y
select distance(  Transform(GeomFromText('POINT(8.328957 49.3035),920900)Transform(GeomFromText('POINT(8.339665 49.3035)有一个更简单的方法(如果你有两个)POINT,而不是POINT和LINESTRING):使用POINT创建LINESTRING并使用GeodesicLength函数,如下所示:
. D8 Q+ i) |( ~" J& L" s/ fselect GeodesicLength(GeomFromText('LINESTRING(8.328957 49.920900,8.339665 49.918000)',4326))它833.9100回9100069873。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则