【问题标题】:Post DbGeography data type in odata v4 api在 odata v4 api 中发布 DbGeography 数据类型
【发布时间】:2016-02-20 22:34:12
【问题描述】:

我从 DbGeography 数据类型收到的信息位于 Location 中。

{
    "@odata.context":"http://subdomain.mydomain.me/odata/$metadata#Pois","value":[
      {
          "Id":"d57e6603-5530-4457-b041-6398b7182173","Name":"Demo Home","Address":"Zuidstraat 8 8630 Veurne","Location":{
              "Geography":{
                  "CoordinateSystemId":4326,"WellKnownText":"POINT (51.515574 2.025285)","WellKnownBinary":null
              }
          },"TagId":"ec32e8f3-c0b8-4bcc-af6c-7059b1ef1a65","RouteId":null
      }
    ]
}

我尝试了多个 POST,但似乎都没有成功添加 DbGeography 点。

关于如何做到这一点的任何想法?我尝试添加与返回的内容相同的内容(不起作用)并使用类型 + 坐标作为属性(如 odata 标准中所定义。

在另一个问题中,我找到了这个Error getting value from 'WellKnownValue' on 'System.Data.Entity.Spatial.DbGeography,但这个解决方案似乎不够用。

如果我要添加位置:“POINT(lat long)”,我可以使用以下方法生成数据(但我不知道如何)

DbGeography.PointFromText(textValue, 4326)

【问题讨论】:

    标签: asp.net-web-api odata geo odata-v4


    【解决方案1】:

    我将坐标作为经度、纬度发送,然后在服务器端转换为 DbGeography,如下所示:

    型号

    public class MyModel
    {
        [Required]
        public  double Longitude { get; set; }
        [Required]
        public double Latitude { get; set; }
    }
    

    控制器

    public IHttpActionResult Post(MyModel model)
    {
        if (!ModelState.IsValid || model == null)
        {
            // return error
        }
    
        var coordinates = DbGeography.FromText($"POINT({model.Longitude} {model.Latitude})");
    
        // save coordinates to database
    
        return Ok();
    }
    

    【讨论】:

    • 这不是双重处理吗,需要数据库中三倍的空间(通过同时存储点、经度和纬度)?是否有另一种方法可以在请求中发送 lat/long,并在服务器端创建 .FromText 对象,但避免将原始 lat/long 值存储在旁边?
    • 我不确定我是否明白你的意思,但是经纬度已经在服务器端的请求中发布,你不必在数据库中保存纬度/经度,
    • 这是我的问题 - 如果没有在模型中明确声明“经度”和“纬度”,我不知道如何读取经度/经度值。在我的情况下,将它们添加到我的模型中会自动为它们创建数据库列。我想从请求正文中读取他们发布的值。但是,我目前不确定从哪里开始。
    • 这个答案stackoverflow.com/a/18215561/3026149 挽救了我的处境。我能够集成您的代码,并且还避免将纬度和经度保存为单独的数据库列。基本上,我以前不知道 [NotMapped] 属性,所以我的班级能够预期不会保存的数据。感谢您提供出色的代码示例。
    • 我明白了,我使用模型类只是将数据发布到服务器端,整个类没有映射到数据库,这就是为什么我无法理解你的问题,谢谢分享
    猜你喜欢
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 2014-12-28
    • 2015-12-15
    • 2020-09-23
    • 1970-01-01
    • 2014-10-08
    • 2016-05-13
    相关资源
    最近更新 更多