# Source: src/ol/geom/point.js

    goog.provide('ol.geom.Point');

    goog.require('goog.asserts');
    goog.require('ol.extent');
    goog.require('ol.geom.GeometryType');
    goog.require('ol.geom.SimpleGeometry');
    goog.require('ol.geom.flat.deflate');
    goog.require('ol.math');

    /**
     * @classdesc
     * Point geometry.
     *
     * @constructor
     * @extends {ol.geom.SimpleGeometry}
     * @param {ol.geom.RawPoint} coordinates Coordinates.
     * @param {ol.geom.GeometryLayout=} opt_layout Layout.
     * @todo api
     */
    ol.geom.Point = function(coordinates, opt_layout) {
      goog.base(this);
      this.setCoordinates(coordinates,
          /** @type {ol.geom.GeometryLayout|undefined} */ (opt_layout));
    };
    goog.inherits(ol.geom.Point, ol.geom.SimpleGeometry);

    /**
     * @inheritDoc
     * @todo api
     */
    ol.geom.Point.prototype.clone = function() {
      var point = new ol.geom.Point(null);
      point.setFlatCoordinates(this.layout, this.flatCoordinates.slice());
      return point;
    };

    /**
     * @inheritDoc
     */
    ol.geom.Point.prototype.closestPointXY =
        function(x, y, closestPoint, minSquaredDistance) {
      var flatCoordinates = this.flatCoordinates;
      var squaredDistance = ol.math.squaredDistance(
          x, y, flatCoordinates[0], flatCoordinates[1]);
      if (squaredDistance < minSquaredDistance) {
        var stride = this.stride;
        var i;
        for (i = 0; i < stride; ++i) {
          closestPoint[i] = flatCoordinates[i];
        }
        closestPoint.length = stride;
        return squaredDistance;
      } else {
        return minSquaredDistance;
      }
    };

    /**
     * @return {ol.geom.RawPoint} Coordinates.
     * @todo api
     */
    ol.geom.Point.prototype.getCoordinates = function() {
      return this.flatCoordinates.slice();
    };

    /**
     * @inheritDoc
     */
    ol.geom.Point.prototype.getExtent = function(opt_extent) {
      if (this.extentRevision != this.getRevision()) {
        this.extent = ol.extent.createOrUpdateFromCoordinate(
            this.flatCoordinates, this.extent);
        this.extentRevision = this.getRevision();
      }
      goog.asserts.assert(goog.isDef(this.extent));
      return ol.extent.returnOrUpdate(this.extent, opt_extent);
    };

    /**
     * @inheritDoc
     * @todo api
     */
    ol.geom.Point.prototype.getType = function() {
      return ol.geom.GeometryType.POINT;
    };

    /**
     * @param {ol.geom.RawPoint} coordinates Coordinates.
     * @param {ol.geom.GeometryLayout=} opt_layout Layout.
     * @todo api
     */
    ol.geom.Point.prototype.setCoordinates = function(coordinates, opt_layout) {
      if (goog.isNull(coordinates)) {
        this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null);
      } else {
        this.setLayout(opt_layout, coordinates, 0);
        if (goog.isNull(this.flatCoordinates)) {
          this.flatCoordinates = [];
        }
        this.flatCoordinates.length = ol.geom.flat.deflate.coordinate(
            this.flatCoordinates, 0, coordinates, this.stride);
        this.dispatchChangeEvent();
      }
    };

    /**
     * @param {ol.geom.GeometryLayout} layout Layout.
     * @param {Array.<number>} flatCoordinates Flat coordinates.
     */
    ol.geom.Point.prototype.setFlatCoordinates = function(layout, flatCoordinates) {
      this.setFlatCoordinatesInternal(layout, flatCoordinates);
      this.dispatchChangeEvent();
    };