我想计算效果中折线上位置的剩余距离。 我有类SnapToPolyline,它依赖于Google Maps Projection(fromLatLngToPoint)来计算最近的点并返回距离。问题是NavigatorMap依赖关系,它是在打开地图时由工厂方法动态创建的。
我可以在运行时从容器中解析当前活动的NavigatorMap对象吗?
你会如何解决这个问题?无论如何这可以在效果中解决,或者我应该从控制器中解除SetDistance。
@Injectable()
export class DistanceEffect{
constructor(private actions$: Actions,
private store$: Store<AppState>,
private injector: Injector
){}
@Effect()
updateDistance$ = this.actions$.ofType(SET_DIRECTION)
.withLatestFrom(this.store$)
.switchMap(([action, state]) => {
const navigatorMap = this.injector.get(NavigatorMap);
const direction: Direction = action.payload;
const coords = state.mapState.coords;
const snapToPolyline = new SnapToPolyline(navigatorMap, direction.polyline);
const distance = snapToPolyline.getRemainingDistAlongRoute(toLatLng(coords));
return of(new SetDistance(distance));
});
}
答案 0 :(得分:0)
解决
我直接使用Projection功能从SnapToPolyline中删除了Google Library的依赖关系。如果有人正在搜索投影源和公式。
// https://gis.stackexchange.com/questions/66247/what-is-the-formula-for-calculating-world-coordinates-for-a-given-latlng-in-goog
//http://wiki.openstreetmap.org/wiki/EPSG:3857
export function fromLatLngToPoint(latlng: google.maps.LatLng) {
const x = (latlng.lng() + 180) / 360 * 256;
const y = ((1 - Math.log(Math.tan(latlng.lat() * Math.PI / 180) + 1 / Math.cos(latlng.lat() * Math.PI / 180)) / Math.PI) / 2 * Math.pow(2, 0)) * 256;
return new google.maps.Point(x, y);
}
export function fromPointToLatLng(point: google.maps.Point){
const lng = point.x / 256 * 360 - 180;
const n = Math.PI - 2 * Math.PI * point.y / 256;
const lat = (180 / Math.PI * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n))));
return new google.maps.LatLng(lat, lng);
}