{"id":1472,"date":"2014-09-17T04:27:13","date_gmt":"2014-09-17T04:27:13","guid":{"rendered":"http:\/\/blog.jaringanhosting.com\/?p=1472"},"modified":"2014-09-18T05:44:50","modified_gmt":"2014-09-18T05:44:50","slug":"asp-net-mvc-hosting-indonesia-jaringanhosting-com-menggunakan-spatial-data-dengan-sql-server-2012-entity-framework-5-dan-asp-net-mvc","status":"publish","type":"post","link":"https:\/\/blog.jaringanhosting.com\/index.php\/asp-net-mvc-hosting-indonesia-jaringanhosting-com-menggunakan-spatial-data-dengan-sql-server-2012-entity-framework-5-dan-asp-net-mvc\/","title":{"rendered":"ASP.NET MVC Hosting Indonesia \u2013 JaringanHosting.com :: Menggunakan Spatial Data dengan SQL Server 2012, Entity Framework 5 dan ASP.NET MVC"},"content":{"rendered":"<p style=\"text-align: justify\">Banyak developer sejak rilis SQL 2008, meminta agar tipe Spatial Data\u00a0support untuk Entity Framework. Itu adalah mimpi bagi pengguna Microsoft ORM untuk membuat aplikasi bisnis NET cepat dengan menggunakan Spatial Data. Pada bulan Mei 2012 rilis Entity Framework 5 (EF5)<em>.\u00a0<\/em>Telah berhasil meningkatkan kinerja jika dibandingkan dengan versi Entity Framework sebelumnya dan juga memiliki dukungan untuk jenis spasial. Fungsi spasial dalam EF5 membutuhkan NET 4.5.<\/p>\n<p><a href=\"http:\/\/jaringanhosting.com\/Indonesia-ASP-NET-MVC-Hosting\"><img loading=\"lazy\" class=\"aligncenter\" title=\"ASP.NET MVC Hosting Indonesia \u2013 JaringanHosting.com\" src=\"http:\/\/blog.jaringanhosting.com\/wp-content\/uploads\/2014\/09\/banner-jarhost-kotak.jpg\" alt=\"ASP.NET MVC Hosting Indonesia \u2013 JaringanHosting.com\" width=\"305\" height=\"250\" \/><\/a><\/p>\n<p style=\"text-align: justify\">Fungsi spasial dalam EF5 membutuhkan NET 4.5. Ini berarti kita\u00a0perlu menginstall Visual Studios 2012. Anda dapat men-download VS 2012 di sini: http:\/\/www.microsoft.com\/visualstudio\/en-us<\/p>\n<p style=\"text-align: justify\"><strong>Data Spasial di Entity Framework\u00a0<\/strong><\/p>\n<p style=\"text-align: justify\">Dalam Entity Framework 5, Microsoft memperkenalkan DbGeometry dan DbGeography jenis baru. Jenis ini menyediakan perubahan lokasi dan\u00a0banyak fungsi untuk memanipulasi poin spasial menggunakan fungsi geometri yang pada gilirannya dapat digunakan untuk melakukan query spasial umum.<\/p>\n<p style=\"text-align: justify\">Jenis DbGeography \/ DbGeometry yang berubah, yang berarti bahwa kita\u00a0tidak dapat merubah\u00a0setelah jenis tersebut dibuat. Kita\u00a0perlu menggunakan metode khusus\u00a0untuk meng-instantiate\u00a0jenis ini.\u00a0Jenis ini\u00a0tidak memiliki constructor () dan kita\u00a0tidak dapat menetapkan sifat seperti\u00a0Latitude dan\u00a0Longitude.<\/p>\n<p style=\"text-align: justify\">Hal ini penting untuk disampaikan\u00a0bahwa jenis ini didefinisikan\u00a0ke\u00a0dalam System.Data.Entity yang dibuat\u00a0di System.Data.Spatial namespace. Sekarang kita\u00a0mungkin menggunakan SqlGeometry \u00a0dan jenis SqlGeography, didefinisikan dalam Microsoft.SqlServer.Types namespace.<\/p>\n<p style=\"text-align: justify\">Misalnya Entity\u00a0dengan nama\u00a0&#8220;world&#8221; berisi properti geom jenis DbGeometry.<\/p>\n<pre class=\"lang:default decode:true \">[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]\r\n[DataMemberAttribute()]\r\npublic global::System.Data.Spatial.DbGeometry geom\r\n{\r\n    get\r\n    {\r\n        return _geom;\r\n    }\r\n    set\r\n    {\r\n        OngeomChanging(value);\r\n        ReportPropertyChanging(\"geom\");\r\n        _geom = StructuralObject.SetValidValue(value, true, \"geom\");\r\n        ReportPropertyChanged(\"geom\");\r\n        OngeomChanged();\r\n    }\r\n}\r\nprivate global::System.Data.Spatial.DbGeometry _geom;\r\npartial void OngeomChanging(global::System.Data.Spatial.DbGeometry value);\r\npartial void OngeomChanged();<\/pre>\n<p><strong>\u00a0<span style=\"color: #111111\"><a href=\"http:\/\/jaringanhosting.com\/Indonesia-ASP-NET-MVC-4-Hosting\">ASP.NET MVC 4<\/a> Application dengan\u00a0Entity Framework 5 RC dan\u00a0Spatial data.<\/span><\/strong> Kontroler Kontroler mengembalikan tampilan yang berisi kontrol UI, yang menunjukkan unsur-unsur spasial. Pemeliharaan data diimplementasikan kedalam controller. Artikel ini juga difokuskan pada bagian <a href=\"http:\/\/jaringanhosting.com\/Indonesia-ASP-NET-MVC-Hosting\">MVC<\/a>.<\/p>\n<pre class=\"lang:default decode:true \">#region DashboardJs\r\npublic ActionResult DashboardJs()\r\n{\r\n    ViewBag.Message = \"Spatial Data Dashboard\";\r\n\r\n    return View();\r\n}\r\n#endregion \/\/DashboardJs<\/pre>\n<p><strong>Spatial Data Maintenance<\/strong><\/p>\n<p style=\"text-align: justify\">Bila kita memiliki data dari jenis DbGeometry \u00a0\/ DbGeography. Ada dua pilihan:<\/p>\n<p style=\"text-align: justify\">Untuk mengkonversi tipe Spatial Data\u00a0untuk WKT (Well Known Text) dan mengirimkannya ke klien \u00a0sebagai bagian dari JSON atau XML<\/p>\n<p style=\"text-align: justify\">Kita\u00a0harus memiliki metode hasil yang berlanjut\u00a0untuk JSON<\/p>\n<pre class=\"lang:default decode:true \">#region CountryByName\r\n[OutputCache(VaryByParam = \"countryName\", Duration = 120)]\r\npublic JsonResult CountryByName(string countryName)\r\n{\r\n    switch (countryName)\r\n    {\r\n        case \"UK\":\r\n            countryName = \"United Kingdom\";\r\n            break;\r\n        case \"USA\":\r\n            countryName = \"United States\";\r\n            break;\r\n    }\r\n    var results = spDemo.worlds.Where(x =&gt; x.CNTRY_NAME == countryName);\r\n\r\n\r\n    List&lt;CountryInfo&gt; ret = new List&lt;CountryInfo&gt;();\r\n    foreach (world country in results)\r\n    {\r\n        CountryInfo info = new CountryInfo\r\n        {\r\n            Id = country.ID,\r\n            Code = country.CODE,\r\n            CountryName = country.CNTRY_NAME,\r\n            Population = country.POP_CNTRY,\r\n            Extend = GetGeometryBoundary(country)\r\n        };\r\n        ret.Add(info);\r\n    }\r\n\r\n    var retVal = Json(ret, JsonRequestBehavior.AllowGet);\r\n    return retVal;\r\n}\r\n#endregion \/\/CountryByName<\/pre>\n<p style=\"text-align: justify\">Kita\u00a0harus menggunakan juga beberapa metode pembantu untuk mendapatkan daftar poin, yang mewakili sebuah data\u00a0dari contoh DbGeometry. Jangan lupa bahwa titik indeks DbGeometry \/ DbGeography mulai dari 1!.<\/p>\n<pre class=\"lang:default decode:true\">#region GetGeometryBoundary\r\npublic static SpatialRect GetGeometryBoundary(world country)\r\n{\r\n    List&lt;SpatialPoint&gt; multiPoints = new List&lt;SpatialPoint&gt;();\r\n    var numPoints = country.geom.Envelope.ElementAt(1).PointCount;\r\n    for (int i = 1; i &lt;= numPoints; i++)\r\n    {\r\n        SpatialPoint pnt = new SpatialPoint((double)(\r\n           country.geom.Envelope.ElementAt(1).PointAt(i).XCoordinate), \r\n           (double)(country.geom.Envelope.ElementAt(1).PointAt(i).YCoordinate));\r\n        multiPoints.Add(pnt);\r\n\r\n    }\r\n    SpatialRect rect = multiPoints.GetBounds();\r\n    return rect;\r\n}\r\n#endregion \/\/GetGeometryBoundary<\/pre>\n<p>Sebuah <em>class<\/em>\u00a0 yang digunakan untuk penyambungan Data:<\/p>\n<pre class=\"lang:default decode:true \">#region CountryInfo\r\npublic class CountryInfo\r\n{\r\n    public int Id { get; set; }\r\n    public string Code { get; set; }\r\n    public string CountryName { get; set; }\r\n    public long? Population { get; set; }\r\n    public SpatialRect Extend { get; set; }\r\n\r\n}\r\n#endregion \/\/CountryInfo<\/pre>\n<p>Sebuah\u00a0<em>class<\/em>\u00a0yang digunakan untuk menjaga <em>point data<\/em><\/p>\n<pre class=\"lang:default decode:true \">#region SpatialPoint\r\npublic class SpatialPoint\r\n{\r\n    public SpatialPoint(double x, double y)\r\n    {\r\n        this.X = x;\r\n        this.Y = y;\r\n    }\r\n\r\n    public double X { get; set; }\r\n    public double Y { get; set; }\r\n}\r\n#endregion \/\/SpatialPoint<\/pre>\n<p>Sebuah <em>class<\/em>\u00a0untuk membantu menjaga perpanjangan objek geometri (dalam kasus ini negara)<\/p>\n<pre class=\"lang:default decode:true \">#region SpatialRect\r\npublic struct SpatialRect\r\n{\r\n    public SpatialRect(double pLeft, double pTop, double pWidth, double pHeight)\r\n    {\r\n        left = pLeft;\r\n        top = pTop;\r\n        width = pWidth;\r\n        height = pHeight;\r\n    }\r\n\r\n    public double left; \r\n    public double top; \r\n    public double width; \r\n    public double height; \r\n}\r\n#endregion \/\/SpatialRect<\/pre>\n<p>Metode ekstensi yang digunakan untuk mendapatkan batas dari daftar poin<\/p>\n<pre class=\"lang:default decode:true \">#region Extensions\r\npublic static class Extensions\r\n{\r\n\r\n    #region GetBounds\r\n    public static SpatialRect GetBounds(this IList&lt;SpatialPoint&gt; points)\r\n    {\r\n        double xmin = Double.PositiveInfinity;\r\n        double ymin = Double.PositiveInfinity;\r\n        double xmax = Double.NegativeInfinity;\r\n        double ymax = Double.NegativeInfinity;\r\n\r\n        SpatialPoint p;\r\n        for (var i = 0; i &lt; points.Count; i++)\r\n        {\r\n            p = points[i];\r\n            xmin = Math.Min(xmin, p.X);\r\n            ymin = Math.Min(ymin, p.Y);\r\n\r\n            xmax = Math.Max(xmax, p.X);\r\n            ymax = Math.Max(ymax, p.Y);\r\n        }\r\n\r\n        if (Double.IsInfinity(xmin) || Double.IsInfinity(ymin) || \r\n                  Double.IsInfinity(ymin) || Double.IsInfinity(ymax))\r\n        {\r\n            return new SpatialRect(0.0, 0.0, 0.0, 0.0);\r\n        }\r\n\r\n        return new SpatialRect(xmin, ymin, xmax - xmin, ymax - ymin);\r\n    }\r\n    #endregion \/\/GetBounds\r\n} \r\n#endregion \/\/Extensions<\/pre>\n<p>Bagian yang paling penting dalam sampel adalah bagaimana metode query controller yang mengembalikan Spatial Data\u00a0(dalam kasus ini negara). Semoga bermanfaat<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Banyak developer sejak rilis SQL 2008, meminta agar tipe Spatial Data\u00a0support untuk Entity Framework. Itu adalah mimpi bagi pengguna Microsoft ORM untuk membuat aplikasi bisnis NET cepat dengan menggunakan Spatial Data. Pada bulan Mei 2012 rilis Entity Framework 5 (EF5).\u00a0Telah<\/p>\n","protected":false},"author":4710,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[20],"tags":[310,311,557,558,559,560,561],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/blog.jaringanhosting.com\/index.php\/wp-json\/wp\/v2\/posts\/1472"}],"collection":[{"href":"https:\/\/blog.jaringanhosting.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.jaringanhosting.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jaringanhosting.com\/index.php\/wp-json\/wp\/v2\/users\/4710"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jaringanhosting.com\/index.php\/wp-json\/wp\/v2\/comments?post=1472"}],"version-history":[{"count":0,"href":"https:\/\/blog.jaringanhosting.com\/index.php\/wp-json\/wp\/v2\/posts\/1472\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.jaringanhosting.com\/index.php\/wp-json\/wp\/v2\/media?parent=1472"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jaringanhosting.com\/index.php\/wp-json\/wp\/v2\/categories?post=1472"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jaringanhosting.com\/index.php\/wp-json\/wp\/v2\/tags?post=1472"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}