Merkez noktadan kare x mil koordinatlarını mı hesaplıyorsunuz?


11

Meydanın tüm taraflarının merkezden x mil olacağı merkezi bir noktanın etrafında balta mil karesi (veya daire) oluşturmaya çalışıyorum. 4 köşe koordinatına ihtiyacım var.

Kafamı döndürmeye çalışan beynimi karıştırıyor mu? Haversin formülünü kullanarak iki nokta arasındaki mesafeyi çalışabilirim ama matematik ciddi bir şekilde güçlü noktam değil ve günahı, çünkü vs'yi anlamıyorum.

Enlem / Boylam X milini noktadan hesaplamakla karşılaştım ? ama anlamıyorum!

Bunu elma ve armut açısından nasıl açıklayacağımı açıklayacak kadar nazik olacak mı?

Tam olarak ne yapmaya çalıştığımı açıklamak için;

Kullanıcıların belirli bir alandaki binaları arayabileceği bir web sitem var. Onlar bir kasaba veya yer (ki lat uzun bilecek) girecek ve belirli bir yarıçap içinde söylemek demek 10 mil yer.

Min / max lat ve 10 mil yarıçapı uzun bulmak gerekir, bu yüzden benzer bir nerede yan tümcesi kullanarak veritabanımı sorgulayabilirsiniz:

Where buildingLat <= maxLat 
  and buildingLat <= minLat 
  and buildingLong >= minLong 
   or buildingLong >= maxLong

Bir çeşit formüle ihtiyacım var!

Koordinatlarım ondalık derecelerde

Yanıtlar:


10

Bu amaçla basit yaklaşımlar yeterince iyidir. Kuzey veya güney, bir derece yaklaşık 69 mil, doğu veya batı, sadece 69 * cos (enlem) mil. Enlemler on mil açıklıkta fazla değişmediği için, "kare" nin enleminin kosinüsünü güvenle kullanabilirsiniz. Bu nedenle, merkezi konumdan (f, l) r mil uzaklıktaki kare köşeler için istenen koordinatlar , lat-lon olarak verilir.

df = r/69        // North-south distance in degrees
dl = df / cos(f) // East-west distance in degrees
{(f-df,l-dl), (f+df,l-dl), (f+df,l+dl), (f-df,l+dl)} // List of vertices

Örneğin, r = 10 mil olduğunu ve merkezi konumun enlem 50 derece kuzey, boylam 1 derece batı olduğunu, böylece (f, l) = (50, -1) derece olduğunu varsayalım. Sonra

df = 10/69 = 0.145
dl = 0.145 / cos(50 degrees) = 0.145 / 0.6428 = 0.225
f - df = 50 - 0.145 = 49.855 (southernmost latitude)
f + df = 50 + 0.145 = 50.145 (northernmost latitude)
l - dl = -1 - 0.225 = -1.225 (western longitude)
l + dl = -1 + 0.225 = -0.775 (eastern longitude)

ve koordinatları güneybatı köşesinden başlayarak meydanın etrafında saat yönünde yürürken (49.855, -1.225), (50.145, -1.225), (50.145, -0.775) ve (49.855, -0.775) şeklindedir.

Bu yaklaşımı kutupların yakınında veya bir taraftaki birkaç dereceden daha büyük kareler için kullanmayın. Ayrıca, CBS'nin sınırlamalarına bağlı olarak, genellikle + -180 derecede alınan, boylamda küresel kesim çevresinde biraz özen gösterilmesi gerekebilir.


4

Merkezin X koordinatını alın ve bundan x mil çıkarın, bu karenizin sol tarafıdır. Sonra merkezin Y koordinatını alın ve X milini buradan çıkarın, bu karenizin alt kısmıdır. Bu adımları tekrarlayın, ancak sağ ve üst kenarları elde etmek için çıkartmak yerine ekleyin. Artık karenizin dört köşesini inşa edebilirsiniz.

