একাধিক অক্ষাংশ / দ্রাঘিমাংশ স্থানাঙ্ক জোড়াগুলির কেন্দ্রবিন্দু গণনা করুন


148

অক্ষাংশ এবং দ্রাঘিমাংশ পয়েন্টগুলির একটি সেট দেওয়া, আমি কীভাবে সেই সেটটির কেন্দ্র বিন্দুর অক্ষাংশ এবং দ্রাঘিমাংশকে গণনা করতে পারি (ওরফে পয়েন্ট যা সমস্ত পয়েন্টের সাথে একটি দৃষ্টিভঙ্গি রাখবে)?

সম্পাদনা: পাইথন সমাধান আমি ব্যবহার করেছি:

Convert lat/lon (must be in radians) to Cartesian coordinates for each location.
X = cos(lat) * cos(lon)
Y = cos(lat) * sin(lon)
Z = sin(lat)

Compute average x, y and z coordinates.
x = (x1 + x2 + ... + xn) / n
y = (y1 + y2 + ... + yn) / n
z = (z1 + z2 + ... + zn) / n

Convert average x, y, z coordinate to latitude and longitude.
Lon = atan2(y, x)
Hyp = sqrt(x * x + y * y)
Lat = atan2(z, hyp)

2
আপনার সমাধান সম্পর্কে: সম্ভবত আপনার ত্রুটিগুলি গোলাকার পৃথিবীর অনুমানের সাথে খুব বেশি বড় হবে না, তবে পৃথিবীটি উপবৃত্তাকার হিসাবে আরও ভালভাবে বর্ণনা করা হয়েছে।
জন

1
এটি একটি অজগর ফাংশন হিসাবে লিখেছেন এবং gist.github.com/3718961
অ্যালভিন

14
এটি লক্ষ করা খুব গুরুত্বপূর্ণ যে এটি ধরে নিয়েছে যে আপনার ল্যাট এবং লম্বা রেডিয়ানে রয়েছে! আমি বুঝতে পারি না যে কিছুক্ষণের জন্য আমার মাথা আঁচড়ে গেল। দশমিক থেকে রেডিয়ানে রূপান্তর করতে, দশমিক * পাই / 180 গুন করুন। তারপরে রেডিয়ান থেকে দশকে রূপান্তর করতে 180 / পাই দিয়ে গুণ করুন। এইচটিএইচ
রায়ান গিল

1
দেরী হওয়ার জন্য দুঃখিত, তবে আমি ভাবছিলাম, এই অ্যালগরিদমের পিছনে গণিতটি কী, কেউ আমাকে কিছু পড়ার পরামর্শ দিতে পারে যেখানে এটি ব্যাখ্যা করা হয়েছে? ধন্যবাদ!
টোনিক্স

1
zপ্লিজ কী ?
SoS

উত্তর:


48

তাদের গড় গড় মাত্রার সহজ পদ্ধতির অ্যাঙ্গেলগুলির সাথে অদ্ভুত প্রান্তের কেস থাকে যখন তারা 359 থেকে '0 থেকে 0' এ মোড়ানো থাকে।

এসও সম্পর্কে আরও আগের একটি প্রশ্ন কম্পাস কোণগুলির একটি সেট গড় নির্ধারণ সম্পর্কে জিজ্ঞাসা করেছিল।

গোলাকার স্থানাঙ্কের জন্য সেখানে প্রস্তাবিত পদ্ধতির একটি বিস্তৃতি হ'ল:

  • প্রতিটি ল্যাট / লম্বা জোড়াকে একক দৈর্ঘ্যের 3 ডি ভেক্টরে রূপান্তর করুন।
  • এই ভেক্টরগুলির প্রত্যেককে যোগ করুন
  • ফলস্বরূপ ভেক্টরকে স্বাভাবিক করুন
  • গোলাকার স্থানাঙ্কে ফিরে রূপান্তর করুন

6
দেখতে ভাল লাগে, এই ওয়েব সাইটে আমি যা পেয়েছি তার ভিত্তিতে আমি একই রকম কিছু করেছি: জিওমিডপয়েন্ট / ক্যালকুলেশনHtml
zeke

4
ডাউনভোটার - দয়া করে ব্যাখ্যা করুন এবং আপনি যদি পারেন তবে আরও ভাল সমাধান অফার করুন।
Alnitak

90

