Широкое и длинное местоположение GPS внутри прямоугольника - PullRequest
0 голосов
/ 24 января 2012

Это моя цель кода: я хочу, чтобы приложение Android запускало соединение с сервером и отправляло широту и долготу только тогда, когда телефон (используемый в автомобиле) находится в зоне дороги (скажем, в зоне 1 км х 30 м).).Он постоянно прослушивает свое местоположение, но начнет отправлять на сервер, как только он входит в область, и будет непрерывно отправлять и будет останавливаться только после того, как выйдет из области.

Хороший ответ, который я получил за это: «создать два местоположения, местоположение NorthWest и местоположение SouthEast, представляющие ваш ящик. В вашем методе onLocationChanged сравните новое местоположение с углами, чтобы (l.lat> se.lat && l.lat nw.lon), где "l" - это новейшее местоположение из обратного вызова, "se" - это юго-восточный угол вашей границы, а "nw" - северо-западный угол вашей границы.он отвечает 4 вышеуказанным условиям, затем вы отправляете на свой сервер "

. Я думаю, что это применимо, когда пара сторон прямоугольной области параллельна широте (экватору), а другая пара сторонпараллельно линиям долготы (меридиан).Что, если стороны прямоугольной области не параллельны линиям широты и долготы.Как я могу достичь своей цели?

Ответы [ 2 ]

0 голосов
/ 25 января 2012

Я читал часть решений на этом веб-сайте возможное решение, которое я выбрал, - это Решение 3 (2D):

Я пытался перевести это в код Java.ниже приведен мой код (еще не проверенный и не отшлифованный - могут быть основные ошибки, а значения долготы и широты ненастоящие)

private class MyLocationListener implements LocationListener {                     
    @Override
    public void onLocationChanged(Location loc) {
        String txt = "Latitude:" + loc.getLatitude() + "/nLongitude:" +  loc.getLongitude();
        Log.i("GeoLocation", "My current location is:\n " + txt);
        tv.setText("My current location is:\n" + txt);
        String msg = loc.getLongitude() + "\n" + loc.getLatitude() + "\n"
           + loc.getTime();

        double lat0 = 0.2;
        double long0 = 0.3;
        double lat1 = 1.2;
        double long1 = 1.3;
        double lat2 = 1.2;
        double long2 = 1.3;
        double lat3 = 1.2;
        double long3 = 1.3;
        double rel1 = (loc.getLongitude()- long0)*(lat1 - lat0)- ((loc.getLatitude()-lat0)*(long1-long0));
        double rel2 = (loc.getLongitude()- long1)*(lat2 - lat1)- ((loc.getLatitude()-lat1)*(long2-long1));
        double rel3 = (loc.getLongitude()- long2)*(lat3 - lat2)- ((loc.getLatitude()-lat2)*(long3-long2));
        double rel4 = (loc.getLongitude()- long3)*(lat0 - lat3)- ((loc.getLatitude()-lat3)*(long0-long3));

        if (rel1 <= 0 && rel2 <= 0 && rel3 <= 0 && rel4 <= 0 )
        {
            try
            {
            connect("IP address", 27960);
            send("CMD_HELLO");
            send(msg);
            send("CMD_QUIT");
            } catch (UnknownHostException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            }
        else
        {
            tv.setText("Current location is outside the road network");

        }
    }

Прокомментируйте, пожалуйста, исправления и предложения

0 голосов
/ 24 января 2012
// Create a pending intent for proximity alert.
PendingIntent broadcastPendingIntent = PendingIntent.getBroadcast(context, ID,
    associatedIntent, PendingIntent.FLAG_ONE_SHOT);
// Add the proximity alert.
mLocationManager.addProximityAlert(Latitude, Longitude, ProximityAlertRadius,
    TimeOut, broadcastPendingIntent);

Добавьте широковещательный приемник, чтобы получить ваше намерение.

...