Yukarıdakilerin, merkez noktanızın mil cinsinden olduğunu varsayalım. İlk önce değilse yeniden projekte edin. Diğer bilge tüm bahisler kapalı ve kare kare olmayacak.


Örnek sayfaya mı atıfta bulunuyorsunuz? Bir koordinattan milleri nasıl çıkarabilirim ve dünyanın eğriliğini hesaba katmam gerekmiyor mu?
Bex

Hayır, o kadar basit ki, işe yaramış bir örneğe ihtiyaç duyulmuyor. Belki de hangi yazılımı kullandığınızı belirtmeniz gerekir? Dediğim gibi benim çözümüm koordinatınızı yerel bir SRS'ye yansıttığınızı varsayar (eğer o zaman bu ilk sorunuz olmalıdır)
Ian Turton

Şimdi gerçekten kafam karıştı! Sorumu tam olarak ne yapmaya çalıştığımı söyleyecek şekilde güncelledim. Min ve max lat ve long'u bulabilmem için bir sınırlayıcı kutu oluşturmaya ihtiyacım var.
Bex

3
proj4js ( proj4js.org ) o zaman yardımcı olmalı
Ian Turton

1
Koordinatlarım şöyle: 51.498485, -0.129089 Bu derece değil mi?
Bex

4

