osmdroid API解读(十)
来源:互联网 发布:君将哀而生之乎的生 编辑:程序博客网 时间:2024/06/05 17:20
osmdroid API解读(十)
osmdroid-android org.osmdroid.util.constants包
1. GeoConstants
地理常数
public interface GeoConstants { public static final int RADIUS_EARTH_METERS = 6378137; // 赤道半径 public static final double METERS_PER_STATUTE_MILE = 1609.344; //每法定英里米数 public static final double METERS_PER_NAUTICAL_MILE = 1852; // 每海里米数 public static final double FEET_PER_METER = 3.2808399; // 每米英尺数 public static final int EQUATORCIRCUMFENCE = (int) (2 * Math.PI * RADIUS_EARTH_METERS);//赤道周长}
osmdroid-android org.osmdroid.util包
二维距离计算工具
public class Distance { //计算两点间距离 public static double getSquaredDistanceToPoint( final double pFromX, final double pFromY, final double pToX, final double pToY) { final double dX = pFromX - pToX; final double dY = pFromY - pToY; return dX * dX + dY * dY; } //计算点到线的距离 public static double getSquaredDistanceToLine( final double pFromX, final double pFromY, final double pAX, final double pAY, final double pBX, final double pBY ) { if (pAX == pBX && pAY == pBY) { return getSquaredDistanceToPoint(pAX, pAY, pFromX, pFromY); } final double cross = crossProduct(pAX, pAY, pBX, pBY, pFromX, pFromY); return cross * cross / getSquaredDistanceToPoint(pAX, pAY, pBX, pBY); } //计算点到线段的距离 public static double getSquaredDistanceToSegment( final double pFromX, final double pFromY, final double pAX, final double pAY, final double pBX, final double pBY ) { if (pAX == pBX && pAY == pBY) { return getSquaredDistanceToPoint(pAX, pAY, pFromX, pFromY); } double dot = dotProduct(pAX, pAY, pBX, pBY, pFromX, pFromY); if (dot > 0) { return getSquaredDistanceToPoint(pFromX, pFromY, pBX, pBY); } dot = dotProduct(pBX, pBY, pAX, pAY, pFromX, pFromY); if (dot > 0) { return getSquaredDistanceToPoint(pFromX, pFromY, pAX, pAY); } final double cross = crossProduct(pAX, pAY, pBX, pBY, pFromX, pFromY); return cross * cross / getSquaredDistanceToPoint(pAX, pAY, pBX, pBY); } //计算叉乘AB x AC private static double crossProduct( final double pAX, final double pAY, final double pBX, final double pBY, final double pCX, final double pCY) { return (pBX - pAX) * (pCY - pAY) - (pBY - pAY) * (pCX - pAX); } //计算点乘AB . AC private static double dotProduct( final double pAX, final double pAY, final double pBX, final double pBY, final double pCX, final double pCY) { return (pBX - pAX) * (pCX - pBX) + (pBY - pAY) * (pCY - pBY); }}
2. MyMath
public class MyMath implements MathConstants { private MyMath() { } //Gudermann逆转换 public static double gudermannInverse(final double aLatitude) { return Math.log(Math.tan(PI_4 + (DEG2RAD * aLatitude / 2))); } //Gudermann转换 public static double gudermann(final double y) { return RAD2DEG * Math.atan(Math.sinh(y)); } //取余 public static int mod(int number, final int modulus) { if (number > 0) return number % modulus; while (number < 0) number += modulus; return number; } //转换为比pValue小的最大整数 public static long floorToLong(final double pValue) { final long result = (long) pValue; if (result <= pValue) { return result; } return result - 1; } //转换为比pValue小的最大整数 public static int floorToInt(final double pValue) { final int result = (int) pValue; if (result <= pValue) { return result; } return result - 1; }}
3. PointL
长整型点
public class PointL { public long x; public long y; ...}
4. RectL
长整型矩形
public class RectL { public long left; public long top; public long right; public long bottom; ...}
5. GeoPoint
由经度、纬度、高程描述的地理点
public class GeoPoint implements IGeoPoint, MathConstants, GeoConstants, Parcelable, Serializable, Cloneable { static final long serialVersionUID = 1L; private double mLongitude;//经度 private double mLatitude;//纬度 private double mAltitude;//高程 @Deprecated public GeoPoint(final int aLatitudeE6, final int aLongitudeE6) { this.mLatitude = aLatitudeE6 / 1E6; this.mLongitude = aLongitudeE6 / 1E6; } @Deprecated public GeoPoint(final int aLatitudeE6, final int aLongitudeE6, final int aAltitude) { this.mLatitude = aLatitudeE6 / 1E6; this.mLongitude = aLongitudeE6 / 1E6; this.mAltitude = aAltitude; } public GeoPoint(final double aLatitude, final double aLongitude) { this.mLatitude = aLatitude; this.mLongitude = aLongitude; } public GeoPoint(final double aLatitude, final double aLongitude, final double aAltitude) { this.mLatitude = aLatitude; this.mLongitude = aLongitude; this.mAltitude = aAltitude; } public GeoPoint(final Location aLocation) { this(aLocation.getLatitude(), aLocation.getLongitude(), aLocation.getAltitude()); } public GeoPoint(final GeoPoint aGeopoint) { this.mLatitude = aGeopoint.mLatitude; this.mLongitude = aGeopoint.mLongitude; this.mAltitude = aGeopoint.mAltitude; } //将字符串转化为GeoPoint对象 public static GeoPoint fromDoubleString(final String s, final char spacer) { ... } //将反向的字符串转换为GeoPoint对象 public static GeoPoint fromInvertedDoubleString(final String s, final char spacer) { ... } //将整型的字符串转换为GeoPoint对象 public static GeoPoint fromIntString(final String s) { ... } @Override public double getLongitude() { return this.mLongitude; } @Override public double getLatitude() { return this.mLatitude; } public double getAltitude() { return this.mAltitude; } public void setLatitude(final double aLatitude) { this.mLatitude = aLatitude; } public void setLongitude(final double aLongitude) { this.mLongitude = aLongitude; } public void setAltitude(final double aAltitude) { this.mAltitude = aAltitude; } public void setCoords(final double aLatitude, final double aLongitude) { this.mLatitude = aLatitude; this.mLongitude = aLongitude; } //克隆一个GeoPoint对象 @Override public GeoPoint clone() { return new GeoPoint(this.mLatitude, this.mLongitude, this.mAltitude); } //转换为整数型字符串 public String toIntString() { return new StringBuilder(). append(((int)(this.mLatitude*1E6))). append(","). append(((int)(this.mLongitude*1E6))). append(","). append((int)(this.mAltitude)) .toString(); } //转换为字符串 @Override public String toString() { return new StringBuilder().append(this.mLatitude).append(",").append(this.mLongitude).append(",").append(this.mAltitude) .toString(); } @Override public boolean equals(final Object obj) { if (obj == null) { return false; } if (obj == this) { return true; } if (obj.getClass() != getClass()) { return false; } final GeoPoint rhs = (GeoPoint) obj; return rhs.mLatitude == this.mLatitude && rhs.mLongitude == this.mLongitude && rhs.mAltitude == this.mAltitude; } @Override public int hashCode() { return 37 * (17 * (int)(mLatitude*1E-6) + (int)(mLongitude*1E-6)) + (int)mAltitude; } //求两点间距离(整数型) @Deprecated public int distanceTo(final IGeoPoint other) { return (int) (distanceToAsDouble(other)); } //求两点间double类型距离 public double distanceToAsDouble(final IGeoPoint other) { final double lat1 = DEG2RAD * getLatitude(); final double lat2 = DEG2RAD * other.getLatitude(); final double lon1 = DEG2RAD * getLongitude(); final double lon2 = DEG2RAD * other.getLongitude(); return RADIUS_EARTH_METERS * 2 * Math.asin(Math.min(1, Math.sqrt( Math.pow(Math.sin((lat2 - lat1) / 2), 2) + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin((lon2 - lon1) / 2), 2) ))); } //角度差 public double bearingTo(final IGeoPoint other) { final double lat1 = Math.toRadians(this.mLatitude); final double long1 = Math.toRadians(this.mLongitude); final double lat2 = Math.toRadians(other.getLatitude()); final double long2 = Math.toRadians(other.getLongitude()); final double delta_long = long2 - long1; final double a = Math.sin(delta_long) * Math.cos(lat2); final double b = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(delta_long); final double bearing = Math.toDegrees(Math.atan2(a, b)); final double bearing_normalized = (bearing + 360) % 360; return bearing_normalized; } //求与该点距离为aDistanceInMeters,aBearingInDegrees的点 public GeoPoint destinationPoint(final double aDistanceInMeters, final double aBearingInDegrees) { // convert distance to angular distance final double dist = aDistanceInMeters / RADIUS_EARTH_METERS; // convert bearing to radians final double brng = DEG2RAD * aBearingInDegrees; // get current location in radians final double lat1 = DEG2RAD * getLatitude(); final double lon1 = DEG2RAD * getLongitude(); final double lat2 = Math.asin(Math.sin(lat1) * Math.cos(dist) + Math.cos(lat1) * Math.sin(dist) * Math.cos(brng)); final double lon2 = lon1 + Math.atan2(Math.sin(brng) * Math.sin(dist) * Math.cos(lat1), Math.cos(dist) - Math.sin(lat1) * Math.sin(lat2)); final double lat2deg = lat2 / DEG2RAD; final double lon2deg = lon2 / DEG2RAD; return new GeoPoint(lat2deg, lon2deg); } //两点中心坐标 public static GeoPoint fromCenterBetween(final GeoPoint geoPointA, final GeoPoint geoPointB) { return new GeoPoint((geoPointA.getLatitude() + geoPointB.getLatitude()) / 2, (geoPointA.getLongitude() + geoPointB.getLongitude()) / 2); } //转换为double字符串 public String toDoubleString() { return new StringBuilder().append(this.mLatitude).append(",") .append(this.mLongitude).append(",").append(this.mAltitude).toString(); } //转换为反向的字符串 public String toInvertedDoubleString() { return new StringBuilder().append(this.mLongitude).append(",") .append(this.mLatitude).append(",").append(this.mAltitude).toString(); } @Deprecated @Override public int getLatitudeE6() { return (int) (this.getLatitude() * 1E6); } @Deprecated @Override public int getLongitudeE6() { return (int) (this.getLongitude()* 1E6); }}
6. LocationUtils
位置计算工具
public class LocationUtils implements UtilConstants { private LocationUtils() { } //从Gps或网络获取最新的位置 public static Location getLastKnownLocation(final LocationManager pLocationManager) { if (pLocationManager == null) { return null; } final Location gpsLocation = getLastKnownLocation(pLocationManager, LocationManager.GPS_PROVIDER); final Location networkLocation = getLastKnownLocation(pLocationManager, LocationManager.NETWORK_PROVIDER); if (gpsLocation == null) { return networkLocation; } else if (networkLocation == null) { return gpsLocation; } else { // both are non-null - use the most recent if (networkLocation.getTime() > gpsLocation.getTime() + Configuration.getInstance().getGpsWaitTime()) { return networkLocation; } else { return gpsLocation; } } } private static Location getLastKnownLocation(final LocationManager pLocationManager, final String pProvider) { try { if (!pLocationManager.isProviderEnabled(pProvider)) { return null; } } catch (final IllegalArgumentException e) { return null; } return pLocationManager.getLastKnownLocation(pProvider); }}
7. SegmentIntersection
计算二维线段交点的类
public class SegmentIntersection { ...}
8. SegmentClipper
剪切线段工具
public class SegmentClipper { ...}
9. TileSystem
瓦片系统代理。用于经纬度坐标与瓦片编号系统坐标的转换。
public final class TileSystem {
...}
10. TileLooper
一个用于给定视口所有地图瓦片的循环。
public abstract class TileLooper {
...}
11. BoundingBox
有边界的经纬度方框
public class BoundingBox implements Parcelable, Serializable, MapViewConstants { static final long serialVersionUID = 2L; protected final double mLatNorth;//框的北边纬度 protected final double mLatSouth;//框的南边纬度 protected final double mLonEast;//框的东边经度 protected final double mLonWest;//框的西边经度 public BoundingBox(final double north, final double east, final double south, final double west) { this.mLatNorth = north; this.mLonEast = east; this.mLatSouth = south; this.mLonWest = west; //validate the values // 30 > 0 OK // 30 < 0 not ok if (north > 90.0) throw new IllegalArgumentException("north must be less than 90"); if (south < -90.0) throw new IllegalArgumentException("north more than -90"); if (west < -180) throw new IllegalArgumentException("west must be more than -180"); if (east > 180) throw new IllegalArgumentException("east must be less than 180"); } //克隆框 public BoundingBox clone(){ return new BoundingBox(this.mLatNorth, this.mLonEast, this.mLatSouth, this.mLonWest); } //获取包含本框以及bb2的经纬度框 public BoundingBox concat(BoundingBox bb2){ return new BoundingBox( Math.max(this.mLatNorth, bb2.getLatNorth()), Math.max(this.mLonEast, bb2.getLonEast()), Math.min(this.mLatSouth, bb2.getLatSouth()), Math.min(this.mLonWest, bb2.getLonWest())); } //获取框的中心经纬度点 @Deprecated public GeoPoint getCenter() { return new GeoPoint((this.mLatNorth + this.mLatSouth) / 2.0, (this.mLonEast + this.mLonWest) / 2.0); } public GeoPoint getCenterWithDateLine() { final double latitude = (mLatNorth + mLatSouth) / 2.0; double longitude = (mLonEast + mLonWest) / 2.0; if (mLonEast < mLonWest) { longitude += TileSystem.MaxLongitude; } return new GeoPoint(latitude, longitude); } //获取米为单位的对角线距离 public double getDiagonalLengthInMeters() { return new GeoPoint(this.mLatNorth, this.mLonWest).distanceTo(new GeoPoint( this.mLatSouth, this.mLonEast)); } public double getLatNorth() { return this.mLatNorth; } public double getLatSouth() { return this.mLatSouth; } public double getLonEast() { return this.mLonEast; } public double getLonWest() { return this.mLonWest; } //获取纬度差 public double getLatitudeSpan() { return Math.abs(this.mLatNorth - this.mLatSouth); } //获取经度差 public double getLongitudeSpan() { return Math.abs(this.mLonEast - this.mLonWest); } //获取一个经纬度点在框模型中的相对位置,左上点为(0,0),右下角为(1,1)点 public PointF getRelativePositionOfGeoPointInBoundingBoxWithLinearInterpolation( final double aLatitude, final double aLongitude, final PointF reuse) { final PointF out = (reuse != null) ? reuse : new PointF(); final float y = (float)((this.mLatNorth - aLatitude) / getLatitudeSpan()); final float x = 1 - (float) ((this.mLonEast - aLongitude) / getLongitudeSpan()); out.set(x, y); return out; } public PointF getRelativePositionOfGeoPointInBoundingBoxWithExactGudermannInterpolation( final double aLatitude, final double aLongitude, final PointF reuse) { final PointF out = (reuse != null) ? reuse : new PointF(); final float y = (float) ((gudermannInverse(this.mLatNorth) - gudermannInverse(aLatitude)) / (gudermannInverse(this.mLatNorth) - gudermannInverse(this.mLatSouth))); final float x = 1 - (float) ((this.mLonEast - aLongitude) / getLongitudeSpan()); out.set(x, y); return out; } //根据相对位置反算经纬度点 public GeoPoint getGeoPointOfRelativePositionWithLinearInterpolation(final float relX, final float relY) { double lat = this.mLatNorth - (this.getLatitudeSpan() * relY); double lon = this.mLonWest + (this.getLongitudeSpan() * relX); /* Bring into bounds. */ while (lat > 90.5) lat -= 90.5; while (lat < -90.5) lat += 90.5; /* Bring into bounds. */ while (lon > 180.0) lon -= 180.0; while (lon < -180.0) lon += 180.0; return new GeoPoint(lat, lon); } public GeoPoint getGeoPointOfRelativePositionWithExactGudermannInterpolation(final float relX, final float relY) { final double gudNorth = gudermannInverse(this.mLatNorth); final double gudSouth = gudermannInverse(this.mLatSouth); double lat = gudermann((gudSouth + (1 - relY) * (gudNorth - gudSouth))); double lon = this.mLonWest + (this.getLongitudeSpan() * relX); /* Bring into bounds. */ while (lat > 90.500000) lat -= 90.500000; while (lat < -90.500000) lat += 90.500000; /* Bring into bounds. */ while (lon > 180.000000) lon -= 180.000000; while (lon < -180.000000) lon += 180.000000; return new GeoPoint(lat, lon); } public BoundingBox increaseByScale(final float pBoundingboxPaddingRelativeScale) { final GeoPoint pCenter = this.getCenter(); final double mLatSpanPadded_2 = (this.getLatitudeSpan() * pBoundingboxPaddingRelativeScale) / 2.0; final double mLonSpanPadded_2 = (this.getLongitudeSpan() * pBoundingboxPaddingRelativeScale) / 2.0; return new BoundingBox(pCenter.getLatitude() + mLatSpanPadded_2, pCenter.getLongitude() + mLonSpanPadded_2, pCenter.getLatitude() - mLatSpanPadded_2, pCenter.getLongitude() - mLonSpanPadded_2); } @Override public String toString() { return new StringBuffer().append("N:").append(this.mLatNorth).append("; E:") .append(this.mLonEast).append("; S:").append(this.mLatSouth).append("; W:") .append(this.mLonWest).toString(); } //将一个点放入一个框模型中 public GeoPoint bringToBoundingBox(final double aLatitude, final double aLongitude) { return new GeoPoint(Math.max(this.mLatSouth, Math.min(this.mLatNorth, aLatitude)), Math.max(this.mLonWest, Math.min(this.mLonEast, aLongitude))); } //构造一系列点的框模型 public static BoundingBox fromGeoPoints(final List<? extends IGeoPoint> partialPolyLine) { double minLat = Double.MAX_VALUE; double minLon = Double.MAX_VALUE; double maxLat = -Double.MAX_VALUE; double maxLon = -Double.MAX_VALUE; for (final IGeoPoint gp : partialPolyLine) { final double latitude = gp.getLatitude(); final double longitude = gp.getLongitude(); minLat = Math.min(minLat, latitude); minLon = Math.min(minLon, longitude); maxLat = Math.max(maxLat, latitude); maxLon = Math.max(maxLon, longitude); } return new BoundingBox(maxLat, maxLon, minLat, minLon); } //查看点是否在框中 public boolean contains(final IGeoPoint pGeoPoint) { return contains(pGeoPoint.getLatitude(), pGeoPoint.getLongitude()); } public boolean contains(final double aLatitude, final double aLongitude) { return ((aLatitude < this.mLatNorth) && (aLatitude > this.mLatSouth)) && ((aLongitude < this.mLonEast) && (aLongitude > this.mLonWest)); } @Deprecated public int getLatitudeSpanE6() { return (int)(getLatitudeSpan() * 1E6); } @Deprecated public int getLongitudeSpanE6() { return (int)(getLongitudeSpan() * 1E6); } ...}
阅读全文
0 0
- osmdroid API解读(十)
- osmdroid API解读(一)
- osmdroid API解读(二)
- osmdroid API解读(三)
- osmdroid API解读(四)
- osmdroid API解读(五)
- osmdroid API解读(六)
- osmdroid API解读(七)
- osmdroid API解读(八)
- osmdroid API解读(九)
- osmdroid API解读(十一)
- osmdroid API解读(十二)
- osmdroid API解读(十三)
- osmdroid API解读(十四)
- osmdroid API解读(十五)
- 《代码大全》解读(十)
- 解读 LWUIT 之十:画笔(Painters)
- 解读javamail API 之一(概述篇)
- Git和SVN的区别
- Spring管理Bean的三种创建方式
- Xshell连接不上阿里云报错:connection failed的解决方案
- ssm框架
- PHP中基本排序算法
- osmdroid API解读(十)
- Cocos2dx杂记:Cocos2d 3.x版本 MeshSprite Cocos的网格变换(非原创)
- fdfddfd
- lucene源码-lock和directory--3
- JAVA2222
- 用css写三角形
- 加密操作技巧总结
- [树状数组]51 Nod 1711——平均数
- JS 常见排序算法