ধন্যবাদ! এখানে ডিগ্রি ব্যবহার করে ওপির সমাধানগুলির একটি সি # সংস্করণ রয়েছে। এটি সিস্টেম.ডভাইস.লোকেশন.জিওকর্ডিনেট ক্লাসটি ব্যবহার করে

    public static GeoCoordinate GetCentralGeoCoordinate(
        IList<GeoCoordinate> geoCoordinates)
    {
        if (geoCoordinates.Count == 1)
        {
            return geoCoordinates.Single();
        }

        double x = 0;
        double y = 0;
        double z = 0;

        foreach (var geoCoordinate in geoCoordinates)
        {
            var latitude = geoCoordinate.Latitude * Math.PI / 180;
            var longitude = geoCoordinate.Longitude * Math.PI / 180;

            x += Math.Cos(latitude) * Math.Cos(longitude);
            y += Math.Cos(latitude) * Math.Sin(longitude);
            z += Math.Sin(latitude);
        }

        var total = geoCoordinates.Count;

        x = x / total;
        y = y / total;
        z = z / total;

        var centralLongitude = Math.Atan2(y, x);
        var centralSquareRoot = Math.Sqrt(x * x + y * y);
        var centralLatitude = Math.Atan2(z, centralSquareRoot);

        return new GeoCoordinate(centralLatitude * 180 / Math.PI, centralLongitude * 180 / Math.PI);
    }

40

আমি এই পোস্টটি খুব দরকারী খুঁজে পেয়েছি তাই এখানে পিএইচপি মধ্যে সমাধান। আমি এটি সফলভাবে ব্যবহার করছি এবং কিছু সময় অন্য দেবকে বাঁচাতে চেয়েছিলাম।

/**
 * Get a center latitude,longitude from an array of like geopoints
 *
 * @param array data 2 dimensional array of latitudes and longitudes
 * For Example:
 * $data = array
 * (
 *   0 = > array(45.849382, 76.322333),
 *   1 = > array(45.843543, 75.324143),
 *   2 = > array(45.765744, 76.543223),
 *   3 = > array(45.784234, 74.542335)
 * );
*/
function GetCenterFromDegrees($data)
{
    if (!is_array($data)) return FALSE;

    $num_coords = count($data);

    $X = 0.0;
    $Y = 0.0;
    $Z = 0.0;

    foreach ($data as $coord)
    {
        $lat = $coord[0] * pi() / 180;
        $lon = $coord[1] * pi() / 180;

        $a = cos($lat) * cos($lon);
        $b = cos($lat) * sin($lon);
        $c = sin($lat);

        $X += $a;
        $Y += $b;
        $Z += $c;
    }

    $X /= $num_coords;
    $Y /= $num_coords;
    $Z /= $num_coords;

    $lon = atan2($Y, $X);
    $hyp = sqrt($X * $X + $Y * $Y);
    $lat = atan2($Z, $hyp);

    return array($lat * 180 / pi(), $lon * 180 / pi());
}

1
আমি এই সমাধানটি ব্যবহার করেছি তবে এটি কোনওরকম ভুল সমাধান দেয় - যদি আমি কোনও মানচিত্রে কিছু স্থানাঙ্কগুলির কেন্দ্রটি অনুসন্ধান করি তবে এটি "পয়েন্টগুলি" ধরণের ধরণের এবং যেখানে আরও পয়েন্ট রয়েছে সেখানে থাকার প্রবণতা রয়েছে।
লোফিল্ড থিওি

2
@ অ্যালনিটাক এখানে আমরা স্থানাঙ্কগুলি দ্বারা নির্ধারিত অঞ্চলটির কেন্দ্রটি সন্ধান করতে চাই। আপনি কি নিশ্চিত যে আপনি সঠিক জায়গায় মন্তব্য করেছেন?
লোফিল্ড থিওরী

29

খুব দরকারী পোস্ট! আমি জাভাস্ক্রিপ্ট এ প্রয়োগ করেছি, এর মাধ্যমে আমার কোড। আমি এটি সফলভাবে ব্যবহার করেছি

function rad2degr(rad) { return rad * 180 / Math.PI; }
function degr2rad(degr) { return degr * Math.PI / 180; }

/**
 * @param latLngInDeg array of arrays with latitude and longtitude
 *   pairs in degrees. e.g. [[latitude1, longtitude1], [latitude2
 *   [longtitude2] ...]
 *
 * @return array with the center latitude longtitude pairs in 
 *   degrees.
 */
