以米为单位获得距离,而不是以米为单位Spatialite为单位获得距离
技术问答
580 人阅读
|
0 人回复
|
2023-09-14
|
我有以下查询:
4 ]$ J' x9 v: A" R% }/ m' ^select distance(GeomFromText('POINT4326,GeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)',4326))这给我0.97度。但是我需要以米为单位,不知道转换成哪个SRID。
2 ~2 D5 ?, H, C( h有人能给我举个例子,如何获得空间元素的米数?/ O, f% g2 B7 d2 n
这些职位都在欧洲。0 q: j- f0 z' G8 G- L0 z6 P
: b z) W" s: G+ c* `! ~9 p
解决方案:
( G2 M3 Z4 Q1 a0 V8 J7 a 只需将以度为单位的值乘以11195-这个值是(Earth meanradius)*PI/180-“地球表面上一个大圆度的平均长度(以米为单位)”。
! L# h0 [, V( o/ e" {使用该方法获得的结果是WGS84椭球的测地距离为1%以内。8 \7 z3 e) _- }7 u7 ?9 v6 P4 i
编辑
1 F8 R3 f" Q* s. ]$ L$ f" R* U好吧,我上面的回答仍然代表着一个问题:如何将弧度转换为米长,但这不是你想问的(应该问的)。
- ~) k% `9 U6 V( G* M/ k' @我没有专业使用Spatialite,所以我假设你的示例查询确实回到了长度(以度为单位)。这不是真的。
9 G9 F0 A N8 L; b8 d不幸的是,看来Spatialite距离不能用地理意义来计算。虽然使用了你的几何图形SRID 4326定义,但仍将其视为在飞机上。
2 s5 o. W8 {$ e2 v这是一个简单的证明:
) C% X* }2 L* H, o) Uselect Distance(GeomFromText('POINT4326,GeomFromText('POINT(3 4),4326);返回5.0。9 a6 a4 z! @ b9 J2 ?4 K0 H* X2 ]4 k
这是耻辱 …
8 S5 M7 \- V* @- {0 {让我们来看看你的原始查询:; w! A/ F* [* J3 P. F) h: L9 @
select Distance( GeomFromText('POINT GeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)',4326))MS SQL Server等效查询:
( [- v& F4 Q E- JSELECT (geography::STGeomFromText('POINT(8 49)',4326)).STDistance(geography::STGeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468),4326);立即为您提供正确的结果:105006.5967308468,以米为单位,无任何额外麻烦。7 |& J8 ?7 ~9 e" y! i
那么,您对Spatialite选择是什么?
$ z8 K0 g+ y. P. \. k的确,正如你在评论中所说,一个选择是投影你的几何形状,然后计算它。在欧洲使用SRID 3035也很有意义(如果你的位置主要在德国,考虑使用SRID
1 C3 V7 _ p2 L( E# j) o- A5 ~25832)。
' S6 h7 U* o, T U1 s* g5 V" Zselect Distance( Transform(GeomFromText('POINT Transform(GeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)返回104969.401605453。" `7 H( f- U$ F# |. x3 K v
至于你的其他例子(在注释中):
) f& @/ P! P: K/ j2 t+ D$ }7 xselect distance( Transform(GeomFromText('POINT(8.328957 49.3035),920900)Transform(GeomFromText('POINT(8.339665 49.3035)有一个更简单的方法(如果你有两个)POINT,而不是POINT和LINESTRING):使用POINT创建LINESTRING并使用GeodesicLength函数,如下所示:
* ^& h8 o( T& C) Q+ {2 Aselect GeodesicLength(GeomFromText('LINESTRING(8.328957 49.920900,8.339665 49.918000)',4326))它833.9100回9100069873。 |
|
|
|
|
|