回答

收藏

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

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

我有以下查询:
$ c0 N+ `1 G' r3 O% _select distance(GeomFromText('POINT4326,GeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)',4326))这给我0.97度。但是我需要以米为单位,不知道转换成哪个SRID。
  [& B4 \0 V7 r1 Y! q6 u有人能给我举个例子,如何获得空间元素的米数?
7 r. X0 W# Z* F+ X& M  W7 I这些职位都在欧洲。8 y% D5 C' c. k
                                                                + z( q' ~8 U6 I8 ?/ S! P2 o2 x- M
    解决方案:                                                               
# d7 ]* a. t4 f0 T                                                                只需将以度为单位的值乘以11195-这个值是(Earth meanradius)*PI/180-“地球表面上一个大圆度的平均长度(以米为单位)”。
0 d/ \0 |( h% N; D) L; J使用该方法获得的结果是WGS84椭球的测地距离为1%以内。
$ Z# ~5 S/ s3 o. j5 x5 w7 m3 o编辑
# k' ~  ]* z$ G% Z1 y* {3 t! \8 |好吧,我上面的回答仍然代表着一个问题:如何将弧度转换为米长,但这不是你想问的(应该问的)。+ x- Z- x, [" P( R7 P$ q
我没有专业使用Spatialite,所以我假设你的示例查询确实回到了长度(以度为单位)。这不是真的。5 [! J$ D& q: b/ ^8 X7 v8 V
不幸的是,看来Spatialite距离不能用地理意义来计算。虽然使用了你的几何图形SRID 4326定义,但仍将其视为在飞机上。
% B0 X& B& r! I* c9 y# q这是一个简单的证明:
" i' y2 O) n2 d) w/ r$ n/ X$ l% _select Distance(GeomFromText('POINT4326,GeomFromText('POINT(3 4),4326);返回5.0。
. i# ~& W' _( q3 G这是耻辱 …
0 A' {$ \4 y! D+ \让我们来看看你的原始查询:/ i! p8 e* H- D9 U" k) B! Z' s) a
select Distance(  GeomFromText('POINT GeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)',4326))MS SQL Server等效查询:
# m) D  r4 }: H4 c7 k4 E& G; qSELECT (geography::STGeomFromText('POINT(8 49)',4326)).STDistance(geography::STGeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468),4326);立即为您提供正确的结果:105006.5967308468,以米为单位,无任何额外麻烦。
3 H. Z7 C2 T+ w; c4 t9 A2 Q/ s那么,您对Spatialite选择是什么?: T% ]  b9 ?9 b
的确,正如你在评论中所说,一个选择是投影你的几何形状,然后计算它。在欧洲使用SRID 3035也很有意义(如果你的位置主要在德国,考虑使用SRID& I- C) P8 q( [' [
25832)。
, ?$ }/ v  N8 F+ O3 ?/ j2 rselect Distance(  Transform(GeomFromText('POINT Transform(GeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)返回104969.401605453。
4 M2 B" S) X' s至于你的其他例子(在注释中):
1 o6 Y3 W& Y% b1 r) Tselect distance(  Transform(GeomFromText('POINT(8.328957 49.3035),920900)Transform(GeomFromText('POINT(8.339665 49.3035)有一个更简单的方法(如果你有两个)POINT,而不是POINT和LINESTRING):使用POINT创建LINESTRING并使用GeodesicLength函数,如下所示:
5 y) d0 m2 j: p4 `select GeodesicLength(GeomFromText('LINESTRING(8.328957 49.920900,8.339665 49.918000)',4326))它833.9100回9100069873。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则