谷歌地理编码api的问题

时间:2013-03-05 08:48:59

标签: google-geocoding-api

从数据库获取地址并向google geocode api请求获取地址的程序。

这是我观察到的错误,任何人都可以帮助我如何使谷歌的响应更加准确。

  1. 它忽略了这个城市并返回了同名但在不同城镇的拉伸的坐标 例如
  2. Vidin,Perushtica 5它返回了Haskovo,Perushtica 5的坐标

    2.我观察到有时例如今天我有1000个地址,当我看到结果时,我看到谷歌找不到格式良好的地址,当我去google网站https://maps.google.bg/maps?hl=en&tab=wl并输入地址 - 它完美地找到它。 今天我决定检查其中一个地址,这次它就找到了。为什么有时会发现它有时候不是

    我的代码

    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;
      }
    
    }
    

1 个答案:

答案 0 :(得分:0)

对于#2,请参阅https://developers.google.com/maps/faq#geocoder_differences

两种不同的服务使用不同的数据集。

对于#1,可能是地理编码器无法在一个城镇找到地址,所以然后尝试了附近的另一个城镇。