function getLatLngCenter(latLngInDegr) {
    var LATIDX = 0;
    var LNGIDX = 1;
    var sumX = 0;
    var sumY = 0;
    var sumZ = 0;

    for (var i=0; i<latLngInDegr.length; i++) {
        var lat = degr2rad(latLngInDegr[i][LATIDX]);
        var lng = degr2rad(latLngInDegr[i][LNGIDX]);
        // sum of cartesian coordinates
        sumX += Math.cos(lat) * Math.cos(lng);
        sumY += Math.cos(lat) * Math.sin(lng);
        sumZ += Math.sin(lat);
    }

    var avgX = sumX / latLngInDegr.length;
    var avgY = sumY / latLngInDegr.length;
    var avgZ = sumZ / latLngInDegr.length;

    // convert average x, y, z coordinate to latitude and longtitude
    var lng = Math.atan2(avgY, avgX);
    var hyp = Math.sqrt(avgX * avgX + avgY * avgY);
    var lat = Math.atan2(avgZ, hyp);

    return ([rad2degr(lat), rad2degr(lng)]);
}


1
আমি জানি পোস্টটি পুরানো, তবে আপনি কি দয়া করে কোনও রেফারেন্স পোস্ট করতে পারেন বা পোস্ট করা অ্যালগরিদমের পিছনে ম্যাথের ব্যাখ্যা দিয়ে কিছু? ধন্যবাদ!
টোনিক্স

নিখুঁতভাবে কাজ করেছেন! ধন্যবাদ
Andrewoodleyjr 24'18

আমি স্ক্রিপ্টটি গুগল অ্যাপস স্ক্রিপ্ট দিয়ে পরীক্ষা করেছি তবে ফলাফলটি কোনও ট্র্যাকের সঠিক কেন্দ্র পয়েন্ট নয়। এটি কাছাকাছি কোথাও তবে সরাসরি ট্র্যাকের উপরে নয়। ট্র্যাকের সঠিক মিডলপয়েন্ট পাওয়ার আরও ভাল সূত্র আছে কি?
ডার্ক

12

আসল ফাংশনের জাভাস্ক্রিপ্ট সংস্করণ

/**
 * Get a center latitude,longitude from an array of like geopoints
 *
 * @param array data 2 dimensional array of latitudes and longitudes
 * For Example:
 * $data = array
 * (
 *   0 = > array(45.849382, 76.322333),
 *   1 = > array(45.843543, 75.324143),
 *   2 = > array(45.765744, 76.543223),
 *   3 = > array(45.784234, 74.542335)
 * );
*/
function GetCenterFromDegrees(data)
{       
    if (!(data.length > 0)){
        return false;
    } 

    var num_coords = data.length;

    var X = 0.0;
    var Y = 0.0;
    var Z = 0.0;

    for(i = 0; i < data.length; i++){
        var lat = data[i][0] * Math.PI / 180;
        var lon = data[i][1] * Math.PI / 180;

        var a = Math.cos(lat) * Math.cos(lon);
        var b = Math.cos(lat) * Math.sin(lon);
        var c = Math.sin(lat);

        X += a;
        Y += b;
        Z += c;
    }

    X /= num_coords;
    Y /= num_coords;
    Z /= num_coords;

    var lon = Math.atan2(Y, X);
    var hyp = Math.sqrt(X * X + Y * Y);
    var lat = Math.atan2(Z, hyp);

    var newX = (lat * 180 / Math.PI);
    var newY = (lon * 180 / Math.PI);

    return new Array(newX, newY);
}

12

সম্ভবত এক বা দুই মিনিট কাউকে বাঁচানোর স্বার্থে, এখানে দ্রবণটি পাইথনের পরিবর্তে অবজেক্টিভ সি তে ব্যবহৃত হয়েছিল। এই সংস্করণটি এনএসভ্যালুগুলির একটি এনএসআর্রে নেয় যাতে এমকেম্যাপকর্ডিনেটস রয়েছে, যা আমার বাস্তবায়নের জন্য বলা হয়েছিল:

