Hello everyone.
The thing is, when I project the point, the getX() and getY() methods of the resulting point (mMapPoint) sometimes throw a GeometryException, because its X and Y values are NaN.
Here is the piece of code with the issue I am currently facing.
double locy = mLocationToShow.getLatitude(); double locx = mLocationToShow.getLongitude(); Point wgsPoint = new Point(locx, locy); SpatialReference spatialNew = SpatialReference.create(4326); SpatialReference spatialMapView = mMapView.getSpatialReference(); // its value is 102100 mMapPoint = (Point) GeometryEngine.project(wgsPoint, spatialNew, spatialMapView); mMapViewEnvelope = new Envelope(mMapPoint, Constants.kMapMiniMapStandardZoom, Constants.kMapMiniMapStandardZoom);
Maybe the issue has something to do with normalization (normalizeCentralMeridian), but I can't figure out how to implement it in this case.
Any help is appreciated.
Solved! Go to Solution.
I believe your X and Y are mixed up.
The Y value cannot be outside of the range of -90 to 90 in projection 4326 since this is decimal degrees.
This image should help:
Which version of the runtime are you using?
It is 10.2.9.
What are these values:
Constants.kMapMiniMapStandardZoom
Also, can you give us an idea of the coordinates before projecting?
Sure! But I assume that the problem arises earlier (when projecting the point with GeometryEngine.project).
Constants.kMapMiniMapStandardZoom = 350.0
For example, the flow is the following:
0. We call this whole method.
1. At the beginning the mMapPoint is not initialized. The mMapView SpatialReference is null.
2. Then we assign wgsPoint the following values: 46.73234939575195 and -117.00054168701172.
3. After this mMapPoint is successfully assigned.
4. Then in another method mMapView is assigned SpatialReference value of 102100.
5. We call this whole method once more.
6. Again, the coordinates of wgsPoint are the same: 46.73234939575195 and -117.000541687011726.
7. And NOW after we once again project the Point, when we try to call getX() or getY() on mMapPoint the exception is thrown.
So the only difference is in the following: during the first call of this method the SpatialReference of mMapView is null and during the second call it is 102100.
What happens when you assign the point a spatial reference rather than specifying it in the project method?
So I just tried reproducing and was unsuccessful in getting any errors or exceptions thrown. Could you be a bit more specific on the exception? What exactly did it say? Below is the code I used trying to repro.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
double locX = -117.000541687011726;
double locY = 46.73234939575195;
Point point = new Point(locX, locY);
Point z = projectPoint(point, null);
Log.e("NOHE", "" + z.getX());
Point point1 = projectPoint(z, SpatialReference.create(102100));
Log.e("NOHE", "" + point1.getX());
}
private Point projectPoint(Point pointToProject, SpatialReference projectTo) {
double locX = pointToProject.getX();
double locY = pointToProject.getY();
Point point = new Point(locX, locY);
return (Point) GeometryEngine.project(point, SpatialReference.create(4326), projectTo);
}
Yes, that is definitely the same case! However, we should swap around the initial coordinates in your example (it's location of Moskow, Idaho) and so we can now reproduce my issue.
double locX = 46.73234939575195; double locY = -117.00054168701172;
After this, I get the same error in your example, as I got in my own code:
Caused by: com.esri.core.geometry.GeometryException: This operation should not be performed on an empty geometry.
at com.esri.core.geometry.Point.getX(SourceFile:143)
I believe your X and Y are mixed up.
The Y value cannot be outside of the range of -90 to 90 in projection 4326 since this is decimal degrees.
This image should help: