回答

收藏

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

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

我有以下查询:+ @: p' x: t" k# r4 F! v6 ^. O+ r
select distance(GeomFromText('POINT4326,GeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)',4326))这给我0.97度。但是我需要以米为单位,不知道转换成哪个SRID。! N5 E) w% O6 u/ E$ r2 n& i
有人能给我举个例子,如何获得空间元素的米数?9 U( ?. G1 e4 P: }8 S& d$ t' t0 f
这些职位都在欧洲。
5 ]* G. s* T% i* Z: a- G                                                               
5 f; a/ [& y$ W    解决方案:                                                               
3 j5 Z9 N2 m4 w# u" X                                                                只需将以度为单位的值乘以11195-这个值是(Earth meanradius)*PI/180-“地球表面上一个大圆度的平均长度(以米为单位)”。4 E7 W, S+ x" d) }- ^% t6 R
使用该方法获得的结果是WGS84椭球的测地距离为1%以内。
( k8 K9 q5 j. ^3 {% ~$ _! \编辑
5 ~$ [5 _+ Z. ]: d+ `: p* W好吧,我上面的回答仍然代表着一个问题:如何将弧度转换为米长,但这不是你想问的(应该问的)。  w& E# L4 c# U: U. F( f. G
我没有专业使用Spatialite,所以我假设你的示例查询确实回到了长度(以度为单位)。这不是真的。. o5 w5 k8 W' r5 q
不幸的是,看来Spatialite距离不能用地理意义来计算。虽然使用了你的几何图形SRID 4326定义,但仍将其视为在飞机上。5 T, B- P2 j  q& B2 c3 w% a
这是一个简单的证明:9 h8 ?2 ~3 z# n2 F6 [; L( l) t
select Distance(GeomFromText('POINT4326,GeomFromText('POINT(3 4),4326);返回5.0。5 m0 J5 @6 b' h1 _
这是耻辱 …8 v+ F+ [" s! L* k+ b+ s
让我们来看看你的原始查询:3 u2 N4 f& q7 d7 C5 p8 _" j, h
select Distance(  GeomFromText('POINT GeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)',4326))MS SQL Server等效查询:
6 h7 r" ^/ k9 E# q* j8 N; S6 H0 u+ RSELECT (geography::STGeomFromText('POINT(8 49)',4326)).STDistance(geography::STGeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468),4326);立即为您提供正确的结果:105006.5967308468,以米为单位,无任何额外麻烦。/ ]' r  V) C0 @9 [8 ^( T
那么,您对Spatialite选择是什么?) Z- Q( Q/ k2 ^  U
的确,正如你在评论中所说,一个选择是投影你的几何形状,然后计算它。在欧洲使用SRID 3035也很有意义(如果你的位置主要在德国,考虑使用SRID7 Z7 M. g- W. W6 d2 G
25832)。
; L: R' I: o0 r1 u# k: `select Distance(  Transform(GeomFromText('POINT Transform(GeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)返回104969.401605453。; d" s- ]! C& j& m9 Q$ V: G
至于你的其他例子(在注释中):
5 x9 V- ^7 \7 p, T# m% t/ V  ?* i6 wselect distance(  Transform(GeomFromText('POINT(8.328957 49.3035),920900)Transform(GeomFromText('POINT(8.339665 49.3035)有一个更简单的方法(如果你有两个)POINT,而不是POINT和LINESTRING):使用POINT创建LINESTRING并使用GeodesicLength函数,如下所示:( i! w. g) r2 P0 t" @9 c
select GeodesicLength(GeomFromText('LINESTRING(8.328957 49.920900,8.339665 49.918000)',4326))它833.9100回9100069873。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则