300,000 개의 주소가있는 데이터베이스가 있으며지도에 표시됩니다. 모든 주소를 지오 코딩하면 비용이 너무 많이 듭니다. 그래서 주소를 실시간으로 지오 코딩 할 수 있는지 궁금합니다. 사용자가 주소 (속성 주소)를 선택하면 데이터베이스를 검색 한 다음 주소를 지오 코딩 한 다음 다른 속성들.
코드, 개념 또는 다른 것을 공유 할 수 있다면 정말 좋을 것입니다. 그건 그렇고 내 백엔드는 Joomla가 지원하는 mysql에 있습니다.
300,000 개의 주소가있는 데이터베이스가 있으며지도에 표시됩니다. 모든 주소를 지오 코딩하면 비용이 너무 많이 듭니다. 그래서 주소를 실시간으로 지오 코딩 할 수 있는지 궁금합니다. 사용자가 주소 (속성 주소)를 선택하면 데이터베이스를 검색 한 다음 주소를 지오 코딩 한 다음 다른 속성들.
코드, 개념 또는 다른 것을 공유 할 수 있다면 정말 좋을 것입니다. 그건 그렇고 내 백엔드는 Joomla가 지원하는 mysql에 있습니다.
답변:
Mehul, 저는 SmartyStreets라는 회사와 주소 확인 업계에서 일했습니다. 지오 코딩 서비스는 많지만 필요한 볼륨으로 일괄 처리를 지원하는 서비스는 거의 없습니다. (Google 및 기타 업체는 API를 대량으로 사용하거나 결과를 저장 / 캐싱하는 것을 허용하지 않습니다.)
MySQL 데이터베이스로 이동하여 주소가 포함 된 테이블 내보내기를 수행하는 경우이를 예를 들어 CSV 파일로 저장하십시오. 그런 다음 SmartyList 웹 도구 또는 명령 행 도구를 사용하여이를 처리 할 수 있습니다 . 내가 말했듯이, 몇 가지 서비스가 있지만 주소가 존재하는지 (따라서 지오 코딩의 이유) 확인하는 것이 필요합니다. 주소가 잘못되었거나 불완전한 경우 지오 코딩 결과도 있습니다 . 일부 서비스 만이 작업을 수행합니다.
LiveAddress는 USPS에서 CASS 인증 한 서비스입니다 . 거기에 몇 가지 연구가 있지만 "즉시"/ 빠르고 저렴한 것을 원하므로 다시 LiveAddress를 권장합니다. 주소를 확인할뿐만 아니라 위도 / 경도 정보와 지오 코딩 결과의 정밀도를 요구하는대로 수행합니다. 그것은 모두 웹 기반 이며 즉시 수천만 개의 레코드를 처리합니다 ( 이 질문을 참조하십시오 ).
사용자가 상호 작용하면서 주소를 지오 코딩해야하는 경우 LiveAddress에는 거의 모든 것에 연결할 수 있는 API 버전이 있으며 즉시 일괄 처리를 지원하지만 일회성이 아닌 구독으로 지불됩니다. 지불.
Python을 좋아한다면 GDAL Python 바인딩 또는 Fiona 와 결합 된 GeoPy API를 사용 하여 주소를 포인트 셰이프 파일로 변환하는 이와 같은 매우 기본적인 스크립트를 만들 수 있습니다.
그러면 'addresses_to_geocode'라는 파일의 위치가 지정되어 my_output 폴더에 'my_output.shp'라는 출력 모양 파일이 생성됩니다.
import os
from geopy import geocoders
from osgeo import ogr, osr
def geocode(address):
g = geocoders.GoogleV3()
place, (lat, lng) = g.geocode(address)
print '%s: %.5f, %.5f' % (place, lat, lng)
return place, lat, lng
def parse_file(filepath, output_shape):
# create the shapefile
drv = ogr.GetDriverByName("ESRI Shapefile")
if os.path.exists(output_shape):
drv.DeleteDataSource(output_shape)
ds = drv.CreateDataSource(output_shape)
# spatial reference
sr = osr.SpatialReference()
sr.ImportFromProj4('+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
lyr = ds.CreateLayer(output_shape, sr, ogr.wkbPoint)
# fields
featDefn = lyr.GetLayerDefn()
fld_id = ogr.FieldDefn('id', ogr.OFTInteger)
fld_address = ogr.FieldDefn('ADDRESS', ogr.OFTString)
fld_address.SetWidth(255)
lyr.CreateField(fld_id)
lyr.CreateField(fld_address)
print 'Shapefile %s created...' % ds.name
# read text addresses file
i = 0
f = open(filepath, 'r')
for address in f:
try:
print 'Geocoding %s' % address
place, lat, lng = geocode(address)
point = ogr.Geometry(ogr.wkbPoint)
point.SetPoint(0, lng, lat)
feat = ogr.Feature(lyr.GetLayerDefn())
feat.SetGeometry(point)
feat.SetField('id', i)
feat.SetField('ADDRESS', address)
lyr.CreateFeature(feat)
feat.Destroy()
i = i + 1
except:
print 'Error, skipping address...'
parse_file('addresses_to_geocode', 'my_output')
파일은 예를 들어 다음과 같이 단일 주소에 대해 한 줄만 있어야합니다.
Via Benedetto Croce 112, Rome, Italy
Via Aristide Leonori 46, Rome, Italy
Viale Marconi 197, Rome, Italy
여기에서는 Google API를 사용하고 있지만 GeoPy는 Yahoo !, GeoNames 또는 MapPoint와 같은 다른 API로 전환하는 것이 매우 기본 입니다.
문제를 해결하는 또 다른 옵션은 데이터 집합을 퓨전 테이블로 가져오고 주소 필드를 위치로 설정하는 것입니다. 그런 다음 포인트를 자동으로 지오 코딩합니다. 완료되면 데이터를 KML로 내보낼 수 있습니다.
또는 .. 대신, 50,000 스크립트로 제한되는 야후 지오 코더를 사용하기 위해 PHP 스크립트를 작성할 수 있으므로 조만간 데이터베이스에 모든 지점이 지오 코딩됩니다.
이것이 도움이 되었기를 바랍니다!
지금까지 https://pypi.python.org/pypi/geocoder/1.8.0 빙지도, Google지도, OSM 등 을 사용하는 가장 좋고 가장 쉬운 지오 코더 .
귀하의 질문에 가장 적합한 답변은 아니지만 BatchGeo를 사용해보십시오. 무료 버전을 사용하면 많은 고통을 겪을 수 있지만 여전히 내 작품에는 충분했습니다. 그러나 우리는 프로 버전을 구입했습니다.
KML 파일에서 좌표를 얻는 방법은 나중에 ArcGIS로 가져 오는 것입니다.
Matej, 구글 API는 하루 최대 2.5k를 사용할 수 있기 때문입니다.
Geo 솔루션에 대해서는 배치가 아직 지원되지 않는 것으로 나타났습니다. 지리적 파이썬 코드를 검토 한 결과 새 좌표를 요청할 때마다 연결이 열려있는 것처럼 보이므로 300k는 아마도 영원히 멈출 것입니다 (아마 400 오류).
Poligons와 함께 플레이하면 트릭을 수행해야하지만 1 국가 또는 n 국가 인 경우 '놀이터'영역에 따라 다릅니다.
한 국가의 경우 다각형이 꽤 잘 작동합니다.
n 개 국가의 경우 다른 국가를 추가 할 때마다 수집 시간이 길어 지므로 솔루션이 작동하지 않습니다. 그것을하는 가장 좋은 방법은 게으른로드입니다.
=> 다각형 아이디어, 다른 나라의 모든 것부터 시작하여 데이터를 보유 할 큰 데이터베이스 테이블을 작성하십시오. 결국 필요한 데이터를 보유하게됩니다.
PHP-MySQL로하고 싶다면 다음과 같은 해결책이 있습니다.
<script type="text/javascript" charset="utf-8">
var customIcons = {
restaurant: {
icon: 'http://labs.google.com/ridefinder/images/mm_20_blue.png',
shadow: 'http://labs.google.com/ridefinder/images/mm_20_shadow.png'
},
bar: {
icon: 'http://labs.google.com/ridefinder/images/mm_20_red.png',
shadow: 'http://labs.google.com/ridefinder/images/mm_20_shadow.png'
},
club:
{
icon: 'http://labs.google.com/ridefinder/images/mm_20_yellow.png',
shadow: 'http://labs.google.com/ridefinder/images/mm_20_shadow.png'
},
church:
{
icon: 'http://labs.google.com/ridefinder/images/mm_20_green.png',
shadow: 'http://labs.google.com/ridefinder/images/mm_20_shadow.png'
}
};
function initialize()
{
var mapOptions = {
center: new google.maps.LatLng(37.976178, 23.735881),
zoom: 7,
mapTypeId: google.maps.MapTypeId.roadmap
};
var map = new google.maps.Map(document.getElementById("map-canvas"),
mapOptions);
<?php header("content-type: text/html;charset=utf-8");
$getpoints = "SELECT lat, lng, name, address, type FROM markers";
$getpoints .= $filter;
if(!$result = $con->query($getpoints)){
die('There was an error running the query
[' . $con->error . ']');
}
else
{
while ($row = $result->fetch_assoc())
{
$thematic = "'$row[type]'";
$name = "'$row[name]'";
$map_address = "$row[address]";
$url = "http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=".urlencode($map_address);
$lat_long = get_object_vars(json_decode(file_get_contents($url)));
// pick out what we need (lat,lng)
$lat_long = $lat_long['results'][0]->geometry->location->lat . "," . $lat_long['results'][0]->geometry->location->lng;
echo "var myLatlng1 = new google.maps.LatLng($lat_long);
var icon = customIcons[$thematic] || {};
var marker1 = new google.maps.Marker({
position: myLatlng1,
map: map,
icon: icon.icon,
title: '$map_address'
});";
}
}
?>
}
google.maps.event.addDomListener(window, 'load', initialize);
</script>
이 지오 코딩 API를 사용해보십시오 . 적은 사용량에 대해서는 무료이지만 더 많이 원할 경우 비용을 지불하게됩니다. 그러나 저렴하고 훨씬 쉽게 처리 할 수 있으며 한 달에 수백만 달러를 처리합니다.
데이터를 텍스트 파일 (한 줄에 하나의 레코드)로 저장 한 후 다음 서비스를 사용하여 데이터를 일괄 지오 코딩 할 수 있습니다. http://geocode.xyz/batch (대부분의 유럽 국가에서 작동)
또는 REST / JSON API에 액세스하기위한 고유 코드를 작성할 수 있습니다. http://geocode.xyz/api (무제한 조회는 무료)
맵 포인팅 도구 사용 (맵 포인팅 | 배치 지오 코딩 도구 ( http://www.mappointing.com/ ))이 도구에서 Google 맵 프리 API 키를 사용하여 데이터를 처리 할 수 있습니다. 또한이 도구는 거리 계산 및 장소 검색 도구를 제공합니다.