#import <MapKit/MKGeometry.h>
+ (CLLocationCoordinate2D)centerCoordinateForCoordinates:(NSArray *)coordinateArray {
    double x = 0;
    double y = 0;
    double z = 0;

    for(NSValue *coordinateValue in coordinateArray) {
        CLLocationCoordinate2D coordinate = [coordinateValue MKCoordinateValue];

        double lat = GLKMathDegreesToRadians(coordinate.latitude);
        double lon = GLKMathDegreesToRadians(coordinate.longitude);
        x += cos(lat) * cos(lon);
        y += cos(lat) * sin(lon);
        z += sin(lat);
    }

    x = x / (double)coordinateArray.count;
    y = y / (double)coordinateArray.count;
    z = z / (double)coordinateArray.count;

    double resultLon = atan2(y, x);
    double resultHyp = sqrt(x * x + y * y);
    double resultLat = atan2(z, resultHyp);

    CLLocationCoordinate2D result = CLLocationCoordinate2DMake(GLKMathRadiansToDegrees(resultLat), GLKMathRadiansToDegrees(resultLon));
    return result;
}

2
সেখানে আউট কেউ জন্য কি তার মূল্য, তার বদলে রেডিয়ানে, আমদানি ডিগ্রী জন্য আপনার নিজের ম্যাক্রো ব্যবহার <GLKit/GLKMath.h>এবং ব্যবহার GLKMathDegreesToRadiansএবংGLKMathRadiansToDegrees
pnizzle

8

খুব সুন্দর সমাধান, আমার সুইফট প্রকল্পের জন্য আমার যা প্রয়োজন ছিল, তাই এখানে একটি সুইফট পোর্ট। ধন্যবাদ এবং এখানে একটি খেলার মাঠ প্রকল্প: https://github.com/ppoh71/playgouts/tree/master/centerLocationPoint.playground

/*
* calculate the center point of multiple latitude longitude coordinate-pairs
*/

import CoreLocation
import GLKit

var LocationPoints = [CLLocationCoordinate2D]()

//add some points to Location ne, nw, sw, se , it's a rectangle basicaly
LocationPoints.append(CLLocationCoordinate2D(latitude: 37.627512369999998, longitude: -122.38780611999999))
LocationPoints.append(CLLocationCoordinate2D(latitude: 37.627512369999998, longitude:  -122.43105867))
LocationPoints.append(CLLocationCoordinate2D(latitude: 37.56502528, longitude: -122.43105867))
LocationPoints.append(CLLocationCoordinate2D(latitude: 37.56502528, longitude: -122.38780611999999))

// center func
func getCenterCoord(LocationPoints: [CLLocationCoordinate2D]) -> CLLocationCoordinate2D{

    var x:Float = 0.0;
    var y:Float = 0.0;
    var z:Float = 0.0;

    for points in LocationPoints {

     let lat = GLKMathDegreesToRadians(Float(points.latitude));
     let long = GLKMathDegreesToRadians(Float(points.longitude));

        x += cos(lat) * cos(long);
        y += cos(lat) * sin(long);
        z += sin(lat);
    }

    x = x / Float(LocationPoints.count);
    y = y / Float(LocationPoints.count);
    z = z / Float(LocationPoints.count);

    let resultLong = atan2(y, x);
    let resultHyp = sqrt(x * x + y * y);
    let resultLat = atan2(z, resultHyp);



    let result = CLLocationCoordinate2D(latitude: CLLocationDegrees(GLKMathRadiansToDegrees(Float(resultLat))), longitude: CLLocationDegrees(GLKMathRadiansToDegrees(Float(resultLong))));

    return result;

}

//get the centerpoint
var centerPoint = getCenterCoord(LocationPoints)
print("Latitude: \(centerPoint.latitude) / Longitude: \(centerPoint.longitude)")

4

আপনি যদি পয়েন্টগুলির একটি খুব সরল 'কেন্দ্র' অর্জন করতে আগ্রহী হন (উদাহরণস্বরূপ, কেবল আপনার জিপাস বহুভুজের কেন্দ্রস্থলে একটি মানচিত্রকে কেন্দ্র করে), তবে এখানে একটি প্রাথমিক পদ্ধতির বিষয়টি আমার পক্ষে কাজ করেছে।

public function center() {
    $minlat = false;
    $minlng = false;
    $maxlat = false;
    $maxlng = false;
    $data_array = json_decode($this->data, true);
    foreach ($data_array as $data_element) {
        $data_coords = explode(',',$data_element);
        if (isset($data_coords[1])) {
            if ($minlat === false) { $minlat = $data_coords[0]; } else { $minlat = ($data_coords[0] < $minlat) ? $data_coords[0] : $minlat; }
            if ($maxlat === false) { $maxlat = $data_coords[0]; } else { $maxlat = ($data_coords[0] > $maxlat) ? $data_coords[0] : $maxlat; }
            if ($minlng === false) { $minlng = $data_coords[1]; } else { $minlng = ($data_coords[1] < $minlng) ? $data_coords[1] : $minlng; }
            if ($maxlng === false) { $maxlng = $data_coords[1]; } else { $maxlng = ($data_coords[1] > $maxlng) ? $data_coords[1] : $maxlng; }
        }
    }
    $lat = $maxlat - (($maxlat - $minlat) / 2);
    $lng = $maxlng - (($maxlng - $minlng) / 2);
    return $lat.','.$lng;
}

