SORU
26 EKİM 2008, Pazar


Nasıl verilen lat/lng için sınırlayıcı kutunun yerini belirlemek için?

Konumu enlem ve boylam tarafından tanımlanan verdim. Şimdi bu noktada örneğin 10 kilometre içinde bir sınırlayıcı kutu hesaplamak istiyorum.

Sınırlayıcı kutu latmin, lngmin ve latmax, lngmax olarak tanımlanmış olmalıdır.

Bu seçkin API kullanmak için bunlara ihtiyacım var: http://www.panoramio.com/api/

Birisi o puanı almak için nasıl bir formül biliyor mu?

Düzenleme:Formül/arıyorum Beyler lat ve lng giriş ve döner gibi latmin & lngmin ve latmax olarak sınırlayıcı bir kutu alır ve latmin işlevi. Mysql, php, c#, javascript iyi değil, aynı zamanda yalancı Tamam olmalıdır.

Düzenleme:Bana 2 puan mesafeyi gösteren bir çözüm arıyorum

CEVAP
26 EKİM 2008, Pazar


Yaklaşık yerel Toprak verilen enlem yarıçapı, WGS84 elipsoid tarafından verilen bir kürenin yüzeyine öneririm. LatMin ve latMax tam hesaplama eliptik fonksiyonlar gerektirir ve doğruluk içinde kayda değer bir artış WGS84 kendisi bir modeli) verilmesinin mümkün olmadığını düşünüyorum.

Benim takip uygulaması (Python ile yazılmış; ben daha test etmedim):

# degrees to radians
def deg2rad(degrees):
    return math.pi*degrees/180.0
# radians to degrees
def rad2deg(radians):
    return 180.0*radians/math.pi

# Semi-axes of WGS-84 geoidal reference
WGS84_a = 6378137.0  # Major semiaxis [m]
WGS84_b = 6356752.3  # Minor semiaxis [m]

# Earth radius at a given latitude, according to the WGS-84 ellipsoid [m]
def WGS84EarthRadius(lat):
    # http://en.wikipedia.org/wiki/Earth_radius
    An = WGS84_a*WGS84_a * math.cos(lat)
    Bn = WGS84_b*WGS84_b * math.sin(lat)
    Ad = WGS84_a * math.cos(lat)
    Bd = WGS84_b * math.sin(lat)
    return math.sqrt( (An*An   Bn*Bn)/(Ad*Ad   Bd*Bd) )

# Bounding box surrounding the point at given coordinates,
# assuming local approximation of Earth surface as a sphere
# of radius given by WGS84
def boundingBox(latitudeInDegrees, longitudeInDegrees, halfSideInKm):
    lat = deg2rad(latitudeInDegrees)
    lon = deg2rad(longitudeInDegrees)
    halfSide = 1000*halfSideInKm

    # Radius of Earth at given latitude
    radius = WGS84EarthRadius(lat)
    # Radius of the parallel at given latitude
    pradius = radius*math.cos(lat)

    latMin = lat - halfSide/radius
    latMax = lat   halfSide/radius
    lonMin = lon - halfSide/pradius
    lonMax = lon   halfSide/pradius

    return (rad2deg(latMin), rad2deg(lonMin), rad2deg(latMax), rad2deg(lonMax))

EDİT: bir derece, ve tersi (test değil) bir derece kesirler için aşağıdaki kodu dönüştürür (derece, asal sayılar, saniye):

def dps2deg(degrees, primes, seconds):
    return degrees   primes/60.0   seconds/3600.0

def deg2dps(degrees):
    intdeg = math.floor(degrees)
    primes = (degrees - intdeg)*60.0
    intpri = math.floor(primes)
    seconds = (primes - intpri)*60.0
    intsec = round(seconds)
    return (int(intdeg), int(intpri), int(intsec))

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 30GB

    30GB

    14 AĞUSTOS 2006
  • MandMEvangelists

    MandMEvangel

    28 Ocak 2008
  • whatever

    whatever

    30 EYLÜL 2005