我有以下查询:
select distance(GeomFromText('POINT(8 49)',4326),GeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)',4326))
这给出了0.97度。但我需要用米来表示,不知道要转换到哪个SRID。
有人能给我一个在spatialite中如何将结果转换为米的示例吗?
这些位置都在欧洲。
我有以下查询:
select distance(GeomFromText('POINT(8 49)',4326),GeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)',4326))
这给出了0.97度。但我需要用米来表示,不知道要转换到哪个SRID。
有人能给我一个在spatialite中如何将结果转换为米的示例吗?
这些位置都在欧洲。
111195
,这个值是(地球平均半径)*PI/180
,表示“地球表面上一个大圆度数的平均长度”。使用此方法得到的结果与WGS84椭球体的测地距离相差不超过1%。
select Distance(GeomFromText('POINT(0 0)',4326),GeomFromText('POINT(3 4)',4326));
返回5.0
。
很遗憾...
让我们看看您的原始查询:
select Distance(
GeomFromText('POINT(8 49)',4326),
GeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)',4326)
)
在 MS SQL Server 中的等价查询:
SELECT (geography::STGeomFromText('POINT(8 49)', 4326)).STDistance(geography::STGeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)', 4326));
使用此方法可以立即获得正确结果:105006.59673084648
,以米为单位,且无需任何额外的繁琐步骤。
那么,在Spatialite中有哪些选项可供选择呢?
确实,正如您在评论中所说的,一种选择是对您的几何图形进行投影,并在其上进行计算。对于欧洲地区,使用SRID 3035也是有意义的(如果您的位置大多数在德国,我会考虑使用SRID 25832)。
select Distance(
Transform(GeomFromText('POINT(8 49)',4326),25832),
Transform(GeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)',4326),25832)
)
返回 104969.401605453
。
至于您提供的其他示例(在评论中):
select distance(
Transform(GeomFromText('POINT(8.328957 49.920900)',4326),3035),
Transform(GeomFromText('POINT(8.339665 49.918000)',4326),3035)
)
如果您有两个POINT而不是一个POINT和LINESTRING,则有一种更简单的方法来完成它:使用您的POINT创建一个LINESTRING,并使用GeodesicLength
函数,像这样:
select GeodesicLength(GeomFromText('LINESTRING(8.328957 49.920900, 8.339665 49.918000)',4326))
它返回了833.910006698673
,如预期所示。
Distance()
函数有两个版本。其中一个只需要两个参数并返回CRS单位的距离,另一个需要三个参数并返回米为单位的距离。sqlite> select Distance(MakePoint(0, 0), MakePoint(3, 4));
5.0
sqlite> select Distance(MakePoint(0, 0), MakePoint(3, 4), 1);
554058.923752633