এটি বহুভুজের কেন্দ্রে মধ্যবর্তী ল্যাট / এলএনজি সমন্বয় ফিরিয়ে দেয়।


4

জ্যাঙ্গোতে এটি তুচ্ছ (এবং আসলে কাজ করে, আমার বেশ কয়েকটি সমাধান সঠিকভাবে অক্ষাংশের জন্য নেতিবাচক প্রত্যাবর্তন না করে) নিয়ে সমস্যা হয়েছিল।

উদাহরণস্বরূপ, ধরা যাক আপনি জ্যাঙ্গো-জিওপোস্টকোড ব্যবহার করছেন (যার মধ্যে আমি লেখক)।

from django.contrib.gis.geos import MultiPoint
from django.contrib.gis.db.models.functions import Distance
from django_geopostcodes.models import Locality

qs = Locality.objects.anything_icontains('New York')
points = [locality.point for locality in qs]
multipoint = MultiPoint(*points)
point = multipoint.centroid

pointএটি একটি জ্যাঙ্গো Pointউদাহরণ যা তখন কেন্দ্রের পয়েন্টের 10 কিলোমিটারের মধ্যে থাকা সমস্ত বস্তু পুনরুদ্ধার করার মতো জিনিসগুলি ব্যবহার করতে ব্যবহার করা যেতে পারে;

Locality.objects.filter(point__distance_lte=(point, D(km=10)))\
    .annotate(distance=Distance('point', point))\
    .order_by('distance')

এটি কাঁচা পাইথনে পরিবর্তন করা তুচ্ছ;

from django.contrib.gis.geos import Point, MultiPoint

points = [
    Point((145.137075, -37.639981)),
    Point((144.137075, -39.639981)),
]
multipoint = MultiPoint(*points)
point = multipoint.centroid

হুডের নিচে জাজোঙ্গো জিওওএস ব্যবহার করছে - https://docs.djangoproject.com/en/1.10/ref/contrib/gis/geos/ এ আরও বিশদ


3

জাভা ভার্সন কারও যদি এটির প্রয়োজন হয়। ধ্রুবকগুলি এটিকে দুবার গণনা না করার জন্য স্থিতিশীল সংজ্ঞা দিয়েছিল।

/**************************************************************************************************************
 *   Center of geometry defined by coordinates
 **************************************************************************************************************/
private static double pi = Math.PI / 180;
private static double xpi = 180 / Math.PI;

public static Coordinate center(Coordinate... arr) {
    if (arr.length == 1) {
        return arr[0];
    }
    double x = 0, y = 0, z = 0;

    for (Coordinate c : arr) {
        double latitude = c.lat() * pi, longitude = c.lon() * pi;
        double cl = Math.cos(latitude);//save it as we need it twice
        x += cl * Math.cos(longitude);
        y += cl * Math.sin(longitude);
        z += Math.sin(latitude);
    }

    int total = arr.length;

    x = x / total;
    y = y / total;
    z = z / total;

    double centralLongitude = Math.atan2(y, x);
    double centralSquareRoot = Math.sqrt(x * x + y * y);
    double centralLatitude = Math.atan2(z, centralSquareRoot);

    return new Coordinate(centralLatitude * xpi, centralLongitude * xpi);
}

3

গুগল ম্যাপস এপিআই ব্যবহার করে @ ইয়োডাচিসের সি # উত্তরের উপর ভিত্তি করে এখানে অ্যান্ড্রয়েড সংস্করণ রয়েছে:

