Detect if a point is in a coordinate based polygon in Delphi

In this blog post, we explained how to measure the area of a polygon defined by coordinates. TMS FNC Maps v3.0.3.0 adds a way to detect a point (coordinate) inside a polygon. In this short blog post, we want to show you how to work with this new functionality.

Load GeoJSON

First of all, we are going to load our GeoJSON file with coordinates that define the surface area of Germany.

TMSFNCMaps1.BeginUpdate;
TMSFNCMaps1.LoadGeoJSONFromFile('germany.geojson');
TMSFNCMaps1.EndUpdate;

Then, we style the polygons loaded by the LoadGeoJSONFromFile method. The complete code to load and style polygons is demonstrated below.

procedure LoadGeoJSON;
var
  p: TTMSFNCMapsPolygon;
  I: Integer;
begin
  TMSFNCMaps1.BeginUpdate;
  TMSFNCMaps1.LoadGeoJSONFromFile('germany.geojson');

  for I := 0 to TMSFNCMaps1.Polygons.Count - 1 do
  begin
    p := TMSFNCMaps1.Polygons[I];
    p.FillOpacity := 0.4;
    p.FillColor := gcGreenyellow;
    p.StrokeOpacity := 0.4;
    p.StrokeColor := gcGreen;
  end;

  TMSFNCMaps1.EndUpdate;
end;

Detecting a coordinate inside a polygon

To detect whether or not a coordinate lies inside a polygon, the polygon collection item class exposes a ContainsPoint function. For the purpose of this sample, we used the non visual TTMSFNCGeocoding component and retrieved the coordinates for cities that lie inside and outside of Germany.

procedure DetectPoints;
var
  c1, c2, c3, c4: TTMSFNCMapsCoordinateRec;
const
  v = 'Coordinate inside polygon';
  n = 'Coordinate outside polygon';
begin
  c1 := TMSFNCGeocoding1.GetGeocodingSync('Groningen');
  c2 := TMSFNCGeocoding1.GetGeocodingSync('Dresden');
  c3 := TMSFNCGeocoding1.GetGeocodingSync('Munich');
  c4 := TMSFNCGeocoding1.GetGeocodingSync('Augustenborg');

  if TMSFNCMaps1.Polygons[0].ContainsPoint(c1) then
    TMSFNCMaps1.ShowPopup(c1, v)
  else
    TMSFNCMaps1.ShowPopup(c1, n);

  if TMSFNCMaps1.Polygons[0].ContainsPoint(c2) then
    TMSFNCMaps1.ShowPopup(c2, v)
  else
    TMSFNCMaps1.ShowPopup(c2, n);

  if TMSFNCMaps1.Polygons[0].ContainsPoint(c3) then
    TMSFNCMaps1.ShowPopup(c3, v)
  else
    TMSFNCMaps1.ShowPopup(c3, n);

  if TMSFNCMaps1.Polygons[0].ContainsPoint(c4) then
    TMSFNCMaps1.ShowPopup(c4, v)
  else
    TMSFNCMaps1.ShowPopup(c4, n);
end;

The result output is shown below.

TMS Software Delphi  Components

Alternative detection

The ContainsPoint function at polygon collection item level internally calls the IsPointInArea, which is defined in the *.TMSFNCMapsCommonTypes.pas unit. To use this function, you need to define an array of coordinates. This function can be used without the need to define a polygon inside the Polygons collection. 

function IsPointInArea(ALatitude: Double; ALongitude: Double; ACoordinatesArray: TTMSFNCMapsCoordinateRecArray): Boolean;

Explore!

Go ahead and download TMS FNC Maps. Explore the features and demos and feel free to leave a comment on this blog.