Happy #MapInfoMonday!
In today's post, I will address a question that came through the MapInfo-L:
Capturing a point (XY coordinates) along a line. Ian Oldfield posted the question but I thought the solution might be helpful for others too.
Ian used the DistanceCalculator to create lines between addresses and the nearest road. So that's also what I did.
In the
Distance Analysis dialog, I first calculated the nearest distance from my addresses to my roads via the
Calculate button. After this, I used the
Save Results button to save the result into a native tab file. The resulting table contains lines from my address points to the nearest location on the roads as you can see in the map below.
It is essential to note the direction of the line as we want to create a point some meters from the last point - the point on the road.
The next step requires an add-in for MapInfo Pro: WindowHelper. You can find this tool in the MapInfo Marketplace from where you can install and load it via a single click.
WindowHelper publishes a number of useful custom MapBasic functions to the MapInfo Pro interface so that you can use these in label expressions, update statements, and more.
The specific function we are after is called
WHCartesianCreatePointAlong
. It allows you to create a point along an existing polyline from the first point of the polyline. As we are looking to create a point from the last point, we can either reverse the direction of the polyline or calculate the length of the polyline and subtract the desired distance from this distance. In my example, I have chosen the first option.
As these processes run in a MapBasic application it can be necessary to tell the application to use a specific coordinate system. This is the case in our example. To do so, WindowHelper also has a function that lets you set the coordinate system by referring to an open table. Also, note that the function
WHCartesianCreatePointAlong
only works with projected data. It doesn't work with data stored in Longitude/Latitude, hence the Cartesian prefix.
I save a copy of the table as I'm about to update the objects stored in the table. The table I'll be updating is called RoadPoint.
I open the SQL Window and open a new Update statement and modify this to look like this:
Set CoordSys Table RoadPoint
Print WHSetCoordsysUsingTable("RoadPoint")
Update RoadPoint
Set OBJ = WHCartesianCreatePointAlong(WHObjectReverse(OBJ), 3, 0)
The first two statements set the coordsys in MapInfo Pro aan in the WindowHelper application to match the coordsys of the table RoadPoint.
The Update statement converts the existing polyline to a point 3 meters from the last point. Notice how I use the function
WHObjectReverse
to reverse the line direction of the object I pass to the function
WHCartesianCreatePointAlong
. This makes the function calculate the distance from the last point instead of the first point.
In the map below, you can see the new points created on the line 3 meters from the road.
I hope this comes in handy.
------------------------------
Peter Horsbøll Møller
Principal Presales Consultant | Distinguished Engineer
Precisely | Trust in Data
------------------------------