public static LatLng GetCentralGeoCoordinate(List<LatLng> geoCoordinates) {        
    if (geoCoordinates.size() == 1)
    {
        return geoCoordinates.get(0);
    }

    double x = 0;
    double y = 0;
    double z = 0;

    for(LatLng geoCoordinate : geoCoordinates)
    {
        double  latitude = geoCoordinate.latitude * Math.PI / 180;
        double longitude = geoCoordinate.longitude * Math.PI / 180;

        x += Math.cos(latitude) * Math.cos(longitude);
        y += Math.cos(latitude) * Math.sin(longitude);
        z += Math.sin(latitude);
    }

    int total = geoCoordinates.size();

    x = x / total;
    y = y / total;
    z = z / total;

    double centralLongitude = Math.atan2(y, x);
    double centralSquareRoot = Math.sqrt(x * x + y * y);
    double centralLatitude = Math.atan2(z, centralSquareRoot);

    return new LatLng(centralLatitude * 180 / Math.PI, centralLongitude * 180 / Math.PI);

}

অ্যাপ্লিকেশন build.gradle এ যোগ করুন:

implementation 'com.google.android.gms:play-services-maps:17.0.0'

1

এটি ভারী গড় সমস্যা হিসাবে একই যেখানে সমস্ত ওজন একই এবং দুটি মাত্রা রয়েছে।

আপনার কেন্দ্র অক্ষাংশের জন্য সমস্ত অক্ষাংশের গড় এবং কেন্দ্র দ্রাঘিমাংশের জন্য সমস্ত দ্রাঘিমাংশের গড় সন্ধান করুন।

ক্যাভেট এমপোটার: এটি একটি কাছাকাছি দূরত্বের সান্নিধ্য এবং পৃথিবীর বক্রতার কারণে গড় থেকে বিচ্যুতি কয়েক মাইলেরও বেশি হয়ে গেলে ত্রুটিটি অনিশ্চিত হয়ে উঠবে। মনে রাখবেন যে অক্ষাংশ এবং দ্রাঘিমাংশ ডিগ্রি (সত্যই গ্রিড নয়)।


1
[-179,0], [+ 179,0] গড়ে গড়ে [0,0], যা সঠিক ফলাফল থেকে কিছুটা দূরে;)
পিসকভোর

1

আপনি যদি ইলিপসয়েড ব্যবহৃত হচ্ছে তা বিবেচনায় নিতে চান তবে সূত্রগুলি এখানে পেতে পারেন http://www.ordnancesurvey.co.uk/oswebsite/gps/docs/A_Guide_to_Coordinate_Systems_in_Great_Britain.pdf

অ্যাঙ্কেক্স বি দেখুন

দস্তাবেজটিতে প্রচুর অন্যান্য দরকারী জিনিস রয়েছে

বি


এখানে আপডেট হওয়া লিঙ্কটি রয়েছে: অর্ডেনসেন্সরভে.ও.ইউ
ডকস / সাপোর্ট /…

1

পিএইচপি-তে অবজেক্ট। স্থানাঙ্ক জোড়া, অ্যারেটিস সেন্টার দেওয়া হয়।

/**
 * Calculate center of given coordinates
 * @param  array    $coordinates    Each array of coordinate pairs
 * @return array                    Center of coordinates
 */
function getCoordsCenter($coordinates) {    
    $lats = $lons = array();
    foreach ($coordinates as $key => $value) {
        array_push($lats, $value[0]);
        array_push($lons, $value[1]);
    }
    $minlat = min($lats);
    $maxlat = max($lats);
    $minlon = min($lons);
    $maxlon = max($lons);
    $lat = $maxlat - (($maxlat - $minlat) / 2);
    $lng = $maxlon - (($maxlon - $minlon) / 2);
    return array("lat" => $lat, "lon" => $lng);
}

# 4 থেকে ধারণা নেওয়া হয়েছে


1
এটি 180 তম মেরিডিয়ান অতিক্রমকারী স্থানাঙ্কগুলির জন্য কাজ করবে না। উদাহরণস্বরূপ, দুটি দ্রাঘিমাংশ পয়েন্ট, -175 এবং 175 আপনার অ্যালগরিদমে 0 এর একটি কেন্দ্র ফিরে আসবে, যার মাধ্যমে আসল কেন্দ্রটি -180 বা 180 হবে
উইঞ্চ

1

সেন্টার পয়েন্ট সন্ধানের জন্য অজগর সংস্করণটি এখানে। অক্ষাংশ এবং দ্রাঘিমাংশের তালিকাগুলি হল ল্যাট 1 এবং লেন 1। এটি সেন্টার পয়েন্টের অক্ষাংশ এবং দ্রাঘিমাংশকে পুনরুদ্ধার করবে।

def GetCenterFromDegrees(lat1,lon1):    
    if (len(lat1) <= 0):
    return false;

num_coords = len(lat1)

