0

データベースから住所を取得し、google geocode api にリクエストして住所を取得するプログラム。

ここに私が観察した間違いがあります.Googleからの応答をより正確にする方法を誰かが助けてくれます.

  1. 都市を無視し、同じ名前で別の町にある通りの座標を返します。

Vidin, Perushtica 5 Haskovo, Perushtica 5 の座標を返します。

2.たとえば、今日、1000 の住所がある場合があることに気付きます。結果を見ると、Google サイトhttps://maps.google.bg/mapsにアクセスすると、適切にフォーマットされた住所が見つからないことがわかります。 ?hl=en&tab=wlと入力してアドレスを入力すると、完全に検出されます。そして今日、私はこれらのアドレスの 1 つをチェックすることにしました。なぜ時々それが時々見つけられないのか

私のコード

public class TestCon {
        static URL url;
        static String nodeString="";
        static String nody="";
        //static String[] nodeString={};
        static String elementValue = "";
        static String townstr;
        static String streetstr;
        static String urlString;
        static Document geocoderResultDocument;

        static NodeList nodes2;
        static Connection conn2 = null;
        static NodeList nodes; 
        private static final String GEOCODE_REQUEST_PREFIX = "http://maps.google.com/maps/api/geocode/xml";



        public String _xpath = null;
        public Document _xml = null;

        public static void main(String[] args) throws IOException,  URISyntaxException, ParserConfigurationException, SAXException, ClassNotFoundException, SQLException 
        {          Class.forName("org.postgresql.Driver");

        try 
        {
            conn2 = DriverManager.getConnection(
                    "jdbc:postgresql://localhost:5432/plovdivbizloca",
                    "postgres", "tan");
        }

        catch (SQLException ex) 
        {

            ex.printStackTrace();
        }

       for (int j=1;j<1000;j++)

        {
           try 
        {
        conn2 = DriverManager.getConnection(
                    "jdbc:postgresql://localhost:5432/plovdivbizloca",
                    "postgres", "tan");
        }

        catch (SQLException ex) 
        {

            ex.printStackTrace();
        }

        Statement mystmt = null;

        String selectQuery = "SELECT main_office_town, address FROM pl_biz where id="+j;

        try
        {
            mystmt = conn2.createStatement();
            ResultSet mysr = mystmt.executeQuery(selectQuery);

            ResultSetMetaData rsmd = mysr.getMetaData();
            int colCount = rsmd.getColumnCount();

             elementValue="";

            while (mysr.next()) 
            {

                for (int i = 1; i <= colCount; i++) 
                {

                     elementValue += mysr.getString(i);
                    if (i < colCount)
                        elementValue += ",";
                }
                townstr = mysr.getString(1);
                streetstr = mysr.getString(2);
                System.out.println(elementValue);
                System.out.println(townstr);
                System.out.println(streetstr);


            }

         }
        catch (Exception ex) 
        {
        }
        // NEW GEOCODING;

        String inputQuery, resultXml,  xPathString, xi = null;
        inputQuery = elementValue;

        urlString = GEOCODE_REQUEST_PREFIX + "?address=" + URLEncoder.encode(inputQuery, "UTF-8") + "&sensor=false";
        //System.out.println(urlString);

        // Convert the string to a URL so we can parse it
         url = new URL(urlString);

         geocoderResultDocument = makeConnection(url);


        // Process the results
        xPathString = "//GeocodeResponse//location/lat";
        nodes = process(geocoderResultDocument, xPathString);
        xi = "//GeocodeResponse//location/lng";
         nodes2 = process(geocoderResultDocument, xi);

        if ((nodes.getLength()==0)&&(nodes2.getLength()==0))
        {
            System.out.println ("You're here");
            urlString = GEOCODE_REQUEST_PREFIX + "?address=" + URLEncoder.encode(townstr, "UTF-8") + "&sensor=false";
            //System.out.println(urlString);

            // Convert the string to a URL so we can parse it
             url = new URL(urlString);

             geocoderResultDocument = makeConnection(url);
             nodes = process(geocoderResultDocument, xPathString);
             nodes2 = process(geocoderResultDocument, xi);

        }

        if ((nodes.getLength()>1)&&(nodes2.getLength()>1))  
        {
           System.out.println("morethan one");
        }

        // Print results
        //for (int i = 0; i < nodes.getLength(); i++) 
        //{ 
           nodeString = nodes.item(0).getTextContent();
          // nodeString = nodes(i).getTextContent();
            System.out.println("lat_cordinate:"  + nodeString);


        //}

        //for (int i = 0; i < nodes2.getLength(); i++) 
        //{ 
           nody = nodes2.item(0).getTextContent();
          // nodeString = nodes(i).getTextContent();
            System.out.println("longitude:" + nody);

        //} 



      }
    }

    private void TestCon() {
    }

    public static NodeList process(Document xml, String xPathStrings)
            throws IOException {

        NodeList result = null;



        XPathFactory factory = XPathFactory.newInstance();

        XPath xpath = factory.newXPath();

        try {
            result = (NodeList) xpath.evaluate(xPathStrings, xml,
                    XPathConstants.NODESET);
        }
        catch (XPathExpressionException ex) {
            ex.printStackTrace();
        }

        return result;
    }

  public static  Document makeConnection(URL url) throws IOException, SAXException, ParserConfigurationException    
  { 
  HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    Document geocoderResultDocument = null;
    try 
    {
        // open the connection and get results as InputSource.
        conn.connect();
        InputSource geocoderResultInputSource = new InputSource(conn.getInputStream());

        // read result and parse into XML Document
        geocoderResultDocument = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(geocoderResultInputSource);
    } 
    finally 
    {
        conn.disconnect();
    }

    return geocoderResultDocument;
  }

}
4

1 に答える 1

0

#2 については、https://developers.google.com/maps/faq#geocoder_differencesを参照してください。

2 つの異なるサービスは、異なるデータ セットを使用します。

#1 については、ジオコーダが 1 つの町で住所を見つけられなかった可能性があるため、近くの別の町を試しました。

于 2013-04-01T00:20:15.883 に答える