2015-05-25 7 views
6

मैं Google मानचित्र API का उपयोग कर रहा हूं।कुछ करें जब मैं सर्कल के त्रिज्या के अंदर हूं

जब मैं कुछ विशिष्ट स्थान पर जाता हूं तो मैं क्या चाहता हूं और एक सर्कल है जिसे मैंने मानचित्र पर पहले से खींचा है, फिर यह दूसरी गतिविधि पर जाएगा।

  1. मेरी स्थिति एक = (एक्स, वाई)

  2. सर्किल स्थिति ख = (एक्स, वाई) के दायरे = 10

  3. जब है:

    तो यह की तरह था मैं बी त्रिज्या के अंदर हूँ यह किसी अन्य गतिविधि पर जायेगा या कुछ करेगा।

कोई विचार?

मैं पहले से ही distanceTo() का उपयोग कर रहा हूं, लेकिन अभी भी सफल नहीं हुआ है।

संपादित करें: यहाँ अद्यतन कोड है कि अभी भी मेरे लिए काम नहीं कर रहा है:

public void onLocationChanged(Location location) 
{ 
float [] distance = new float[]; 
Location.distanceBetween(location.getLatitude(),location.getLongitude(),-6.xxxxxxx,106.xxxxxxx,distance); 

if (distance[0] < 50) 
    { 
    Intent i = new Intent(student_activity.this,indoor.class); 
    student_activity.this,startActivity(i); 
    } 
} 

() इस विधि setUpMapIfNeeded onCreate विधि में कहा जाता है:

