public void GetZoneForIncidentTest()
 {
     var point = new PoligonoDetalle { Latitud = float.Parse("25.721972"), Longitud = float.Parse("-100.237198") };
     var expectedZonaId = 2;
     var zona = GetZoneForIncident(point);
     Assert.IsNotNull(zona);
     Assert.AreEqual(expectedZonaId, zona.Id);
 }
        public Zona GetZoneForIncident(PoligonoDetalle point)
        {
            var db = new RiinContainer();
            var result = false;
            Zona zone = null;
            var Zonas = db.Estados.First(e => e.Id == 2).Zonas.Where(z => z.Poligonos.PoligonoDetalles.Count > 0);
            foreach (var zona in Zonas)
            {
                var polygon = zona.Poligonos.PoligonoDetalles.ToList();//.Select(p => new Coordinate { Latitude = p.Latitud, Longitude = p.Longitud }).ToList();

                Assert.IsTrue(polygon.Count > 0, "Polygon should have coordinates");

                result = IsPointInPolygon(polygon, point);
                if (result)
                {
                    zone = zona;
                    break;
                }

            }
            return zone;
        }
 static bool IsPointInPolygon(IList<PoligonoDetalle> polygon, PoligonoDetalle point)
 {
     int i, j;
     var c = false;
     for (i = 0, j = polygon.Count - 1; i < polygon.Count; j = i++)
     {
         if ((((polygon[i].Latitud <= point.Latitud) && (point.Latitud < polygon[j].Latitud)) ||
             ((polygon[j].Latitud <= point.Latitud) && (point.Latitud < polygon[i].Latitud))) &&
             (point.Longitud < (polygon[j].Longitud - polygon[i].Longitud) * (point.Latitud - polygon[i].Latitud) / (polygon[j].Latitud - polygon[i].Latitud) + polygon[i].Longitud))
             c = !c;
     }
     return c;
 }
 public void NotZoneFoundForIncident()
 {
     var point = new PoligonoDetalle { Latitud = float.Parse("25.690419"), Longitud = float.Parse("-100.232048") };
     var zona = GetZoneForIncident(point);
     Assert.IsNull(zona);
 }
        public JsonResult GetZoneForIncident(float lat, float lng)
        {
            var db = new RiinContainer();
            var result = false;
            Zona zone = null;
            PoligonoDetalle point = new PoligonoDetalle();
            point.Latitud = lat;
            point.Longitud = lng;
            var Zonas = db.Zonas.Where(z => z.Poligonos.PoligonoDetalles.Count > 0);
            foreach (var zona in Zonas)
            {
                var polygon = zona.Poligonos.PoligonoDetalles.ToList();

                result = IsPointInPolygon(polygon, point);
                if (result)
                {
                    zone = zona;
                    break;
                }

            }
            return Json(zone != null ? zone.Id : -1, JsonRequestBehavior.AllowGet);
        }