Compare two points and conclude direction The 2019 Stack Overflow Developer Survey Results Are InCalculate 'Rectangle' Coordinates Given 2 Points and widthDisabling XML schema when using GML3 decodeFeatureCollection in GeoToolsGeotools produces different GEOGCS value for ESRI WKTI am trying to have markers in a KML to follow the direction of the view in Google Earthdistance between two points on different directionGeoTools convert albers projection to image X,YModifying feature attributes of a shapefile in geotoolsSelecting points that fall within classified(?) rasterConic projection view transformationGiven a line find whether another line is along side, N,E,S,W or not
Is it possible to build an equivalent function just looking at the input and output of the original function?
Can't find the latex code for the ⍎ (down tack jot) symbol
It's possible to achieve negative score?
Springs with some finite mass
What are the motivations for publishing new editions of an existing textbook, beyond new discoveries in a field?
Does light intensity oscillate really fast since it is a wave?
What do the Banks children have against barley water?
I looked up a future colleague on linkedin before I started a job. I told my colleague about it and he seemed surprised. Should I apologize?
Evaluating number of iteration with a certain map with While
Is "plugging out" electronic devices an American expression?
Poison Arrows Piercing damage reduced to 0, do you still get poisoned?
Seven sins, seven Wizards, seven symbols, seven times repeated, but six super-heroes
JSON.serialize: is it possible to suppress null values of a map?
Spanish for "widget"
The difference between dialogue marks
Why is it "Tumoren" and not "Tumore"?
If Wish Duplicates Simulacrum, Are Existing Duplicates Destroyed?
Landlord wants to switch my lease to a "Land contract" to "get back at the city"
Output the Arecibo Message
How to answer pointed "are you quitting" questioning when I don't want them to suspect
How to manage monthly salary
sleep command using command is not displayed in ps
Is it worth rebuilding a wheel myself to save money?
How can I create a character who can assume the widest possible range of creature sizes?
Compare two points and conclude direction
The 2019 Stack Overflow Developer Survey Results Are InCalculate 'Rectangle' Coordinates Given 2 Points and widthDisabling XML schema when using GML3 decodeFeatureCollection in GeoToolsGeotools produces different GEOGCS value for ESRI WKTI am trying to have markers in a KML to follow the direction of the view in Google Earthdistance between two points on different directionGeoTools convert albers projection to image X,YModifying feature attributes of a shapefile in geotoolsSelecting points that fall within classified(?) rasterConic projection view transformationGiven a line find whether another line is along side, N,E,S,W or not
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;
Is there a simple method in geotools or JTS to conclude the direction between two geospatial points?
I would like to conclude if point A is (north, south, east, west, NW, NE, SW, SE) when compared with point B?
Or would I need to manually compute the angle between the points (possibly similar to http://docs.geotools.org/stable/userguide/library/referencing/calculator.html) and bin it into the aforementioned directions?
point geotools direction jts-topology-suite
add a comment |
Is there a simple method in geotools or JTS to conclude the direction between two geospatial points?
I would like to conclude if point A is (north, south, east, west, NW, NE, SW, SE) when compared with point B?
Or would I need to manually compute the angle between the points (possibly similar to http://docs.geotools.org/stable/userguide/library/referencing/calculator.html) and bin it into the aforementioned directions?
point geotools direction jts-topology-suite
add a comment |
Is there a simple method in geotools or JTS to conclude the direction between two geospatial points?
I would like to conclude if point A is (north, south, east, west, NW, NE, SW, SE) when compared with point B?
Or would I need to manually compute the angle between the points (possibly similar to http://docs.geotools.org/stable/userguide/library/referencing/calculator.html) and bin it into the aforementioned directions?
point geotools direction jts-topology-suite
Is there a simple method in geotools or JTS to conclude the direction between two geospatial points?
I would like to conclude if point A is (north, south, east, west, NW, NE, SW, SE) when compared with point B?
Or would I need to manually compute the angle between the points (possibly similar to http://docs.geotools.org/stable/userguide/library/referencing/calculator.html) and bin it into the aforementioned directions?
point geotools direction jts-topology-suite
point geotools direction jts-topology-suite
edited Apr 4 at 15:34
Ian Turton♦
50.2k548118
50.2k548118
asked Apr 4 at 15:15
Georg HeilerGeorg Heiler
1998
1998
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
As it happens I have some code lying around that does most of this, so this should do what you need.
import java.util.ArrayList;
import org.geotools.geometry.DirectPosition2D;
import org.geotools.referencing.GeodeticCalculator;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.geotools.util.factory.GeoTools;
import org.locationtech.jts.geom.Point;
import org.opengis.referencing.operation.TransformException;
import com.ianturton.cookbook.utilities.GenerateRandomData;
/**
* given a direction in degrees (from North) return the Compass Point on an 8
* element compass rose.
*
* @author ian
*/
public class CompassRose8
private static final int SIZE = 8;
static final float STEP = 360f / SIZE;
static final float HALF_STEP = STEP / 2.0f;
static final GeodeticCalculator gc = new GeodeticCalculator();
static final String points[] = "N", "NE", "E", "SE", "S", "SW", "W", "NW", "N" ;
static ArrayList<Direction> directions = new ArrayList<>();
static
int k = 0;
for (float i = 0; i <= 360; i += (360.0 / SIZE), k++)
Direction d = new Direction(points[k], i);
directions.add(d);
public static String getDirection(Point p1, Point p2) throws TransformException
gc.setStartingPosition(new DirectPosition2D(DefaultGeographicCRS.WGS84, p1.getX(), p1.getY()));
gc.setDestinationPosition(new DirectPosition2D(DefaultGeographicCRS.WGS84, p2.getX(), p2.getY()));
float heading = (float) (gc.getAzimuth() + 180.0f);
return getDirection(heading);
public static String getDirection(float heading)
while (heading < 0)
heading += 360;
while (heading > 360)
heading -= 360;
for (Direction d : directions)
if (d.contains(heading))
return d.name;
return "bad heading " + heading;
public static void main(String[] args) throws TransformException
// Make sure we know our axis order (doesn't matter which we pick)
System.setProperty(GeoTools.FORCE_LONGITUDE_FIRST_AXIS_ORDER, "true");
Point p1 = GenerateRandomData.createRandomPoint();
Point p2 = GenerateRandomData.createRandomPoint();
System.out.println(p1 + " is " + CompassRose8.getDirection(p1, p2) + " of " + p2);
static public class Direction
private float start;
private float end;
private float centre;
final String name;
Direction(String name, float centre)
this.name = name;
this.centre = centre;
start = this.centre - HALF_STEP;
end = this.centre + HALF_STEP;
public boolean contains(float degree)
return (start < degree && end > degree);
add a comment |
Your Answer
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "79"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fgis.stackexchange.com%2fquestions%2f317803%2fcompare-two-points-and-conclude-direction%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
As it happens I have some code lying around that does most of this, so this should do what you need.
import java.util.ArrayList;
import org.geotools.geometry.DirectPosition2D;
import org.geotools.referencing.GeodeticCalculator;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.geotools.util.factory.GeoTools;
import org.locationtech.jts.geom.Point;
import org.opengis.referencing.operation.TransformException;
import com.ianturton.cookbook.utilities.GenerateRandomData;
/**
* given a direction in degrees (from North) return the Compass Point on an 8
* element compass rose.
*
* @author ian
*/
public class CompassRose8
private static final int SIZE = 8;
static final float STEP = 360f / SIZE;
static final float HALF_STEP = STEP / 2.0f;
static final GeodeticCalculator gc = new GeodeticCalculator();
static final String points[] = "N", "NE", "E", "SE", "S", "SW", "W", "NW", "N" ;
static ArrayList<Direction> directions = new ArrayList<>();
static
int k = 0;
for (float i = 0; i <= 360; i += (360.0 / SIZE), k++)
Direction d = new Direction(points[k], i);
directions.add(d);
public static String getDirection(Point p1, Point p2) throws TransformException
gc.setStartingPosition(new DirectPosition2D(DefaultGeographicCRS.WGS84, p1.getX(), p1.getY()));
gc.setDestinationPosition(new DirectPosition2D(DefaultGeographicCRS.WGS84, p2.getX(), p2.getY()));
float heading = (float) (gc.getAzimuth() + 180.0f);
return getDirection(heading);
public static String getDirection(float heading)
while (heading < 0)
heading += 360;
while (heading > 360)
heading -= 360;
for (Direction d : directions)
if (d.contains(heading))
return d.name;
return "bad heading " + heading;
public static void main(String[] args) throws TransformException
// Make sure we know our axis order (doesn't matter which we pick)
System.setProperty(GeoTools.FORCE_LONGITUDE_FIRST_AXIS_ORDER, "true");
Point p1 = GenerateRandomData.createRandomPoint();
Point p2 = GenerateRandomData.createRandomPoint();
System.out.println(p1 + " is " + CompassRose8.getDirection(p1, p2) + " of " + p2);
static public class Direction
private float start;
private float end;
private float centre;
final String name;
Direction(String name, float centre)
this.name = name;
this.centre = centre;
start = this.centre - HALF_STEP;
end = this.centre + HALF_STEP;
public boolean contains(float degree)
return (start < degree && end > degree);
add a comment |
As it happens I have some code lying around that does most of this, so this should do what you need.
import java.util.ArrayList;
import org.geotools.geometry.DirectPosition2D;
import org.geotools.referencing.GeodeticCalculator;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.geotools.util.factory.GeoTools;
import org.locationtech.jts.geom.Point;
import org.opengis.referencing.operation.TransformException;
import com.ianturton.cookbook.utilities.GenerateRandomData;
/**
* given a direction in degrees (from North) return the Compass Point on an 8
* element compass rose.
*
* @author ian
*/
public class CompassRose8
private static final int SIZE = 8;
static final float STEP = 360f / SIZE;
static final float HALF_STEP = STEP / 2.0f;
static final GeodeticCalculator gc = new GeodeticCalculator();
static final String points[] = "N", "NE", "E", "SE", "S", "SW", "W", "NW", "N" ;
static ArrayList<Direction> directions = new ArrayList<>();
static
int k = 0;
for (float i = 0; i <= 360; i += (360.0 / SIZE), k++)
Direction d = new Direction(points[k], i);
directions.add(d);
public static String getDirection(Point p1, Point p2) throws TransformException
gc.setStartingPosition(new DirectPosition2D(DefaultGeographicCRS.WGS84, p1.getX(), p1.getY()));
gc.setDestinationPosition(new DirectPosition2D(DefaultGeographicCRS.WGS84, p2.getX(), p2.getY()));
float heading = (float) (gc.getAzimuth() + 180.0f);
return getDirection(heading);
public static String getDirection(float heading)
while (heading < 0)
heading += 360;
while (heading > 360)
heading -= 360;
for (Direction d : directions)
if (d.contains(heading))
return d.name;
return "bad heading " + heading;
public static void main(String[] args) throws TransformException
// Make sure we know our axis order (doesn't matter which we pick)
System.setProperty(GeoTools.FORCE_LONGITUDE_FIRST_AXIS_ORDER, "true");
Point p1 = GenerateRandomData.createRandomPoint();
Point p2 = GenerateRandomData.createRandomPoint();
System.out.println(p1 + " is " + CompassRose8.getDirection(p1, p2) + " of " + p2);
static public class Direction
private float start;
private float end;
private float centre;
final String name;
Direction(String name, float centre)
this.name = name;
this.centre = centre;
start = this.centre - HALF_STEP;
end = this.centre + HALF_STEP;
public boolean contains(float degree)
return (start < degree && end > degree);
add a comment |
As it happens I have some code lying around that does most of this, so this should do what you need.
import java.util.ArrayList;
import org.geotools.geometry.DirectPosition2D;
import org.geotools.referencing.GeodeticCalculator;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.geotools.util.factory.GeoTools;
import org.locationtech.jts.geom.Point;
import org.opengis.referencing.operation.TransformException;
import com.ianturton.cookbook.utilities.GenerateRandomData;
/**
* given a direction in degrees (from North) return the Compass Point on an 8
* element compass rose.
*
* @author ian
*/
public class CompassRose8
private static final int SIZE = 8;
static final float STEP = 360f / SIZE;
static final float HALF_STEP = STEP / 2.0f;
static final GeodeticCalculator gc = new GeodeticCalculator();
static final String points[] = "N", "NE", "E", "SE", "S", "SW", "W", "NW", "N" ;
static ArrayList<Direction> directions = new ArrayList<>();
static
int k = 0;
for (float i = 0; i <= 360; i += (360.0 / SIZE), k++)
Direction d = new Direction(points[k], i);
directions.add(d);
public static String getDirection(Point p1, Point p2) throws TransformException
gc.setStartingPosition(new DirectPosition2D(DefaultGeographicCRS.WGS84, p1.getX(), p1.getY()));
gc.setDestinationPosition(new DirectPosition2D(DefaultGeographicCRS.WGS84, p2.getX(), p2.getY()));
float heading = (float) (gc.getAzimuth() + 180.0f);
return getDirection(heading);
public static String getDirection(float heading)
while (heading < 0)
heading += 360;
while (heading > 360)
heading -= 360;
for (Direction d : directions)
if (d.contains(heading))
return d.name;
return "bad heading " + heading;
public static void main(String[] args) throws TransformException
// Make sure we know our axis order (doesn't matter which we pick)
System.setProperty(GeoTools.FORCE_LONGITUDE_FIRST_AXIS_ORDER, "true");
Point p1 = GenerateRandomData.createRandomPoint();
Point p2 = GenerateRandomData.createRandomPoint();
System.out.println(p1 + " is " + CompassRose8.getDirection(p1, p2) + " of " + p2);
static public class Direction
private float start;
private float end;
private float centre;
final String name;
Direction(String name, float centre)
this.name = name;
this.centre = centre;
start = this.centre - HALF_STEP;
end = this.centre + HALF_STEP;
public boolean contains(float degree)
return (start < degree && end > degree);
As it happens I have some code lying around that does most of this, so this should do what you need.
import java.util.ArrayList;
import org.geotools.geometry.DirectPosition2D;
import org.geotools.referencing.GeodeticCalculator;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.geotools.util.factory.GeoTools;
import org.locationtech.jts.geom.Point;
import org.opengis.referencing.operation.TransformException;
import com.ianturton.cookbook.utilities.GenerateRandomData;
/**
* given a direction in degrees (from North) return the Compass Point on an 8
* element compass rose.
*
* @author ian
*/
public class CompassRose8
private static final int SIZE = 8;
static final float STEP = 360f / SIZE;
static final float HALF_STEP = STEP / 2.0f;
static final GeodeticCalculator gc = new GeodeticCalculator();
static final String points[] = "N", "NE", "E", "SE", "S", "SW", "W", "NW", "N" ;
static ArrayList<Direction> directions = new ArrayList<>();
static
int k = 0;
for (float i = 0; i <= 360; i += (360.0 / SIZE), k++)
Direction d = new Direction(points[k], i);
directions.add(d);
public static String getDirection(Point p1, Point p2) throws TransformException
gc.setStartingPosition(new DirectPosition2D(DefaultGeographicCRS.WGS84, p1.getX(), p1.getY()));
gc.setDestinationPosition(new DirectPosition2D(DefaultGeographicCRS.WGS84, p2.getX(), p2.getY()));
float heading = (float) (gc.getAzimuth() + 180.0f);
return getDirection(heading);
public static String getDirection(float heading)
while (heading < 0)
heading += 360;
while (heading > 360)
heading -= 360;
for (Direction d : directions)
if (d.contains(heading))
return d.name;
return "bad heading " + heading;
public static void main(String[] args) throws TransformException
// Make sure we know our axis order (doesn't matter which we pick)
System.setProperty(GeoTools.FORCE_LONGITUDE_FIRST_AXIS_ORDER, "true");
Point p1 = GenerateRandomData.createRandomPoint();
Point p2 = GenerateRandomData.createRandomPoint();
System.out.println(p1 + " is " + CompassRose8.getDirection(p1, p2) + " of " + p2);
static public class Direction
private float start;
private float end;
private float centre;
final String name;
Direction(String name, float centre)
this.name = name;
this.centre = centre;
start = this.centre - HALF_STEP;
end = this.centre + HALF_STEP;
public boolean contains(float degree)
return (start < degree && end > degree);
answered Apr 4 at 16:05
Ian Turton♦Ian Turton
50.2k548118
50.2k548118
add a comment |
add a comment |
Thanks for contributing an answer to Geographic Information Systems Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fgis.stackexchange.com%2fquestions%2f317803%2fcompare-two-points-and-conclude-direction%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown