是否可以根据指定的坐标和屏幕尺寸计算区域

时间:2018-07-17 19:56:46

标签: ios google-maps react-native latitude-longitude react-native-maps

我有一个坐标,我想为其设置地图区域。
问题是,当我将坐标传递给它在区域中心的函数时,为其创建一个区域时。
我不希望它居中,我需要一点。
例如,如果地图的高度为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
  };
}

可以计算吗?
enter image description here

2 个答案:

答案 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)

longitudeDeltalatitudeDelta是地图两侧和顶部和底部之间的差异。这些值可用于计算给定区域中地图中的不同位置。要了解有关这些值的更多信息,请阅读本文(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>
    );
  }
}