ThinkGeo.com    |     Documentation    |     Premium Support

Measure length in zones?

Hi I need help again.


So I have a route and some polygons/areas on top - cost zones (zone1 , zone 2 etc.) no overlap.
The route might run throug multiple zones from start to end.
I need to get the length of how many meters the route was in zone 1, 2 , 3 and so on.
 
Any advice on how to solve this problem?
 
- Niels
 

Niels, 
  
   An idea would be to loop through all of the lines in the route and on each call the LineShape.GetIntersection and pass in the various zone polygons.  For each result get the length and add it to a list of lengths per zone.  I think this should do it. 
  
 David

Hi David. 
  
 So I have a sample here but I’m missing something using ??? where i think something is missing. 
  
 I’m sending the route and zones as inmemoryfeaturelayer. 
  
 
public static List<zoneInfoResponse> GetZoneInfoInRoute(RoutingResult route, FeatureLayer zoneFeatureLayer)
{
    List<Feature> _listfeature = new List<Feature>();
    List<zoneInfoResponse> _listZone = new List<zoneInfoResponse>();
    zoneFeatureLayer.Open();
    _listfeature.AddRange(zoneFeatureLayer.FeatureSource.GetAllFeatures(ReturningColumnsType.AllColumns));
    zoneFeatureLayer.Close();

    var _allLines = route.Route.Lines;
    foreach (var item in _allLines)
    {
     //???
MultilineShape zone = item.GetIntersection(_listfeature.???);

if (zone.Lines.Count() > 0)
{
    zoneInfoResponse zif = new zoneInfoResponse();
    zif.zoneMeter = zone.GetLength(GeographyUnit.Meter, DistanceUnit.Meter); //???
    zif.zoneName = “Dev zone test”;
    _listZone.Add(zif);
}
    }

    return _listZone;
}
public class zoneInfoResponse
{
    public string zoneName { get; set; }
    public double zoneMeter { get; set; }
}


 Hello Niels,


 
I think David shows the right direction, and I write some fake code just follow his idea, please have a look at this:

            InMemoryFeatureLayer im = new InMemoryFeatureLayer();
            Collection<Feature> polygonandarea = im.FeatureSource.GetAllFeatures(ReturningColumnsType.AllColumns);
            var _allLines = route.Route.Lines;
            double finalLength = 0.0;
            foreach (Feature feature in polygonandarea)
            {
                foreach (LineShape item in _allLines)
                {
                    MultilineShape result = item.GetIntersection(feature);
                    finalLength = finalLength + result.GetLength(GeographyUnit.Meter, DistanceUnit.Meter);
                }
            }

Regards,
 
Gary

Thanks for the sample.


Getting some values now, but just not as expected ..



So in my sample I know the entire route is inside only one zone so the distance should match the finallength?.. But..


Distance = 9885.0374695383107


finalLength = 0.12927024616615862


 




Hello Niels, 
  
 That’s wired, can you provide me some data I can make test? You can just pick up the data you meet this problem, and export to the WKT or WKB and send to me. 
  
 Regards, 
  
 Gary

 Sorry for the delay..


Here goes wkt



Expected length ~92 meters of route inside polygon...


LINESTRING(11.9711524880468 55.331777587236,11.971149 55.331772,11.97105 55.331706,11.970951 55.331706,11.970226 55.332068,11.970226 55.332068,11.969781 55.332266,11.969781 55.332266,11.969435 55.332282,11.969237 55.332414,11.969237 55.332414,11.968725 55.332219,11.967998 55.331901,11.96795 55.331883,11.96795 55.331883,11.9674037579175 55.3316984785459)


MULTIPOLYGON(((11.9678774279525 55.332418807526,11.9691014190207 55.3323724002817,11.9690550117764 55.3322621830765,11.9679470388189 55.331554472601,11.9678774279525 55.332418807526)))


 




Hi Niels, 
  
 With the data you provided, we wrote a method to calculate it , the result turns out to be the same as you expected which is 92, so, I reviewed Gary’s demo, found Gary’s demo had a slight error in “finalLenght=finalLength+result.GetLength(GeoGraphyUnit.Meter,DistanceUnit.Meter)”,  we should replace the “ GeoGraphyUnit.Meter “  with  ” GeoGraphyUnit.DecimalDgree”, then your problem will be solved. 
  
 Regards, 
 Edgar

Exelent, so happy to see some meters!!! :)


But I'm a bit confused.


Is there any doc/guide when i should use geographyunit.decimaldgree vs geographyunit.meter?


- Niels



It depends on the data you use to routing. From the wkt you provided, it’s most probable decimaldegree. 
  
 Regards, 
 Edgar