Başlangıç ​​noktası bir yarıçap içinde konumları çalışmak için en iyi yöntem

3 Cevap php

Ben tercihen PHP kullanarak benim son projesi bir özellik oluşturmak amaçlayan ediyorum. Her kullanıcı kayıt olduğunda onlar girişine kendi posta kodu olacak. Sonra umarım Açık Sokak Haritası kullanarak uzun / lat bu dönüştürme edilecektir.

Anyway, I want to be able to find out other users located near the current user. I have seen a lot of people using the Haversine formula, however this would mean that the user queried every other user's details to work out the distance. I could cache this but its soon going to become outdated as new users sign up.

Etkisi ne tür aşağıdaki sorgu sistemimde var çalışıyor olurdu?

sql = "SELECT zipcode, ( 3959 * acos( cos( radians( {$coords['latitude']} ) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians( {$coords['longitude']} ) ) + sin( radians( {$coords['latitude']} ) ) * sin( radians( latitude ) ) ) ) AS distance FROM zipcodes HAVING distance <= {$radius} ORDER BY distance";

Thats somone blogdan çekti.

Ben hala gelişme olduğu gibi kullanıcıların kayıt hızı veya miktarı için herhangi bir rakam yok.

Ben belirli bir yarıçap içinde eşleşen kullanıcıları bulmak için kullanabileceğiniz herhangi bir bildirim veya diğer yöntemleri apriciate olacaktır.

Thanks
Jamie

3 Cevap

Orada CBS ve 4.1 sürümünde mySql için Mekansal Uzantıları, olduğunu görmek here. Anlattıklarına bakılırsa burada var gibi sorunları için kullanıldığını, göreceksiniz:

A GIS (geographic information system) stores and looks up objects which have one or more spatial attributes, such as size and position, and is used to process such objects. A simple example would be a system that stores addresses in a town using geographic coordinates. If this rather static data was then combined with other information, such as the location of a taxi-cab, then this data could be used to find the closest cab to a certain location.

Bu gibi MySQL bazı şeyleri ekler:

  • Spacial tuşları ve POINT türü:

    CREATE TABLE address ( address CHAR(80) NOT NULL, address_loc POINT NOT NULL, PRIMARY KEY(address), SPATIAL KEY(address_loc) );

  • Dönüşüm rutinleri

    Adres VALUES INSERT INTO ('Falanca sokak 12', GeomFromText('POINT(2671 2500)'));

  • CBS hesaplama işlevleri

    SELECT c.cabdriver, ROUND(GLength(LineStringFromWKB(LineString(AsBinary(c.cab_loc), AsBinary(a.address_loc))))) AS distance FROM cab c, address a ORDER BY distance ASC LIMIT 1;

(Örnekler yukarıdaki linkten alınmıştır)

Eğer özel bir daire olması için "belirli bir yarıçap içinde" tanımını gevşetmek için istekli olup olmadığını sorun büyük ölçüde basitleştirilmiş olabilir. Eğer bir "kare" için basitleştirmek varsa, yan tümceleri (uzun lat biri için bir) "arasında" 2 basit ile "yarıçapı" içindeki tüm konumunu bulabilirsiniz. örneğin:

SELECT * FROM location WHERE
  lat BETWEEN (my_lat - radius) AND (my_lat + radius)
  AND long BETWEEN (my_long - radius) AND (my_long + radius);

Tabii ki, bu onlar için gerçek mesafeyi hesaplamak için daha doğru bir yöntem kullanmadan önce yerle bir alt kümesini seçmek için kullanılır olabilir.

Kuşkusuz bu Javascript değil PHP, ama ben hayal ediyorum dönüştürmek için önemsiz olacaktır.

Bu Dünya'nın eğrilik için muhasebe, iki nokta arasındaki mesafeyi hesaplar. Bu uygun bir yol güzergahı kullanılarak olmadığını kodla değiştirmeden önce bir süre geri bir lojistik uygulaması içinde kullanılır.

Bu might kullanmak sizin için olabilir ....

<script type="text/javascript">
function getDistance(lat1,lng1,lat2,lng2)
 {
  p1 = new VELatLong(lat1,lng1);
  p2 = new VELatLong(lat2,lng2);
  miles = true;
  p1.Latitude= latLonToRadians(p1.Latitude);
  p1.Longitude= latLonToRadians(p1.Longitude);
  p2.Latitude= latLonToRadians(p2.Latitude);
  p2.Longitude= latLonToRadians(p2.Longitude);
  var R = 6371; // earth's mean radius in km
  var dLat  = p2.Latitude- p1.Latitude;
  var dLong = p2.Longitude- p1.Longitude;
  var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
  Math.cos(p1.Latitude) * Math.cos(p2.Latitude) * Math.sin(dLong/2) * 
Math.sin(dLong/2);
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
  var disKm = R * c;
  var disMiles = disKm * 0.6214;
  alert (miles ? disMiles : disKm);
 }
 //  convert lat/long in degrees to radians
 function latLonToRadians( point )
 {
  return point * Math.PI / 180;
 }
</script>

Eğer uygun bir yedek bulmak gerekir Oh, ve VELatLong nesneler, Virtual Earth API (http://msdn.microsoft.com/en-us/library/bb412519.aspx) gelen, ancak temelde bir övmek yapı vardır