X = 0.0
Y = 0.0
Z = 0.0

for i in range (len(lat1)):
    lat = lat1[i] * np.pi / 180
    lon = lon1[i] * np.pi / 180

    a = np.cos(lat) * np.cos(lon)
    b = np.cos(lat) * np.sin(lon)
    c = np.sin(lat);

    X += a
    Y += b
    Z += c


X /= num_coords
Y /= num_coords
Z /= num_coords

lon = np.arctan2(Y, X)
hyp = np.sqrt(X * X + Y * Y)
lat = np.arctan2(Z, hyp)

newX = (lat * 180 / np.pi)
newY = (lon * 180 / np.pi)
return newX, newY

1

একাধিক অক্ষাংশ, দ্রাঘিমাংশের কেন্দ্র বিন্দুটি সন্ধানের জন্য ঝাপটায় ডার্ট বাস্তবায়ন ।

গণিত প্যাকেজ আমদানি করুন

import 'dart:math' as math;

অক্ষাংশ এবং দ্রাঘিমাংশ তালিকা

List<LatLng> latLongList = [LatLng(12.9824, 80.0603),LatLng(13.0569,80.2425,)];

void getCenterLatLong(List<LatLng> latLongList) {
    double pi = math.pi / 180;
    double xpi = 180 / math.pi;
    double x = 0, y = 0, z = 0;

    if(latLongList.length==1)
    {
        return latLongList[0];
    }
    for (int i = 0; i < latLongList.length; i++) {
      double latitude = latLongList[i].latitude * pi;
      double longitude = latLongList[i].longitude * pi;
      double c1 = math.cos(latitude);
      x = x + c1 * math.cos(longitude);
      y = y + c1 * math.sin(longitude);
      z = z + math.sin(latitude);
    }

    int total = loadList.length;
    x = x / total;
    y = y / total;
    z = z / total;

    double centralLongitude = math.atan2(y, x);
    double centralSquareRoot = math.sqrt(x * x + y * y);
    double centralLatitude = math.atan2(z, centralSquareRoot);

    return LatLng(centralLatitude*xpi,centralLongitude*xpi);
}

0

আপনি যদি ইমেজটিতে সমস্ত পয়েন্ট দৃশ্যমান হতে চান তবে আপনি অক্ষাংশ এবং দ্রাঘিমাংশে চূড়ান্ত চাইবেন এবং নিশ্চিত করুন যে আপনার দৃষ্টিভঙ্গিতে যা কিছু সীমানা চান তার সাথে সেই মানগুলি অন্তর্ভুক্ত রয়েছে।

(অ্যালনিটকের জবাব থেকে, আপনি কীভাবে এক্সট্রিমার হিসাব করেন তা কিছুটা সমস্যাযুক্ত হতে পারে, তবে যদি তারা দ্রাঘিমাংশের চারপাশে মোড়ানো উভয় পাশের কয়েক ডিগ্রি হয় তবে আপনি শটটি কল করে ডানদিকের সীমাটি গ্রহণ করবেন।)

আপনি যদি এই পয়েন্টগুলি যে কোনও মানচিত্রকে বিকৃত করতে না চান তবে সীমাবদ্ধ বাক্সের দিক অনুপাতটি সামঞ্জস্য করুন যাতে আপনি ভিউতে বরাদ্দকৃত পিক্সেলগুলির সাথে মানিয়ে যায় তবে তারপরেও এক্সট্রিমাকে অন্তর্ভুক্ত করে।

কিছু স্বেচ্ছাচারী জুমিং স্তরে কেন্দ্রবিন্দু রাখতে, বাউন্ডিং বাক্সের কেন্দ্রটি গণনা করুন যা উপরের মত পয়েন্টগুলি "ঠিক ফিট করে", এবং সেই বিন্দুটিকে কেন্দ্রবিন্দু হিসাবে রাখুন।


0

আমি নীচের মতো জাভাস্ক্রিপ্টে এই কাজটি করেছি

