Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 从纬度和经度的两倍构造DbGeography点?_Entity Framework_Geospatial - Fatal编程技术网

Entity framework 从纬度和经度的两倍构造DbGeography点?

Entity framework 从纬度和经度的两倍构造DbGeography点?,entity-framework,geospatial,Entity Framework,Geospatial,我想从纬度和经度的两倍构建一个DbGeography点 我知道我可以将双精度转换为字符串,并使用DbGeography.FromText方法 var latitude = 50.0d; var longitude = 30.0d; var pointString = string.Format( "POINT({0} {1})", longitude.ToString(), latitude.ToString()); var point = DbGeography.F

我想从纬度和经度的两倍构建一个DbGeography点

我知道我可以将双精度转换为字符串,并使用
DbGeography.FromText
方法

var latitude = 50.0d;
var longitude = 30.0d;

var pointString = string.Format(
    "POINT({0} {1})",
    longitude.ToString(),
    latitude.ToString());

var point = DbGeography.FromText(pointString);
但是,将我的double转换为字符串,以便DbGeography能够再次将它们解析为double,这似乎是浪费


我尝试直接构建DbGeography,如下所示:

var point = new DbGeography()
{
    Latitude = 50,
    Longitude = 30
};
  DbGeography.FromText(String.Format(CultureInfo.InvariantCulture, "POINT({0} {1})", longitude, latitude));
但是纬度和经度属性是只读的。(这是有道理的,因为DbGeography类处理的不仅仅是单个点)


DbGeography
类还提供了一个采用字节数组的
FromBinary
方法。我不知道如何将我的纬度和经度加倍到一个格式正确的字节数组中


有没有比上面的代码更简单的方法来构造纬度和经度加倍的DbGeography实例?

简而言之,没有

SqlGeography有一个合适的方法:

Microsoft.SqlServer.Types.SqlGeography.Point(latitude, longitude, srid);
。。。但无论如何,您都必须转换为DbGeography。如果您对此感兴趣,请参阅我之前关于转换的回答:

也就是说,我完全同意拉斐尔·阿尔豪斯的观点,即你应该创建一种静态方法,让你的生活更轻松:

public static DbGeography CreatePoint(double lat, double lon, int srid = 4326)
{
    string wkt = String.Format("POINT({0} {1})", lon, lat);

    return DbGeography.PointFromText(wkt, srid);
}
然后所有的用法都可以通过这个方法

编辑


@科拉耶姆提出了一个很好的建议,即自最初回答这个问题以来,我实际上已经做到了。大多数人使用SRID 4326,因此我们可以通过将其作为参数的默认值来简化静态方法的使用。

您可以将其简化为:

var point = new DbGeography()
{
    Latitude = 50,
    Longitude = 30
};
  DbGeography.FromText(String.Format(CultureInfo.InvariantCulture, "POINT({0} {1})", longitude, latitude));
例如:

DbGeography.FromText("POINT(-73.935242 40.730610)"),
不使用int srid=4326;这是默认值

如果多次使用,请在静态方法中使用:

private static DbGeography CreatePoint(double latitude, double longitude)
{
    return DbGeography.FromText(String.Format(CultureInfo.InvariantCulture, "POINT({0} {1})", longitude, latitude));
}

注意:不要忘记使用
CultureInfo.InvariantCulture
,因为某些区域性会出现异常。

如果您的目标是SQL Server,则无需进行字符串解析即可。首先创建一个SqlGeography:

var sqlPoint = Microsoft.SqlServer.Types.SqlGeography.Point(latitude, longitude, srid);
然后从这个SqlGeography创建一个DbGeography(请参阅my,以回答关于DbGeography转换的单独问题)


为什么不创建一个方法
publicstaticdbgeography-CreatePoint(double,double)
来包装代码?它不会避免转换,但至少会让你的代码更清晰…我可能最终会做类似的事情。可惜没有静态的扩展方法;我希望能够将所有静态的
DbGeography
create方法保存在一个类下。这并不是说这真的有帮助,但在C#6+版本中,可以使用如下字符串插值:DbGeography.FromText($“POINT({longitude}{latitude})”;包含CreatePoint方法的有用GeoUtils类可以在此处找到:@Zharro虽然不难修改以满足用户需求,但上面的示例还允许动态SRID值,而GeoUtils假定为4326。有些人需要不同的SRID(并且可以简单地更改数字),但有些人使用多个SRID,并且能够在方法参数中指定它,这是允许的。@JonBellamy@Zharro这样做可以提供两个世界中最好的
公共静态DbGeography CreatePoint(双lat,双lon,int SRID=4326)
@Korayem你说得对,实际上我自己也是这么做的。为了每个人的利益,我将更新答案。@Shimmy当您想使用空间功能(如最近的位置等)时,这个好处就来了。如果你不这样做,那就没有什么好处了。您可以创建一个复杂类型,但如果要创建复杂类型,还可以使用DbGeography(SqlGeography),所以只需创建两列即可。