def sync(self): LIMIT = 0 # 每一種同步動作的次數限制,除錯用 # 注意!! 實驗階段指向測試伺服器 #host = 'api06.dev.openstreetmap.org' host = 'api.openstreetmap.org' user = '******' pwf = '%s/.osmpass' % os.environ['HOME'] # 注意!! 有中文的地方需要使用 unicode 字串型態 chset = { u'comment': u'自動同步 (%s)' % self.source_name, u'created_by': u'小璋流同步機器人 (osmapi/0.6.0)', u'bot': u'yes' } api = OsmApi(api=host, username=user, passwordfile=pwf) api.ChangesetCreate(chset) # 新增/修改/刪除 actions = ['create', 'update', 'delete'] points_map = { 'create': self.points_new, 'update': self.points_changed, 'delete': self.points_disappeared } for act in actions: points = points_map[act] count = 0 failed = 0 total = len(points) for p in points: node = self.toNode(p, api) if node is not None: try: if act == 'create': api.NodeCreate(node) if act == 'update': api.NodeUpdate(node) if act == 'delete': api.NodeDelete(node) except: # TODO: 加入 logger 機制 failed = failed + 1 else: # TODO: 加入 logger 機制 failed = failed + 1 # 計數/次數限制/摘要顯示 count = count + 1 print('\r%s: %d/%d (失敗: %d)' % (act, count, total, failed)), sys.stdout.flush() if count == LIMIT: break print('') return api.ChangesetClose()
user = '******' pwf = '%s/.osmpass' % os.environ['HOME'] # 注意!! 有中文的地方需要使用 unicode 字串型態 chset = { u'comment': u'自動同步 U-bike 租借站', u'created_by': u'小璋流同步機器人 (osmapi/0.6.0)' } node = { u'id': 4299484763, u'lat': 25.10, u'lon': 121.0, u'version': 1, } api = OsmApi(api=host, username=user, passwordfile=pwf) api.ChangesetCreate(chset) n = api.NodeGet(4299484799) n = api.NodeDelete(n) print(n) #n = api.NodeUpdate(node) #n = api.NodeDelete(node) cid = api.ChangesetClose() # 更新結果摘要 print('Changeset 編號: %d' % cid) print('URL: http://api06.dev.openstreetmap.org/changeset/%d' % cid) print('Node 編號: %s' % n['id']) print('URL: http://api06.dev.openstreetmap.org/api/0.6/node/%s' % n['id'])
class TestOsmApiNode(osmapi_tests.TestOsmApi): def test_NodeGet(self): self._conn_mock() result = self.api.NodeGet(123) args, kwargs = self.api._conn.putrequest.call_args self.assertEquals(args[0], 'GET') self.assertEquals(args[1], '/api/0.6/node/123') self.assertEquals( result, { 'id': 123, 'changeset': 15293, 'uid': 605, 'timestamp': datetime.datetime(2012, 4, 18, 11, 14, 26), 'lat': 51.8753146, 'lon': -1.4857118, 'visible': True, 'version': 8, 'user': '******', 'tag': { 'amenity': 'school', 'foo': 'bar', 'name': 'Berolina & Schule' }, }) def test_NodeGet_with_version(self): self._conn_mock() result = self.api.NodeGet(123, NodeVersion=2) args, kwargs = self.api._conn.putrequest.call_args self.assertEquals(args[0], 'GET') self.assertEquals(args[1], '/api/0.6/node/123/2') self.assertEquals( result, { 'id': 123, 'changeset': 4152, 'uid': 605, 'timestamp': datetime.datetime(2011, 4, 18, 11, 14, 26), 'lat': 51.8753146, 'lon': -1.4857118, 'visible': True, 'version': 2, 'user': '******', 'tag': { 'amenity': 'school', }, }) def test_NodeCreate_changesetauto(self): # setup mock self.api = OsmApi(api="api06.dev.openstreetmap.org", changesetauto=True) self._conn_mock(auth=True, filenames=[ 'test_NodeCreate_changesetauto.xml', 'test_ChangesetUpload_create_node.xml', 'test_ChangesetClose.xml', ]) test_node = { 'lat': 47.123, 'lon': 8.555, 'tag': { 'amenity': 'place_of_worship', 'religion': 'pastafarian' } } self.assertIsNone(self.api.NodeCreate(test_node)) def test_NodeCreate(self): self._conn_mock(auth=True) # setup mock self.api.ChangesetCreate = mock.Mock(return_value=1111) self.api._CurrentChangesetId = 1111 test_node = { 'lat': 47.287, 'lon': 8.765, 'tag': { 'amenity': 'place_of_worship', 'religion': 'pastafarian' } } cs = self.api.ChangesetCreate({'comment': 'This is a test dataset'}) self.assertEquals(cs, 1111) result = self.api.NodeCreate(test_node) args, kwargs = self.api._conn.putrequest.call_args self.assertEquals(args[0], 'PUT') self.assertEquals(args[1], '/api/0.6/node/create') self.assertEquals(result['id'], 9876) self.assertEquals(result['lat'], test_node['lat']) self.assertEquals(result['lon'], test_node['lon']) self.assertEquals(result['tag'], test_node['tag']) def test_NodeCreate_wo_changeset(self): test_node = { 'lat': 47.287, 'lon': 8.765, 'tag': { 'amenity': 'place_of_worship', 'religion': 'pastafarian' } } with self.assertRaisesRegexp(Exception, 'need to open a changeset'): self.api.NodeCreate(test_node) def test_NodeCreate_wo_auth(self): self._conn_mock() # setup mock self.api.ChangesetCreate = mock.Mock(return_value=1111) self.api._CurrentChangesetId = 1111 test_node = { 'lat': 47.287, 'lon': 8.765, 'tag': { 'amenity': 'place_of_worship', 'religion': 'pastafarian' } } with self.assertRaisesRegexp(UsernamePasswordMissingError, 'Username/Password missing'): self.api.NodeCreate(test_node) def test_NodeUpdate(self): self._conn_mock(auth=True) # setup mock self.api.ChangesetCreate = mock.Mock(return_value=1111) self.api._CurrentChangesetId = 1111 test_node = { 'id': 7676, 'lat': 47.287, 'lon': 8.765, 'tag': { 'amenity': 'place_of_worship', 'name': 'christian' } } cs = self.api.ChangesetCreate({'comment': 'This is a test dataset'}) self.assertEquals(cs, 1111) result = self.api.NodeUpdate(test_node) args, kwargs = self.api._conn.putrequest.call_args self.assertEquals(args[0], 'PUT') self.assertEquals(args[1], '/api/0.6/node/7676') self.assertEquals(result['id'], 7676) self.assertEquals(result['version'], 3) self.assertEquals(result['lat'], test_node['lat']) self.assertEquals(result['lon'], test_node['lon']) self.assertEquals(result['tag'], test_node['tag']) def test_NodeDelete(self): self._conn_mock(auth=True) # setup mock self.api.ChangesetCreate = mock.Mock(return_value=1111) self.api._CurrentChangesetId = 1111 test_node = {'id': 7676} cs = self.api.ChangesetCreate({'comment': 'This is a test dataset'}) self.assertEquals(cs, 1111) result = self.api.NodeDelete(test_node) args, kwargs = self.api._conn.putrequest.call_args self.assertEquals(args[0], 'DELETE') self.assertEquals(args[1], '/api/0.6/node/7676') self.assertEquals(result['id'], 7676) self.assertEquals(result['version'], 4) def test_NodeHistory(self): self._conn_mock() result = self.api.NodeHistory(123) args, kwargs = self.api._conn.putrequest.call_args self.assertEquals(args[0], 'GET') self.assertEquals(args[1], '/api/0.6/node/123/history') self.assertEquals(len(result), 8) self.assertEquals(result[4]['id'], 123) self.assertEquals(result[4]['version'], 4) self.assertEquals(result[4]['lat'], 51.8753146) self.assertEquals(result[4]['lon'], -1.4857118) self.assertEquals(result[4]['tag'], { 'empty': '', 'foo': 'bar', }) def test_NodeWays(self): self._conn_mock() result = self.api.NodeWays(234) args, kwargs = self.api._conn.putrequest.call_args self.assertEquals(args[0], 'GET') self.assertEquals(args[1], '/api/0.6/node/234/ways') self.assertEquals(len(result), 1) self.assertEquals(result[0]['id'], 60) self.assertEquals(result[0]['changeset'], 61) self.assertEquals(result[0]['tag'], { 'highway': 'path', 'name': 'Dog walking path', }) def test_NodeRelations(self): self._conn_mock() result = self.api.NodeRelations(4295668179) args, kwargs = self.api._conn.putrequest.call_args self.assertEquals(args[0], 'GET') self.assertEquals(args[1], '/api/0.6/node/4295668179/relations') self.assertEquals(len(result), 1) self.assertEquals(result[0]['id'], 4294968148) self.assertEquals(result[0]['changeset'], 23123) self.assertEquals(result[0]['member'][1], { 'role': 'point', 'ref': 4295668179, 'type': 'node', }) self.assertEquals(result[0]['tag'], { 'type': 'fancy', }) def test_NodesGet(self): self._conn_mock() result = self.api.NodesGet([123, 345]) args, kwargs = self.api._conn.putrequest.call_args self.assertEquals(args[0], 'GET') self.assertEquals(args[1], '/api/0.6/nodes?nodes=123,345') self.assertEquals(len(result), 2) self.assertEquals( result[123], { 'id': 123, 'changeset': 15293, 'uid': 605, 'timestamp': datetime.datetime(2012, 4, 18, 11, 14, 26), 'lat': 51.8753146, 'lon': -1.4857118, 'visible': True, 'version': 8, 'user': '******', 'tag': { 'amenity': 'school', 'foo': 'bar', 'name': 'Berolina & Schule' }, }) self.assertEquals( result[345], { 'id': 345, 'changeset': 244, 'timestamp': datetime.datetime(2009, 9, 12, 3, 22, 59), 'uid': 1, 'visible': False, 'version': 2, 'user': '******', 'tag': {}, })
} counter = counter + 1 #print (str(latitude)+""+str(longitude)+""+street+" "+housenumber) if action == "modify": print("Modifying") if node.tagName == "node": if not dryrun: api.NodeUpdate(editnode) else: if not dryrun: api.WayUpdate(editnode) elif action == "delete": print("Deleting") if node.tagName == "node": if not dryrun: api.NodeDelete(editnode) else: if node.tagName == "node": print("Creating") if not dryrun: api.NodeCreate(editnode) print(editnode) atleastone = True if atleastone and not dryrun: cursor.execute( "insert into update_requests (kommunenummer, ferdig, ip, upload, tid) values (\"%s\", 1, \"full_upload\", 1, now())" % (munipnumber, )) cursor.execute( "insert into update_requests (kommunenummer,ip,tid) values ('" + str(munipnumber) + "','full_upload_update_after',addtime(now(),\"0:20:00\"));")
jtags["addr:postcode"] = postcode elif tag.attributes["k"].value == "addr:city": city = tag.attributes["v"].value jtags["addr:city"] = city else: jtags[tag.attributes["k"].value] = tag.attributes["v"].value hasothertags = True if housenumber != "" and not hasothertags and username == "rubund_import": #if action == "modify": deletenode = {"id": osm_id , "version" : osm_version , "lat" : latitude, "lon": longitude , "tag": jtags} #else: # editnode = {"id": -counter , "version" : osm_version , "lat" : latitude, "lon": longitude , "tag": jtags} # counter = counter + 1; #print (str(latitude)+""+str(longitude)+""+street+" "+housenumber) print (deletenode) res = api.NodeDelete(deletenode) print(res) #number = 3122745503 #print(number) #editednode = {"id": 4303211109, "lat" : "59.6395566", "lon" : "11.3226128", "tag" : {"addr:housenumber": "47A", "addr:street":"Skramrudåsen", "addr:postcode": "1860","addr:city":"Trøgstad"} , "version" : 1} ##editednode = {"id": , "lat" : "59.6395566", "lon" : "11.3226128", "tag" : {"addr:housenumber": "47A", "addr:street":"Skramrudåsen", "addr:postcode": "1860","addr:city":"Trøgstad"}} #print(api.NodeGet("4303211109")) #import json #print(json.dumps(editednode)) #print(api.NodeUpdate(editednode)) #print(api.NodeCreate(editednode)) print(api.ChangesetClose()) db = mysql.connector.connect(host="localhost",user=mypasswords.sqldbuser,password=mypasswords.sql,database=mypasswords.sqldbname) cursor = db.cursor()