我有一个坐标,我想为其设置地图区域。
问题是,当我将坐标传递给它在区域中心的函数时,为其创建一个区域时。
我不希望它居中,我需要一点。
例如,如果地图的高度为500,则我想设置区域,以使坐标位于顶部250的中心。
function getRegionForCoordinates(points) {
// points should be an array of { latitude: X, longitude: Y }
let minX, maxX, minY, maxY;
// init first point
((point) => {
minX = point.latitude;
maxX = point.latitude;
minY = point.longitude;
maxY = point.longitude;
})(points[0]);
// calculate rect
points.map((point) => {
minX = Math.min(minX, point.latitude);
maxX = Math.max(maxX, point.latitude);
minY = Math.min(minY, point.longitude);
maxY = Math.max(maxY, point.longitude);
});
const midX = (minX + maxX) / 2;
const midY = (minY + maxY) / 2;
let deltaX = (maxX - minX);
let deltaY = (maxY - minY);
return {
latitude: midX,
longitude: midY,
latitudeDelta: 0.002,
longitudeDelta: 0.002
};
}
答案 0 :(得分:1)
我有一个解决此问题的方法,但是它是通过MapKit(Apple Maps)完成的,因此不确定是否确实对您有帮助,但是可能会给您一些想法...
MapKit具有这种MKCoordinateRegion
类型:
var region: MKCoordinateRegion {
let regionSize = 10000.0
let region = MKCoordinateRegionMakeWithDistance(coordinate, regionSize, regionSize)
return region
}
并可以将地图缩放到该区域:
map.setRegion(region, animated: animated)
我在底部也有一些视图,想将注释放在屏幕的上部居中,因此我必须在设置地图区域之前进行一些计算:
let offset = CGPoint(x: 0, y: bottomViewHeight / 2)
let screenHeight = UIDevice.current.orientation == .portrait ? view.bounds.height : view.bounds.width
let offsetScreenPercentage = Double(offset.y / screenHeight)
region.center.latitude -= region.span.latitudeDelta * offsetScreenPercentage * 2
希望对您有所帮助!
答案 1 :(得分:1)
longitudeDelta
和latitudeDelta
是地图两侧和顶部和底部之间的差异。这些值可用于计算给定区域中地图中的不同位置。要了解有关这些值的更多信息,请阅读本文(MKMapView and Zoom Levels: A Visual Guide)
有了这些信息,您只需要进行少量计算即可。首先,将标记坐标设置为您拥有的坐标,然后可以从增量中添加或减去latitudeDelta
的一部分,并将区域设置为该位置。
下面是用于更好地描述它的示例代码;
export default class App extends Component {
state = {
region: null,
marker: null,
};
setMarkerAndRegion = () => {
const initialReagion = {
latitude: 37.78825,
longitude: -122.4324,
latitudeDelta: 0.0922,
longitudeDelta: 0.0421,
};
// Set marker to the region's LatLong
const marker = {
latitude: initialReagion.latitude,
longitude: initialReagion.longitude,
};
// Subtract the required amount from the latitude
const region = {
latitude: initialReagion.latitude - initialReagion.latitudeDelta / 4,
longitude: initialReagion.longitude,
latitudeDelta: initialReagion.latitudeDelta,
longitudeDelta: initialReagion.longitudeDelta,
};
this.setState({ region, marker });
};
componentDidMount() {
this.setMarkerAndRegion();
}
render() {
const { region, marker } = this.state;
return (
<View style={styles.container}>
{region && (
<MapView style={{ flex: 1 }} initialRegion={region}>
{marker && <Marker coordinate={marker} />}
</MapView>
)}
</View>
);
}
}