function GetCenterFromDegrees(data){
    // var data = [{lat:22.281610498720003,lng:70.77577162868579},{lat:22.28065743343672,lng:70.77624369747241},{lat:22.280860953131217,lng:70.77672113067706},{lat:22.281863655593973,lng:70.7762061465462}];
    var num_coords = data.length;
    var X = 0.0;
    var Y = 0.0;
    var Z = 0.0;

    for(i=0; i<num_coords; i++){
        var lat = data[i].lat * Math.PI / 180;
        var lon = data[i].lng * Math.PI / 180;
        var a = Math.cos(lat) * Math.cos(lon);
        var b = Math.cos(lat) * Math.sin(lon);
        var c = Math.sin(lat);

        X += a;
        Y += b;
        Z += c;
    }

    X /= num_coords;
    Y /= num_coords;
    Z /= num_coords;

    lon = Math.atan2(Y, X);
    var hyp = Math.sqrt(X * X + Y * Y);
    lat = Math.atan2(Z, hyp);

    var finalLat = lat * 180 / Math.PI;
    var finalLng =  lon * 180 / Math.PI; 

    var finalArray = Array();
    finalArray.push(finalLat);
    finalArray.push(finalLng);
    return finalArray;
}

0

এই থ্রেডের একটি প্রশংসা হিসাবে, এখানে রুবি বাস্তবায়নের সাথে আমার সামান্য অবদান, আশা করি যে আমি কাউকে তাদের মূল্যবান সময় থেকে কয়েক মিনিট বাঁচিয়ে দেব:

def self.find_center(locations)

 number_of_locations = locations.length

 return locations.first if number_of_locations == 1

 x = y = z = 0.0
 locations.each do |station|
   latitude = station.latitude * Math::PI / 180
   longitude = station.longitude * Math::PI / 180

   x += Math.cos(latitude) * Math.cos(longitude)
   y += Math.cos(latitude) * Math.sin(longitude)
   z += Math.sin(latitude)
 end

 x = x/number_of_locations
 y = y/number_of_locations
 z = z/number_of_locations

 central_longitude =  Math.atan2(y, x)
 central_square_root = Math.sqrt(x * x + y * y)
 central_latitude = Math.atan2(z, central_square_root)

 [latitude: central_latitude * 180 / Math::PI, 
 longitude: central_longitude * 180 / Math::PI]
end

0

আমি www.geomidPoint.com থেকে পেয়েছি এমন একটি সূত্র ব্যবহার করেছি এবং নিম্নলিখিত সি ++ বাস্তবায়ন লিখেছি। arrayএবং geocoordsআমার নিজের শ্রেণীর যার কার্যকারিতা স্বশাসিত থাকার অধিকার রয়েছে।

/*
 * midpoints calculated using formula from www.geomidpoint.com
 */
   geocoords geocoords::calcmidpoint( array<geocoords>& points )
   {
      if( points.empty() ) return geocoords();

      float cart_x = 0,
            cart_y = 0,
            cart_z = 0;

      for( auto& point : points )
      {
         cart_x += cos( point.lat.rad() ) * cos( point.lon.rad() );
         cart_y += cos( point.lat.rad() ) * sin( point.lon.rad() );
         cart_z += sin( point.lat.rad() );
      }

      cart_x /= points.numelems();
      cart_y /= points.numelems();
      cart_z /= points.numelems();

      geocoords mean;

      mean.lat.rad( atan2( cart_z, sqrt( pow( cart_x, 2 ) + pow( cart_y, 2 ))));
      mean.lon.rad( atan2( cart_y, cart_x ));

      return mean;
   }

0

ডার্ট / ফ্লুর্টার একাধিক অক্ষাংশ / দ্রাঘিমাংশ স্থানাঙ্ক জোড়াের কেন্দ্র বিন্দু গণনা করুন

Map<String, double> getLatLngCenter(List<List<double>> coords) {
    const LATIDX = 0;
    const LNGIDX = 1;
    double sumX = 0;
    double sumY = 0;
    double sumZ = 0;

    for (var i = 0; i < coords.length; i++) {
      var lat = VectorMath.radians(coords[i][LATIDX]);
      var lng = VectorMath.radians(coords[i][LNGIDX]);
      // sum of cartesian coordinates
      sumX += Math.cos(lat) * Math.cos(lng);
      sumY += Math.cos(lat) * Math.sin(lng);
      sumZ += Math.sin(lat);
    }

    var avgX = sumX / coords.length;
    var avgY = sumY / coords.length;
    var avgZ = sumZ / coords.length;

    // convert average x, y, z coordinate to latitude and longtitude
    var lng = Math.atan2(avgY, avgX);
    var hyp = Math.sqrt(avgX * avgX + avgY * avgY);
    var lat = Math.atan2(avgZ, hyp);

    return {
      "latitude": VectorMath.degrees(lat),
      "longitude": VectorMath.degrees(lng)
    };
  }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.