Sonunda cevabım: (c #)

Muhtemelen 4 koordinatlara ihtiyacım yok ama bence oldukça doğrular.

 public static void GetBoundingCoords(double centerLat, double centerLong,  double distance)
    {
     Coordinate top=   MaxLatLongOnBearing(centerLat, centerLong,45,10);
     Coordinate right = MaxLatLongOnBearing(centerLat, centerLong, 135, 10);
     Coordinate bottom = MaxLatLongOnBearing(centerLat, centerLong, 225, 10);
     Coordinate left = MaxLatLongOnBearing(centerLat, centerLong, 315, 10);
    }

    public static Coordinate MaxLatLongOnBearing(double centerLat, double centerLong, double bearing, double distance)
    {

        var lonRads = ToRadian(centerLong);
        var latRads = ToRadian(centerLat);
        var bearingRads = ToRadian(bearing);
        var maxLatRads = Math.Asin(Math.Sin(latRads) * Math.Cos(distance / 6371) + Math.Cos(latRads) * Math.Sin(distance / 6371) * Math.Cos(bearingRads));
        var maxLonRads = lonRads + Math.Atan2((Math.Sin(bearingRads) * Math.Sin(distance / 6371) * Math.Cos(latRads)), (Math.Cos(distance / 6371) - Math.Sin(latRads) * Math.Sin(maxLatRads)));

        var maxLat = RadiansToDegrees(maxLatRads);
        var maxLong = RadiansToDegrees(maxLonRads);

        return new Coordinate(){Latitude=maxLat, Longitude=maxLong};
    }

DÜZENLE

Kare x milimin köşelerini merkez noktadan belirlediğimde fark ettim, karemin kenarları aynı x mil olmayacak. (matematik benim güçlü nokta değil dedi) Yani kareler kenarları x mil istiyorum köşe noktalarını mesafe elde etmek için Pythagoras Teorem çapraz mesafe çalışmak için kullandım. (dik açılı üçgende, hipotenüs üzerindeki kare (diyagonal) diğer iki tarafın karesine eşittir)


bu bir kare olmayacak.
Ian Turton

Rulmanlarımı değiştirdim, elmastı .. şimdi kare
Bex

Düzenleme ile ilgili olarak, Pisagor Teoremi küçük kareler için uygundur, ancak genel olarak küresel dik üçgenler için geçerli değildir. O halde, kodunuzun düzlem geometrisine dayanan bu yaklaşımla birlikte küresel trigonometri kullanması gariptir.
whuber

Mesafem asla 100 milden fazla olmayacak, bu yüzden önemli olduğunu düşünmüyorum. Yanlışlıklar o kadar küçük mesafe ile küçük olacağından.
Bex

1
Bence @whuber'ın yaptığı şey, daha sonra bunları pisagor teoremi ile birleştirdiğiniz göz önüne alındığında, Lat ve Uzun boyunca karmaşık bir mesafe hesaplaması kullanmanın hiçbir faydası olmadığıdır. Bunun yerine, whuber'ın yaptığı gibi veya Ewan Todd'un yaptığı gibi çok daha basit bir hesaplama kullanabilirsiniz . Boylamı mil ve enlemi mil olarak dönüştürmek için basit doğrusal formüller kullanın veya tam tersi. Tek "zor" kısım, boylam formülünün * cos(lat)dereceleri millere dönüştürürken ve milleri dereceye dönüştürürken ayarlanması gerektiğini bilmektir / cos(lat).
ToolmakerSteve

0

Uzamsal olarak farkında bir veritabanı kullanıyorsanız, ilgi alanınızı verilerinizin depolandığı aynı koordinat sistemine dönüştürebilir ve daha sonra bir elma ile elma karşılaştırmasını yapabilirsiniz.

Örneğin:

  1. Kullanıcı bir konum seçerek lat / lon ile sonuçlanır.
  2. Uzamsal veri tabanından bu noktayı alana uygun olarak öngörülen bir koordinat sistemine dönüştürmesini isteyin (fit veya metre birimi vb.).
  3. İlgi alanınızı öngörülen nokta etrafında oluşturun.
  4. Uzamsal veritabanından bu ilgi alanını tekrar lat / lon'a dönüştürmesini isteyin.
  5. Yapmanız gereken her türlü karşılaştırmayı yapın.

0

Ben içinde ne kullanılmış bu sayfada

Başlangıç ​​noktasından uzaklık ve yön verilen hedef noktası

Formül:
lat2 = asin (sin (lat1) * cos (d / R) + cos (lat1) * sin (d / R) * cos (θ))
lon2 = lon1 + atan2 (sin (θ) * sin (d / R) * cos (lat1), cos (d / R) −sin (lat1) * sin (lat2))

θ yataktır (radyan cinsinden, kuzeyden saat yönünde); d / R açısal mesafedir (radyan cinsinden), burada d gidilen mesafedir ve R dünyanın yarıçapıdır

Θ "Sol üst nokta" için -45 derece (radyan cinsinden) ve "sağ alt" için 135 derece kullandım

(Geçenlerde aynı soruyu matematik sitesinde sordum )


Bu çözümün problemi, önce karenin köşegenleri için mesafeyi bulmanızdır. Bunun yerine jeodezikler boyunca merkezden kenarların orta noktalarına gitmek ve daha sonra 90 derece dönerek kare kenarları boyunca hareket etmek daha kolaydır.
whuber

@whuber, Mesafe yeterince küçükse, bunun için basit trigonometri kullanamaz mısınız? (d = karşıt taraf / günah (bitişik taraf). Bunu yapmak için mesafenin tam olması gerekmiyor. Aksi takdirde, tam olarak söylediklerinizi yapmak için bu formülü iki kez uygulayabilirsiniz (önce θ = 0 ile sonra θ = Sol üst kısım için -90)
juan

Bu doğru, Juan. Ancak, Öklid formüllerinin ilk etapta işe yarayacağını düşünen bir yaklaşımla başladığınızda, küresel geometrinin daha karmaşık formüllerini neden kullandığınızı merak etmeye devam edin. Küresel formülleri kullanmakta yanlış bir şey yoktur, ancak gereksiz ve hesaplama açısından verimsizdir.
whuber

@whuber, ikinci durumda yaklaşık değildir (formülü her iki taraf için iki kez uygulamak). Bunları karıştırmanın bir anlamı olmayacağına haklısın. Aslında bunu uyguladım, ama değiştireceğim (oh, ve nedeni matematikte o kadar iyi değilim :))
juan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.