public void circle() 
{ 
Circle circle = mMap.addCircle (new CircleOptions() 
.center(new LatLng(-6.xxxxxxx,106.xxxxxxx)) 
.radius(50) 
.strokeColor(Color.RED) 
.strokeWidth(1) 
.fillColor(Color.RED) 
} 

उत्तर

4

आप भू-प्रक्रिया का उपयोग कर सकते हैं, लेकिन यदि आप बस यह निर्धारित करने की कोशिश कर रहे हैं कि आपका वर्तमान स्थान एक चक्र के भीतर है या नहीं ई मानचित्र पर खींचा गया, आप इस तकनीक का उपयोग कर सकते हैं।

बस वर्तमान स्थान से सर्कल के केंद्र तक दूरी की तुलना करें, और जांच करें कि दूरी त्रिज्या से कम है या नहीं।

मैंने एक समान प्रश्न here का उत्तर दिया, जहां आप अधिक जानकारी और स्क्रीनशॉट उदाहरण देख सकते हैं।

ध्यान दें कि नीचे दिया गया कोड वंचित onMyLocationChangeListener का उपयोग करता है, लेकिन आप इसे करने के लिए किसी भी प्रकार के स्थान कॉलबैक का उपयोग कर सकते हैं, जिसमें FusedLocationProviderApi शामिल है।

googleMap.setOnMyLocationChangeListener(new GoogleMap.OnMyLocationChangeListener() { 
      @Override 
      public void onMyLocationChange(Location location) { 
       float[] distance = new float[2]; 

       Location.distanceBetween(location.getLatitude(), location.getLongitude(), 
         mCircle.getCenter().latitude, mCircle.getCenter().longitude, distance); 

       if(distance[0] < mCircle.getRadius()){ 
        //current location is within circle 
        //start new activity 
        Intent i = new Intent(ThisActivity.this, OtherActivity.class); 
        ThisActivity.this.startActivity(i); 
       } 

      } 
     }); 

संपादित करें: यहाँ एक पूरी तरह से काम करने और परीक्षण किया वर्ग FusedLocationApi का उपयोग करता है वर्तमान स्थान प्राप्त करने के लिए है:

import android.content.Intent; 
import android.graphics.Color; 
import android.location.Location; 
import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
import android.util.Log; 
import android.widget.Toast; 

import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.location.LocationListener; 
import com.google.android.gms.location.LocationRequest; 
import com.google.android.gms.location.LocationServices; 
import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.Circle; 
import com.google.android.gms.maps.model.CircleOptions; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.LatLngBounds; 
import com.google.android.gms.maps.model.MarkerOptions; 

public class MapsActivity extends ActionBarActivity implements 
     GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener { 

    private GoogleMap mMap; 
    LocationRequest mLocationRequest; 
    GoogleApiClient mGoogleApiClient; 
    Circle mCircle; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_maps); 
     setUpMapIfNeeded(); 

     buildGoogleApiClient(); 
     mGoogleApiClient.connect(); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     setUpMapIfNeeded(); 
    } 

    @Override 
    protected void onPause(){ 
     super.onPause(); 
     if (mGoogleApiClient != null) { 
      LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
     } 
    } 


    protected synchronized void buildGoogleApiClient() { 
     Toast.makeText(this,"buildGoogleApiClient",Toast.LENGTH_SHORT).show(); 
     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 
    } 

    @Override 
    public void onConnected(Bundle bundle) { 
     Toast.makeText(this,"onConnected", Toast.LENGTH_SHORT).show(); 

     mLocationRequest = new LocationRequest(); 
     mLocationRequest.setInterval(10); 
     mLocationRequest.setFastestInterval(10); 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 
     mLocationRequest.setSmallestDisplacement(0.1F); 

     LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
    } 


    private void setUpMapIfNeeded() { 
     // Do a null check to confirm that we have not already instantiated the map. 
     if (mMap == null) { 
      // Try to obtain the map from the SupportMapFragment. 
      mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)) 
        .getMap(); 
      // Check if we were successful in obtaining the map. 
      if (mMap != null) { 
       setUpMap(); 
      } 
     } 
    } 

    private void setUpMap() { 
     mMap.getUiSettings().setMapToolbarEnabled(true); 
     mMap.getUiSettings().setZoomControlsEnabled(true); 
     mMap.setMyLocationEnabled(true); 

     circle(); 

    } 

    public void circle() 
    { 
     double radiusInMeters = 50.0; 
     int strokeColor = 0xffff0000; //red outline 
     int shadeColor = 0x44ff0000; //opaque red fill 

     mCircle = mMap.addCircle (new CircleOptions() 
       .center(new LatLng(37.9614, -122.105)) 
       .radius(radiusInMeters) 
       .fillColor(shadeColor) 
       .strokeColor(strokeColor) 
       .strokeWidth(1)); 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 
     Toast.makeText(this,"onConnectionSuspended",Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     Toast.makeText(this,"onConnectionFailed",Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 

     Log.d("locationtesting", "lat: " + location.getLatitude() + " lon: " + location.getLongitude()); 

     Toast.makeText(this,"Location Changed",Toast.LENGTH_SHORT).show(); 

     float[] distance = new float[2]; 

     Location.distanceBetween(location.getLatitude(), location.getLongitude(), 
       mCircle.getCenter().latitude, mCircle.getCenter().longitude, distance); 

     if(distance[0] < mCircle.getRadius()){ 
      //current location is within circle 
      //start new activity 
      Intent i = new Intent(this, OtherActivity.class); 
      startActivity(i); 
     } 
    } 
} 

लेआउट xml:

<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
    android:layout_height="match_parent" android:id="@+id/map" tools:context=".MapsActivity" 
    android:name="com.google.android.gms.maps.SupportMapFragment" /> 

build.gradle में निर्भरता:

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:22.1.1' 
    compile 'com.google.android.gms:play-services:7.0.0' 
} 

सबसे पहले मैंने यह सुनिश्चित करने के लिए कि मेरा वर्तमान स्थान सर्कल के भीतर था, startActivity() पर कॉल किए बिना परीक्षण किया।आप स्क्रीनशॉट में देख सकते हैं, यह था:

Map Test

फिर, मैं कॉल startActivity() करने के लिए onLocationChanged() कॉलबैक में जोड़ा, और इसे तुरंत एप्लिकेशन लॉन्च करने पर OtherActivity का शुभारंभ किया।

+0

मैंने आपके कोड का प्रयास किया है। लेकिन यह गतिविधि नहीं बदल रहा है। यहां तक ​​कि मैं और अधिक त्रिज्या जोड़ रहा हूँ। –

+0

@LeonardFebrianto आप स्थान कॉलबैक कैसे प्राप्त कर रहे हैं? क्या आप वाकई सर्कल के अंदर होने पर एक स्थान प्राप्त करते हैं? –

+0

क्या आपका मतलब है स्थानान्तरण विधि द्वारा स्थान प्राप्त करें? –

1

यह गूगल के भू-बाड़े एपीआई का वर्णन की तरह लगता है Geofencing tutorial

संबंधित मुद्दे